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)。無論如何。過去我已經使用這個解決方案來處理小型項目,但對於當前的解決方案,這是不可接受的。
爲什麼要打擾「if .. -q ...」?如果問題的答案是「運行真正的品牌」,那麼您應該始終運行它......結果將是相同的,只運行一次而不是兩次就會快很多。 – MadScientist
@MadScientist獲取「做它更新」的信息。它可以通過手動時間戳檢查或通過在「Subfolder/lib.a」上保留先決條件來避免,並相信make會正確檢測到它(但我不知道這實際上是一個有效的計數在檢查時間戳時進行比賽等)。但是事實並非如此,我並沒有想到子製造變得緩慢。如果速度不是很快,那麼手動時間戳檢查每次都會贏得一英里。 –
其實我不明白這個問題。爲什麼不直接讓最上面的makefile依賴Subfolder/lib.a,並使用FORCE規則來確保它已被嘗試?如果庫是最新的,則子庫不會更改庫的時間戳,所以頂級庫不會重新生成。 – MadScientist