多作业make中的GNU Makefile依赖

时间:2013-05-10 16:12:29

标签: linux gcc makefile gnu-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

make version增加内部版本号。 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:全部 all:config config:version

执行make release_version

但仅。如果make all被执行,我不想拥有这些依赖项。

也许我需要类似的东西:

release_version:version_release config_release all_release

all_release:config config_release:config version_release:version

2 个答案:

答案 0 :(得分:1)

你的例子有点杂乱无章。如果你重读你所拥有的东西并澄清它会很好。 version目标有什么作用? versionconfig之间的关系是什么?您未在任何地方显示的release_versionconfigversion之间的关系是什么?

如果我理解正确,您希望拥有all规则,该规则将使用现有版本的config.h构建代码(如果它不存在则创建它),以及{{1}将更新release_version的规则,然后像config.h一样构建代码。我不确定allversion是做什么的。

你可以这样做,除非我遗漏了一些东西:

config

还有很多其他选择。

答案 1 :(得分:0)

使用GNU-make,您可以使用仅限订单的先决条件来强制规则以特定顺序运行,如果其他内容不需要它们,则强制它们运行:

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

release_version: config version all

现在,如果您执行make all,它只会在|之前重建其他目标。如果由于其他原因需要config,则会在运行...actions...之前等待它完成。

这可能还不够,因为其他目标可能会在config之前运行。如果您需要他们等到config之后,您还需要将| config添加到他们的先决条件中。