[英]GNU Makefile dependency in multi-job make
我在Linux下有一個C ++項目。 我正在使用GNU make和GCC
我有以下規則:
all: ...
version:
config:
rm -f config.h
@$(MAKE) --no-print-directory config.h
config.h:
# ..... create the file config.h here
使版本增加內部版本號。 1.1-123,然后是1.2-124 ...等。版本寫在config.h文件中,並且config.h包含在項目中的所有文件中。
現在的想法是在以下情況之一中重新構建config.h:-發布程序版本時(而不只是開發/測試時)-不存在時
所以我不想依賴:
all: config
config: version
因為這樣,將在每個make上重建配置文件,並且每個單個文件都將被重新編譯,而不僅僅是更改的文件。 因此,我不想在開發時不重新構建配置文件,而僅當我現在make release_version
。 可以說規則是:
release_version: config version all
問題是當我make release_version -j 3
它將同時創建所有3個目標(config,version,all),這意味着該版本可能尚未准備好創建config.h,然后是config.h。可能還沒有為all
做好准備。 因此,我必須建立這種依賴性:
release_version:全部全部:config config:版本
但是僅當執行make release_version
時。 如果make all
被執行,我不想擁有這些依賴關系。
也許我需要這樣的東西:
release_version:version_release config_release all_release
all_release:配置config_release:配置版本_release:版本
您的示例有些雜亂無章。 如果您重新閱讀所擁有的內容並加以澄清,那將是很好的。 version
目標有什么作用? version
和config
之間是什么關系? 您不會在任何地方顯示的release_version
與config
和version
之間有什么關系?
如果我理解正確,那么您將擁有將使用config.h
的現有版本(如果不存在則創建代碼)來構建代碼的all
規則,以及將更新config.h
的release_version
規則,然后構建代碼好像都是all
。 我不確定使用哪個version
和config
。
您可以這樣做,除非我遺漏了一些東西:
all: ...
release_version:
@rm -f config.h
@$(MAKE) config.h
@$(MAKE) all
config.h:
...create config.h...
.PHONY: all release_version
還有很多其他選擇。
使用GNU-make,您可以使用僅訂購的先決條件來強制以特定順序運行規則,如果其他條件不需要它們,則不強制它們運行:
all: ...other targets... | config
...actions...
release_version: config version all
現在,如果make all
,它將僅在|
之前重建其他目標|
。 如果出於其他原因需要config
,它將在運行...actions...
之前等待它完成。
這可能還不夠,因為那些其他目標可能在config
之前運行。 如果需要它們等到config
之后,則需要添加| config
還要| config
其先決條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.