相互に使用するライブラリがいくつかあります。それらのいずれかをビルドするときはいつでも、適切な可視性修飾子が使用されていることを確認するために、プリプロセッサの定義を定義する必要があります (たとえば、windows speak の dllimport/dllexport)。
すべてのライブラリは同じメイクファイルを使用します。つまり、ルールや CFLAGS などを共有します。これらのライブラリはすべて、入力ファイルのリストのみが異なり、残りのメイクファイルはライブラリによって共有されます。
共有メイクファイルには、次のように、すべてのライブラリのリストを含む変数があります。
MODULE_LIBS = liba123 libb456 libc999
次に、これらのライブラリごとにこれらのプリプロセッサ定義を有効にする必要があります。
For liba123: -Da123_EXPORTS
For libb456: -Db456_EXPORTS
For libc999: -Dc999_EXPORTS
これらのライブラリのそれぞれは、ライブラリ自体のような名前のそれぞれのサブフォルダーに存在します (例: liba123、libb456 など)。そこで、コンパイル中のファイルのパスに基づいてこれらの EXPORTS 定義を有効にするために、この makefile トリックを書きました。
%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -D$(filter $(MODULE_LIBS),$(subst lib, ,$(subst /, ,$@)))_EXPORTS -c - o $@ $<
似たようなルールがたくさんあるので、 ('-D$(filter $(MODULE_LIBS),$(subst lib, ,$(subst /, ,$@)))_EXPORTS') をあちこちに追加する必要があります。これらすべての異なるルールでできることは何もありませんが、1 つの共通点があります: $(CPPFLAGS) です。
ここで質問です。「-D$(filter $(MODULE_LIBS),$(subst lib, ,$(subst /, ,$@)))_EXPORTS」をCPPFLAGSに追加して、これらすべてのmakefile変数がその場でのみ展開されるようにすることはできますか?どこで使われていますか?