2016-06-17 64 views
0

我有一個基本目錄src和兩個子目錄src/foo和src/tests。在src/tests中,我有一個生成src/tests/tests.cpp的Makefile。我想這取決於SRC /富/ * O,其中我與我如何構建Makefiles,使其中的目標取決於另一個目標?

%.o : %.cpp 
    ${GCC} -c ${CXXFLAGS} $< -o [email protected] 
在SRC /富/ Makefile文件

編譯。有沒有一種很好的方法來將我的Makefiles包含在另一個或其他東西中?

換句話說,SRC /富/ Makefile中的樣子:

OBJECT_FILES += bar.o baz.o ... 

main: main.o ${OBJECT_FILES} 
    ${GCC} ${CXXFLAGS} main.o ${OBJECT_FILES} -o main 

%.o : %.cpp 
    ${GCC} -c ${CXXFLAGS} $< -o [email protected] 

,我想的src /測試/ Makefile中做這樣的事情:

# Obviously this is impossible right now since OBJECT_FILES is not defined in this Makefile. 
tests: tests.o ${OBJECT_FILES} 
    ${GCC} ${CXXFLAGS} tests.o ${OBJECT_FILES} -o tests 

tests.o: tests.cpp 
    ... 
+1

我會溝渠Makefiles並使用更好的構建系統。我個人更喜歡CMake,但也有其他人。 – Jens

+0

是的,'make'不會執行本地遞歸或整個項目範圍目標依賴項。除了'cmake'之外,還要檢查'scons'或更老的'cons'。 scons是本地遞歸的:它將整個項目視爲一個整體,並允許從任何地方到任何地方都有依賴關係。儘管在大多數情況下,你甚至不需要像現在那樣指定依賴關係:它可以自己發現它們。 – Dummy00001

回答

0

假設你正在使用GNU做,你可以使用假目標。

.PHONY: foo_objets 

foo_objects: 
    $(MAKE) -C ../../src/foo 

並定義foo_objects作爲test的依賴性。

tests: tests.o ${OBJECT_FILES} foo_objects 
    ${GCC} ${CXXFLAGS} tests.o ${OBJECT_FILES} -o tests 
+0

.PHONY目標消除了依賴性檢查,這比無法構建更好,但並不理想。此外,不要通過鍵入「make」來執行遞歸make。總是使用'$(MAKE)',否則就會失去併發控制。 –

1

爲單個項目組合兩個自包含的make文件很困難,實際上並不推薦。請閱讀Recursive Make Considered Harmful以獲得更完整的解釋。請注意,這僅適用於遞歸調用make,並且僅在項目的不同部分具有相互依賴性時才適用。

問題是,當你放棄遞歸選項時,其他選項不是很好。最明顯的將是include你的src makefile從你的tests目錄。然而,這不起作用,因爲src makefile對當前目錄隱含假設,當您位於tests目錄中時,該假設不成立。

您最好的選擇是在項目的根目錄下創建一個make文件,該文件同時生成srctests。這會使依賴規範變得微不足道。

雖然在我看來,你的項目需求是他們可以得到的標準。即使您編譯的模式規則只是make中內置的模式規則的簡化版本(即 - 您可以從make文件中刪除它,並且所有內容都將繼續工作)。在這種情況下,試圖重新發明輪子對我來說似乎沒有必要。

我推薦使用標準構建生成工具之一。 automake是我的最愛,因爲它是普遍可用的,並且在編譯機器上不需要特殊工具。它的學習曲線比其他項目的學習曲線稍微陡峭些,特別是對於簡單的項目,但是學習它的工具對於不使用它的項目也很有用。

然後,由於上述原因,有些人討厭復仇的汽車工具。給他自己的。

相關問題