0

我在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

使版本增加内部版本号。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.h,那么 config.h 可能还没有准备好all. 所以我必须做这个依赖:

release_version:全部全部:配置配置:版本

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

也许我需要类似的东西:

release_version: version_release config_release all_release

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

4

2 回答 2

1

你的例子有点随意。如果你重新阅读你所拥有的并澄清它会很好。version目标是做什么的?version和之间有什么关系configrelease_version你没有在任何地方展示的 this 和configand之间有什么关系version

如果我理解正确,您希望拥有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

还有很多其他选择。

于 2013-05-10T17:57:33.563 回答
0

使用 GNU-make,您可以使用仅订单先决条件来强制规则以特定顺序运行,而无需在其他东西不需要它们时强制它们运行:

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

release_version: config version all

现在,如果您执行 amake all它只会在|. 如果config出于其他原因需要,它将在运行之前等待它完成...actions...

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

于 2013-05-10T18:29:11.507 回答