2014-09-25 82 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