プロジェクトには次のディレクトリ構造があります。
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
'sがにある間、フォルダには'sinclude/
が含まれます。すべてのソースをにコンパイルしてから、それらをにリンクしたいと思います。私にとってはかなり合理的な願いのようです。*.hpp
*.cpp
src/
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 = ../../bin
Makefileのようなものは使いたくありません。