2013-02-11 61 views
0

下面是我現在的'解決'我的問題。我認爲make應該會在另一個目錄中沒有找到依賴規則時自動執行此操作,但我無法弄清楚爲什麼我會這麼想。你知道更好的方法嗎?打電話在另一個目錄

還有另一個目錄../a/它有一個Makefile來創建../a/generated.h

.PHONY: FORCE 

FORCE: 

my.c: ../a/generated.h 
    cp --preserve=timestamps $< [email protected] 

../a/generated.h: FORCE 
    $(MAKE) -C $(dir [email protected]) $(notdir [email protected]) 

我有一個一般的形式,我可以使用,以避免重複每一個「外部」文件第二條規則,但正如我所說,我認爲這是所有不必要的。化妝的

define REMOTE 
$(1): FORCE 
    $$(MAKE) -C $$(dir [email protected]) $$(notdir [email protected]) 
endef 

$(eval $(call REMOTE,../a/generated.h)) 
$(eval $(call REMOTE,../a/anotherGeneratedFile.h)) 
+0

這看起來不是很好的設計。你有許多其他的目錄和自己的makefile文件嗎? – Beta 2013-02-11 20:19:48

+0

這似乎是我誤解了make會自動重建包含在'Makefile'中的任何文件。 – altendky 2013-02-12 14:14:09

回答

1

遞歸調用已知突破目標相關性,這可能是你意想不到的行爲的原因的向無環圖(DAG)。

針對您的問題的一種可能的解決方案可能是針對您的項目使用單個Makefile,如"Recursive Make Considered Harmful"中所建議的。否則,你可能會「提升」你的構建系統的抽象級別,並轉移到像cmake這樣的工具。

+0

一個很好的閱讀,它會(大概)提高我對Make的使用,甚至可能解決我的根本困境。謝謝。 – altendky 2013-02-12 14:15:47

0

我以爲make應該會自動執行此操作,當在另一個目錄中找不到依賴的規則時,我無法弄清楚爲什麼我會這麼想。

GNU Make沒有這樣的內置規則。查看Catalogue of Implicit Rules中的所有內置規則。

您的解決方案應該工作在中途。它沒有../a/generated.h的依賴關係(因爲您正在使用遞歸make,並且這些依賴關係僅對該目錄中的makefile已知),所以它不會自動重建它。但如果它不存在,它將生成../a/generated.h

+0

由於它在任何時候都明確地調用其他目錄中的make(注意FORCE語言),我相信它會「起作用」。只是它會在Massimiliano的鏈接論文中列出分離的DAG的額外開銷和所有成本。 – altendky 2013-02-12 14:13:31

+0

確實如此,除非有一個名爲'FORCE'的文件。 'FORCE'應該是一個假目標。 – 2013-02-12 14:22:08

+0

這是我對這個問題的簡化不準確。糾正。 – altendky 2013-02-12 15:05:41

相關問題