【问题标题】:GNU Makefile dependency in multi-job make多作业制作中的 GNU Makefile 依赖项
【发布时间】:2013-05-10 16:12:28
【问题描述】:

我有一个 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 版本增加内部版本号。 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: 版本

【问题讨论】:

    标签: linux gcc makefile gnu-make


    【解决方案1】:

    你的例子有点随意。如果你重新阅读你所拥有的并澄清它会很好。 version 目标有什么作用? versionconfig是什么关系?这个你没有在任何地方显示的release_versionconfigversion之间有什么关系?

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

    你可以这样做,除非我遗漏了什么:

    all: ...
    
    release_version:
            @rm -f config.h
            @$(MAKE) config.h
            @$(MAKE) all
    
    config.h:
            ...create config.h...
    
    .PHONY: all release_version
    

    还有很多其他选择。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多