メイクファイルにファイルが存在するかどうかを確認する方法
-
05-07-2019 - |
質問
単一のDLLをコンパイルするためのmakefileテンプレートがあります(プラグインシステム用)。 ユーザーのメイクファイルは次のようになります。
EXTRA_SRCS=file1 file2
include makefile.in
makefile.in
にあるもの:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
plugin.os
は、コンパイルするメインC ++ファイルです。ところで、末尾が.os
のファイルは、共有ライブラリ用にコンパイルされたオブジェクトファイルです(つまり、-fpic
でgcc
オプションを使用)
今、問題は余分なソースがおそらく(必ずしもそうではないが)ヘッダーファイルになることです。理想的には、ターゲットfile.cpp
および<=>の依存関係として追加しますが、それらが存在する場合のみです。
この方法は、WindowsとLinuxの両方で機能するか、少なくともそれぞれに適応する必要があります。ただし、GNUバージョンのmakeのみを使用しています。
解決
<!> quot; wildcard <!> quot;を使用します。関数:
$(wildcard *.h)
編集:特定のリストに一致させるには、
$(wildcard $(HEADER_FILES))
$(filter ...)を使用する必要はありません。ワイルドカード機能は、存在しないファイルを自動的にフィルタリングします。
他のヒント
使用しているコンパイラを指定しませんでしたが、gcc / g ++にアクセスできる場合は、-MMオプションを使用できます。
.cまたは.cppファイルごとに、拡張子が.dのファイルを作成し、<!> quot; include <!> quot;を作成します。 .dファイル。 Makefileで次のようなものを使用します。
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
次に、次のような依存関係を作成します。
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
そしてこれはMakefileの下部にあります:
include $(DEPS)
これはあなたが行っている種類の行動ですか?この方法の利点は、実際のコンパイルに非GNUコンパイラを使用している場合でも、GNUコンパイラが依存関係の計算を適切に行うことです。
単純な処理を行います
$(filter $(wildcard *.h),$(HEADER_FILES))
あなたがしたいことをしますか?