次のことを行うメイクファイルを作成しようとしています。
- srcディレクトリからソース ファイルを取得します
- オブジェクトファイルをobjディレクトリに置きます
- バイナリ ファイルをbinディレクトリに配置します。
- relディレクトリにリリース ターゲットを置きます
- dbgディレクトリにデバッグ ターゲットを置きます
私が抱えている最初の問題は、ターゲット固有の変数がここで機能していないように見えることです:
# Build Directories
src_dir=src
obj_dir=obj
bin_dir=bin
cc=cl
cc_flags=
# create the directory for the current target.
dir_guard=@mkdir -p $(@D)
# source files
src = MainTest.cpp
# object files - replace .cpp on source files with .o and add the temp directory prefix
obj = $(addprefix $(obj_dir)/$(cfg_dir)/, $(addsuffix .obj, $(basename $(src))))
release: cfg_dir = rel
release: executable
debug: cfg_dir = dbg
debug: cc_flags += -Yd -ZI
debug: executable
executable: $(bin_dir)/$(cfg_dir)/MainTest.exe
# build TwoDee.exe from all of the object files.
$(bin_dir)/$(cfg_dir)/MainTest.exe : $(obj)
$(dir_guard)
$(cc) -out:$@ $(obj) -link
# build all of the object files in the temp directory from their corresponding cpp files.
$(obj_dir)/$(cfg_dir)/%.obj : $(source_dir)/%.cpp
$(dir_guard)
$(cc) $(cc_flags) -Fo$(obj_dir)/$(cfg_dir) -c $<
make debug を実行すると、次のようになります。
make: *** No rule to make target `obj//MainTest.obj', needed by `bin//MainTest.exe'.
デバッグ変数とリリース変数を削除し、cfg_dir を relにハードコードすると、次のようになるため、他にも問題があります。
make: *** No rule to make target `obj/rel/MainTest.obj', needed by `bin/rel/MainTest.exe'. Stop.
したがって、私のオブジェクト ルールも間違っているに違いありません。私はファイルを作成するのが初めてなので、誰かが間違っている他のものを見たら、コメントを歓迎します.