makeとautotools (このプロジェクトではまだ使用していません)に関する私の知識は、長期間にわたる多くのグーグルと実験にもかかわらず、せいぜい初歩的なものです。私は以下のようなソース階層を持っており、可能な限りシームレスに構築する方法を見つけようとしています。
アプリケーションは、app/srcの下のさまざまなサブフォルダーにソースを持つメインアプリケーションで構成されています。これらは、そのフォルダーのルートにあるそれぞれのMakefileを使用して構築されます。
次に、それぞれが独自のMakefileを持つapp/toolsの下の異なるフォルダーに常駐する他の複数のユーティリティがあります。
app/src/module1/file1.cpp
app/src/module1/file1.hpp
app/src/module2/file2.cpp
app/src/module2/file2.hpp
app/src/module3/file3.cpp
app/src/module3/file3.hpp
app/src/main.cpp
app/src/main.hpp
app/src/Makefile
app/tools/util1/file1.cpp
app/tools/util1/file1.hpp
app/tools/util1/Makefile
app/tools/util2/file2.cpp
app/tools/util2/file2.hpp
app/tools/util2/Makefile
私にとっての問題は、これらのツールの一部がapp / srcソースフォルダー内のソースファイルに依存しているが、前処理マクロEXTERNAL_TOOLが有効になっていることです。そのため、メインアプリとさまざまなユーティリティのコンパイルから生成されたオブジェクトファイルには互換性がありません。
現在、プロジェクトの各部分をビルドするには、その間にあるソースツリーをクリーンアップする必要があります。これは苦痛であり、確かに私が最終的に望んでいることではありません。これを解決するための最善の方法は何でしょうか?私が実践できなかったアイデアは次のとおりです。
- プロジェクトの各部分に個別のビルドディレクトリ
- 外部ツールを構築するとき、メインアプリのソースツリーでオブジェクトファイルに何らかの方法でタグを付けます(util.file1.o?)
make/autotoolsをマスターするのに必要な時間と忍耐力があるかどうかはわかりません。他のビルドツール(scons?cmake?)の1つで、この種のタスクを簡単に実行できるでしょうか?もしそうなら、どれですか?
更新:これは私が今持っているものです
SOURCES := util1.cpp util2.cpp util3.cpp \
../../src/module1/file1.cpp \
../../src/module1/file2.cpp \
../../src/module1/file3.cpp \
../../src/module2/file4.cpp \
../../src/module3/file5.cpp \
../../src/module3/file6.cpp \
../../src/module4/file7.cpp \
../../src/module4/file8.cpp \
../../src/module3/file9.cpp \
../../src/module4/file10.cpp \
../../src/module5/file11.cpp \
../../src/module3/file12.cpp \
../../src/module1/file13.cpp \
../../src/module3/file14.cpp \
../../src/module3/file15.cpp
OBJECTS = $(join $(addsuffix .util/, $(dir $(SOURCES))), $(notdir $(SOURCES:.cpp=.o)))
.PHONY: all mkdir
all: util
util: $(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) $(LIBS) -o util
$(OBJECTS): | mkdir
$(CXX) -c $(CXXFLAGS) -o $@ $(patsubst %.o,%.cpp,$(subst .util/,,$@))
mkdir:
@mkdir -p $(sort $(dir $(OBJECTS)))
clean:
-@rm -f $(OBJECTS) util
-@rmdir $(sort $(dir $(OBJECTS))) 2>/dev/null
私はこれを大規模なグーグルSOブラウジングの後に思いついた。これは機能しているように見えますが、この部分は特に良いとは思えません(ちょっとしたハックのように感じます):
$(OBJECTS): | mkdir
$(CXX) -c $(CXXFLAGS) -o $@ $(patsubst %.o,%.cpp,$(subst .util/,,$@))
特に、以前にソースからオブジェクトのリストを作成し、接尾辞を追加しているという事実にはあまり熱心ではありませんが、ここでは逆のことをしているだけです。私はそれを他の方法で機能させることができなかったようです。