簡體   English   中英

多作業make中的GNU Makefile依賴性

[英]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目標有什么作用? versionconfig之間是什么關系? 您不會在任何地方顯示的release_versionconfigversion之間有什么關系?

如果我理解正確,那么您將擁有將使用config.h的現有版本(如果不存在則創建代碼)來構建代碼的all規則,以及將更新config.hrelease_version規則,然后構建代碼好像都是all 我不確定使用哪個versionconfig

您可以這樣做,除非我遺漏了一些東西:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM