2013-05-10 85 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添加到他们的先决条件中。