2009-06-01 27 views
6

我正試圖將兩個構建系統粘合在一起。兩者都是遞歸的(makefile中的規則使用make調用其他makefile來構建項目的組件)。如何忽略遞歸構建中的命令行變量賦值?

我會稱它們爲'A'和'B',其中'A'構建應用程序,'B'構建'A'使用的庫。

A中的頂層makefile調用'make TARGET = whatever',這意味着構建的所有遞歸調用位都將TARGET的值作爲只讀變量繼承,包括B的構建系統,它是稱爲遞歸構建的一部分。

我不希望在'B'(來自不同的項目)的構建系統中發生這種情況,因爲那裏的makefiles使用TARGET來實現自己的目的,並且構建失敗,因爲TARGET具有錯誤的值,並且只讀。

我只能看到兩個解決方案,這兩個解決方案都不是palettable;

1)將TARGET重命名爲A中的makefile中的其他內容,並將其設置在A中的makefile中,以避免與構建系統的較低級別發生衝突。

2)在設置了TARGET變量的B中的makefiles中的任何地方使用'override'指令覆蓋它的只讀狀態。

任何人有任何更好的想法? - 理想情況下,我想什麼通過從A在B的構建系統被繼承,但那些選擇我明確地傳遞到B構建系統從A

順便說一句,我使用的GNU讓V3.80。

+0

如果你不想在B的makefile中設置TARGET,那你爲什麼要在A的makefile中傳遞TARGET = any? – JesperE 2009-06-01 14:32:26

+0

A的頂級makefile將TARGET = whatever傳遞給A中的第二級makefile(需要它),然後A中的第二級makefile調用B的makefile,它將TARGET作爲只讀變量從二級製造。 – 2009-06-01 15:04:31

回答

0

也許你可以使用「unexport」指令來防止TARGET被傳播到B的makefile中?

3

您可以設置MAKEOVERRIDES來沒有在二級Makefile文件A.

callb: 
     cd subdir && $(MAKE) MAKEOVERRIDES= 

這個向下通過正常的命令行參數,如-k-s而不是命令行變量定義。

或者你使用歷史MFLAGS這是一樣的MAKEFLAGS除了MFLAGS不包含命令行變量定義。這個兩個選項

callb: 
    cd subdir && $(MAKE) $(MFLAGS) 

詳細信息可以在這裏讀到:The GNU Make Manual

0

在那裏構建系統A調用構建系統B點,不要直接使用「${MAKE}」;調用一個調用構建系統B的shell腳本(可能在清理環境之後)。

爲了實現其中命令由「make -n」執行的行爲,可以在前面與「+」生成文件的命令行(類似前綴與「@」或「-」的線)。

0

這聽起來像你已經修改了A makefile遞歸地調用B makefile,因此你的問題。爲什麼不引入一個新的頂層makefile,遞歸地調用B makefile,然後遞歸調用A makefile?例如,combined.mk:

all: 
    $(MAKE) -f Makefile.B 
    $(MAKE) -f Makefile.A 

這樣,B makefile從A makefile中不會繼承任何東西。