2011-04-05 59 views
2

我有一個項目模塊劃分,在目錄中的每個託管,說:與GNU大廈層​​次的Makefile讓

root 
|_module_A 
|_module.cpp 
|_Makefile 
|_module_B 
|_Makefile 
|_main.c 
|_Makefile 

的main.c取決於與module_Amodule_B在Makefile文件中定義的目標。

我想寫我的root/Makefile相對於兩個模塊的Makefiles中定義的目標。現在

,我知道我可以使用include指令,但這裏的問題是,在module_Amodule_B目標和文件名不符合他們的目錄前綴,所以我得到的是這樣的:

make: *** No rule to make target `module.o', needed by `main.c'. Stop. 

有一個很好的方法來解決這個問題?

謝謝。

+0

你想去哪兒把目標文件(例如'module.o')? – Beta 2011-04-05 12:14:55

+0

在相對源文件的相同(子)目錄中。 – akappa 2011-04-05 14:23:45

回答

2

有幾種方法可以做到這一點,但都不是完美的。基本問題在於,Make擅長使用那裏的來製作東西這裏的,但不是相反。

您還沒有說過module_B中的目標是什麼;我會悲觀的,並假設module_Amodule_B都有目標module(不同的源文件,不同的食譜),所以你真的不能使用include

你必須做出最大的選擇是,是否使用遞歸make:

如果你不這樣做,那麼root/Makefile必須知道如何建立module_A/modulemodule_B/module,所以你只需把這些規則。然後,你必須在子目錄makefile中保留冗餘規則(並且冒着與主makefile不一致的風險),或者消除它們,或讓它們遞歸地調用master makefile(你不會必須經常做,但它肯定會看起來很傻)。

如果你這樣做,那麼root/Makefile會是這個樣子:

main: main.o module_A/module.o Module_B/module.o 
    ... 

main.o: main.c 
    ... 

%/module.o: 
    $(MAKE) -C $(@D) $(@F) 

這將工作做得不夠好,但它會一無所知子目錄內的相關性,因此有時會無法重建的對象,已過期。您可以每次預先遞增make clean(只是爲了安全起見,粗略而有效)。或者強制執行%/module.o規則,這個規則不那麼浪費,但更復雜一點。或者複製root/Makefile中的依賴信息,這是單調乏味的。

這只是您優先考慮的問題。

+0

好,徹底的答案,如果你必須使用遞歸make,雖然我會說在通常情況下這是一個壞主意。 – 2011-04-08 07:15:13

+0

我真的希望有一個很好的解決方案。 – 2014-03-26 14:18:43

1

難道你不能以非遞歸方式編寫makefile嗎?

Recursive Make Considered Harmful

+0

我可以,但是我已經用它們的Makefile繼承了所有這些模塊,並且由於我很懶,我希望儘可能地重用它們.Makepp有一個很棒的工具(load_makefile),它將所有定義加載到Makefile中放置在給定的子目錄中,將子目錄前置到在那裏定義的目標。我想知道是否有辦法在Makefile中執行類似的操作,而不是複製各種Makefile中的所有目標,並手動添加子目錄。 – akappa 2011-04-08 14:40:17

+1

@akappa,簡短的回答:是的,但它不可靠。一個簡短的'sed'腳本可以將目錄名添加到目標文件中,但是如果makefile在任何地方都使用相對路徑(並且makefile有很多種方法可以這樣做),腳本將無法更正它們。 – Beta 2011-04-09 13:34:55

+0

@Beta:謝謝,我想我會寫一個Makefile,畢竟它更容易(而且更簡潔) – akappa 2011-04-10 21:21:47