2014-01-09 68 views
0

鑑於這個Makefile片斷:遞歸的Makefile:要運行假目標,然後運行的所有目標

TARGETS =  ${SHARED_LIB_A} ${SHARED_LIB_B} 

.PHONY: subdirs $(SUBDIRS) 

subdirs: $(SUBDIRS) 

$(SUBDIRS): 
    $(MAKE) -C [email protected] 

all: $(TARGETS) 

我想修改這個Makefile以便得到具體目標建立的假目標運行後。 IE瀏覽器。目標取決於正在構建的SUBDIRS中的代碼 - 目標需要在SUBDIRS之後運行。目前,這種方式的工作方式是PHONY目標運行(子目錄被創建),但不是全部目標(除非我特別像'make all'那樣運行它 - 但我想盡可能避免這樣做,我只想要運行'make'並讓它建立子目錄,然後構建TARGETS。

回答

1

首先,你應該有all作爲第一條規則,而不是最後一條除非你在make命令行上指定了一個特定的目標,在生成文件(在這裏,subdirs)上運行的第一個目標

其次,你應該申報subdirs作爲$(TARGETS)的先決條件;這將確保他們不建,直到後subdirs完成:

all: $(TARGETS) 

$(TARGETS): subdirs 

現在,因爲subdirs是假就意味着$(TARGETS)總是被認爲是過時的,總是建立,即使調用subdirs沒有改變任何文件。但是,因爲make不知道要使用哪些文件(由子文件創建)來查看庫是否過期,所以在這裏編寫makefile時沒有其他選擇。

或者你可以指定subdirs就是命令,唯一的先決條件:

$(TARGETS): | subdirs 
+0

啊,是的,這似乎做我想做的。謝謝。在這種情況下,如果在子目錄中沒有更改文件,我不會太在意。 – aneccodeal