NMAKEを使用して変数にワイルドカードを割り当てることはできますか?[複製]

Dec 17 2020

私はUNIXのバックグラウンドを持っているので、GNU / Makeで次のようなことができることに慣れています。

SRC=$(wildcard src/*.c) OBJ=$(SRC:.c=.o)

all: $(OBJ)
    ...

MicrosoftNMAKEで達成するのとほぼ同等の何かがあるかどうか疑問に思います。私は次の簡単なNMAKEMakefileを持っています:

all: obj\a.obj obj\b.obj obj\c.obj 

{src\}.c{obj\}.obj:
    cl /c $** /Fo$@

これは正常に機能します。からすべてのソースファイルsrc/を取得し、それらをobj/。の同等のものにコンパイルします。ただし、obj/*.objすべてのオブジェクトファイルを手動で書き出す必要がないように、デフォルトのターゲットをワイルドカードのように圧縮したいと思います。

これはNMAKEで可能ですか?私はNMAKEのドキュメントをかなり徹底的にチェックしましたが、私がやりたいことのようなことは何も説明していないようです。

更新

この質問に対する受け入れられた解決策を参照として使用し、次のMakefileを使用して、希望する効果を得ることができました。

.SUFFIXES: .c .obj

obj_files=$(**:.c=.obj)
all: src\*.c
    @$(MAKE) $(obj_files:src=obj)

{src\}.c{obj\}.obj:
    cl /c $< /Fo$@

これは、obj\サブフォルダーを出力ディレクトリとして使用して機能します。$**マクロは内消費されるall対象。

回答

1 wistful Dec 18 2020 at 01:48

サブフォルダー.c内のすべてのファイルをワイルドカード化し、次のMakefileを使用してsrc\それらをコンパイルしてサブフォルダーに.obj出力しましたobj\

.SUFFIXES: .c .obj

obj_files=$(**:.c=.obj) all: src\*.c @$(MAKE) $(obj_files:src=obj) {src\}.c{obj\}.obj: cl /c $< /Fo$@

obj_filesディレクトリ名とファイルサフィックスを変更するために二重文字列置換を行う必要があるため、$**マクロ(allターゲットで展開されます)で定義する必要があります。これまでのところ、私が見つけたすべてのリソースは、単一の文字列置換を行う方法を指定しているだけです。