4

次のことを行うメイクファイルを作成しようとしています。

  • 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.

したがって、私のオブジェクト ルールも間違っているに違いありません。私はファイルを作成するのが初めてなので、誰かが間違っている他のものを見たら、コメントを歓迎します.

4

1 に答える 1

4

ターゲット固有の変数は、ルールではなく、レシピでのみ使用できます。これは、ルールが Makefile の読み取り時に解析され、そこから依存関係が推定されるためです。

の複数の可能な値に合わせてルールを調整するには、GNU Make マニュアルのevalcfg_dirセクションの例を参照することをお勧めします。これは、次のようなことを説明しています。

release: $(bin_dir)/rel/MainTest.exe

debug: cc_flags += -Yd -ZI
debug: $(bin_dir)/dbg/MainTest.exe

define template =

# 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): $(obj_dir)/$(cfg_dir)/%.obj : $$(src_dir)/%.cpp
    $$(dir_guard)
    $$(cc) $$(cc_flags) -Fo$(obj_dir)/$(cfg_dir) -c $$<

endef
$(foreach cfg_dir,rel dbg,$(eval $(template)))
于 2012-07-04T14:57:01.513 に答える