2014-09-25 80 views
1

我的應用程序makefile有一些版本變量,我希望我的makefile使用它來生成version.h文件。目前,我有共同的生成文件設置,如:使用makefile生成版本信息

version : 
    @echo "Generating version.h ..." 
    @echo line > version.h 
    @echo etc >> version.h 

debug : blah blah version blah blah 
release : blah blah version blah blah 

.DEFAULT_GOAL := debug release 

當應用程序的makefile是:

MAJOR_VERSION = 1 
MINOR_VERSION = 42 

include makefile.common 

這工作,但最終產生的版本文件的兩倍。我怎樣才能讓它只生成一次 - 這樣version在某種程度上取決於應用程序級別的makefile更改。這不是生成兩次是不可忍受的緩慢,我只是想正確地做到這一點。

另外,我可能有一個不想要版本信息的應用程序,我如何有條件地生成此文件?

回答

2

在我看來,它在總體上是好的取決於有意義的食譜所有目標,在所有包含的Makefile,因爲很難通常要查看哪些makefile(甚至包括晚於配方的文件)可能包含影響配方的變量。

考慮到這一點,這裏是回答您的兩個問題(我還添加了一些其他的「最佳做法」,因爲你要學「正道」):

的Makefile:

MAJOR_VERSION := 1 
MINOR_VERSION := 42 

include makefile.common 

makefile.common:

.PHONY: all debug release 
all: debug release 

VERSION_FILE := $(if $(filter %OR_VERSION, $(.VARIABLES)), version.h) 
debug : blah blah $(VERSION_FILE) blah blah 
release : blah blah $(VERSION_FILE) blah blah 

.SECONDEXPANSION: 
version.h : $$(MAKEFILE_LIST) 
    @echo "Generating [email protected] ..." 
    @echo line > [email protected] 
    @echo etc >> [email protected] 
+0

爲什麼選擇SECONDEXPANSION? – Barry 2014-09-26 13:57:40

+0

@Barry使得$$(MAKEFILE_LIST)不僅對當前包含的makefile進行評估,而且還包括_all_ makefiles,甚至之後。這是必要的,因爲配方中的一些變量值可能取決於它下面的代碼。 – 2014-09-26 17:23:29

+0

如果我想過濾掉%.d的話怎麼辦?我$(過濾%.d,$(MAKEFILE_LIST))的作品,但我無法找出一種方法,在.SECONDEXPANSION ...上工作,除了再次相同。 – Barry 2014-09-26 17:59:03

1

您希望您的make目標是文件,是這樣的:

version.h : 
    @echo "Generating version.h ..." 
    @echo line > version.h 
    @echo etc >> version.h 

debug : blah blah version.h blah blah 
release : blah blah version.h blah blah 
+0

如果我這樣做,那麼如果我是更新的makefile改版本變量,version.h中不會得到重修。有沒有辦法強制這種依賴?儘管如此,這仍然比我現在的要好。 – Barry 2014-09-25 16:00:03

+0

要使version.h依賴於版本變量,以便它們在更改時得到重建,您需要明確地根據文件表示: 「version.h:Makefile」 – 2014-09-25 18:42:34