2015-01-09 96 views
4
ProjFolder 
\ 
    Subfolder 
    sources.cpp 
    makefile 
makefile 

Subfolder應該是一個單獨的外部回購,在檢出項目時拉入。當我打電話make all到頂層Makefile,下面的食譜得到執行:Gnu Make:如何處理子項目

all: $(NAME).elf $(NAME).s19 $(NAME).hex 

$(NAME).elf: $(OBJECTS) $(LDSCRIPT) Subfolder/lib.a 
    make -C CppAudioPeriphs all 
    @ echo "...linking" 
    $(CC) $(OBJECTS) Subfolder/lib.a $(LDFLAGS) $(LIBS) -o [email protected] 

正如你可以看到,如果Subfolder最終產品 - 文件lib.a改變時,Subfolder makefile文件被調用,以重製它,然後所有產品都鏈接到最終的Flash映像中。

問題是訂單。 我想總是先調用子makefile。它知道何時以及如何重拍lib.a。然後檢查是否修改了lib.a以確定是否重製$(NAME).elf。


這是一個解決方案。

.PHONY all $(NAME).elf 

這只是指示make重拍$(NAME)。無論如何。過去我已經使用這個解決方案來處理小型項目,但對於當前的解決方案,這是不可接受的。

回答

2

正如MadScientist指出(誰更好)我錯過了明顯的解決這個問題。

解決的辦法是對FORCESubfolder/lib.a的目標總是嘗試。並且只要Subfolder生成文件只在更新lib.a時發生了某些更改,其餘部分將會正確退出。

所以你想爲你的Subfolder/lib.a目標以下。其餘的可以保持原樣。如前所述,這裏的技巧是,您可以強制make運行Subfolder/lib.a目標本身,但如果Subfolder/lib.a,文件的時間戳未更改,那麼將Subfolder/lib.a作爲先決條件列出的內容不需要重新構建。

FORCE: ; 

Subfolder/lib.a: FORCE 
     $(MAKE) -C $(@D) target-to-build-lib.a* 
+0

爲什麼要打擾「if .. -q ...」?如果問題的答案是「運行真正的品牌」,那麼您應該始終運行它......結果將是相同的,只運行一次而不是兩次就會快很多。 – MadScientist

+0

@MadScientist獲取「做它更新」的信息。它可以通過手動時間戳檢查或通過在「Subfolder/lib.a」上保留先決條件來避免,並相信make會正確檢測到它(但我不知道這實際上是一個有效的計數在檢查時間戳時進行比賽等)。但是事實並非如此,我並沒有想到子製造變得緩慢。如果速度不是很快,那麼手動時間戳檢查每次都會贏得一英里。 –

+1

其實我不明白這個問題。爲什麼不直接讓最上面的makefile依賴Subfolder/lib.a,並使用FORCE規則來確保它已被嘗試?如果庫是最新的,則子庫不會更改庫的時間戳,所以頂級庫不會重新生成。 – MadScientist