2013-05-10 87 views
0

我有linux下一個C++項目。我使用GNU製作和GCC在多任務GNU的Makefile依賴使

我有以下規則:

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 release_version 現在。讓我們說,規則是:

release_version: config version all 

的問題是,當我做make release_version -j 3它會在同一時間,這意味着該版本可能沒有準備好創造讓所有的3個目標(配置版本,全) config.h,那麼config.h可能沒有準備好用於all。所以,我必須做出這種依賴性:

release_version:所有 所有:配置 配置:版本

但當執行make release_version ONLY。如果make all被執行,我不想有這些依賴關係。

也許我需要這樣的東西:

release_version:version_release config_release all_release

all_release:配置 config_release:配置 version_release:版本

回答

1

你的例子是有點雜亂無章。如果你重新閱讀你的內容並澄清它,這將是一件好事。 version目標是做什麼的? versionconfig之間有什麼關係?這個release_version哪裏不顯示任何地方,和configversion之間有什麼關係?

如果我理解正確的話,你想擁有all規則將使用的config.h現有版本構建代碼(創建它,如果它不存在),以及release_version規則將更新config.h,然後生成代碼就好像它是all。我不確定versionconfig是做什麼的。

你可以像這樣做,除非我失去了一些東西:

all: ... 

release_version: 
     @rm -f config.h 
     @$(MAKE) config.h 
     @$(MAKE) all 

config.h: 
     ...create config.h... 

.PHONY: all release_version 

有很多其他選擇。

0

隨着GNU-讓你可以使用一個命令,唯一的前提強制規定在一個特定的順序來運行withou迫使他們如果被別的東西是不需要的運行:

all: ...other targets... | config 
     ...actions... 

release_version: config version all 

現在,如果你做一個make all它只會重建|之前的其他目標。如果config由於某些其他原因需要,它將在運行...actions...之前等待它完成。

這可能還不夠,因爲其他目標可能會在config之前運行。如果您需要他們等到config之後,則還需要將| config添加到他們的先決條件中。