プロジェクトには次のディレクトリ構造があります。
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
'sがにある間、フォルダには'sinclude/が含まれます。すべてのソースをにコンパイルしてから、それらをにリンクしたいと思います。私にとってはかなり合理的な願いのようです。*.hpp*.cppsrc/bin/dist/
この場合のMakefileのベストプラクティスを知りたいです。私が見つけることができるのは%.o: %.cppターゲットだけですが、ソースとバイナリフォルダーが異なるため、実際には機能しません。
私はこのようなものを使おうとしていました:
D_SRC = src
D_BIN=bin
F_CPP := $(shell find $(D_SRC) -iname '*.cpp' -type f)
F_OBJ := $(shell echo $(F_CPP) | sed s:\ :\\n:g | sed s:$(D_SRC):$(D_BIN): | sed 's:^\(.*\)\.cpp$$:\1\.o:')
$(F_OBJ): $(F_SRC)
$(foreach file, $(F_SRC), \
$(GXX) $(CXXFLAGS) -c $(file)\
)
$(F_OBJ)パスは。で始まり、bin/ソースforeachを現在の作業ディレクトリにコンパイルするため、このターゲットは機能しません。にコンパイルすることもできますがbin/、それはさらにいくつかの式でのみ発生し、sedそのままでは醜いです。
よくわからないので難しいかもしれませんmakeが、このプロジェクトを立ち上げたのは私だけではありません。私の意見では、それはかなり一般的なものでなければなりません。Makefileモジュールごとに個別にを書くことができることは知っていますが、それは本当にここでの最良の選択ですか?
編集:私は今、いくつかのMakefileで何を達成できるのか疑問に思っていました。1つがルートにあり、もう1つがにある場合src/module_a、後者はどのようにしてbin/?を使用して実行する場合はmake -f src/module_a/Makefile、ルートディレクトリから実行するのと同じになります。これは、作業ディレクトリがルートになるためです。別の方法は、次のように、実行する前にディレクトリを変更することだと思いますmake -C include/module_a。しかし、その場合、どのように見つけるのでしょうbin/か。D_BIN = ../../binMakefileのようなものは使いたくありません。