GNU Make:具有.INTERMEDIATE目标的多输出规则不能与生成的包含的makefile结合使用

时间:2017-12-14 06:57:04

标签: gnu-make

在我的项目中,我有一个同时产生多个输出文件的动作。其中一个包含编译目标等规则。

这是我想要运行的一个小例子makefile。

SHELL = cmd.exe
rules_InputFiles = makefile
rules_OutputFiles = exec\rules.mk exec\other.mk

$(rules_OutputFiles): exec\rules.temp

.INTERMEDIATE: exec\rules.temp
exec\rules.temp: $(rules_InputFiles)
    $(info == generating rules.mk and rules2.mk (due to $?)  ==)
    if not exist exec mkdir exec
    @echo compile: >exec\rules.mk
    # precede the second @echo with a tab character
    @echo <tab>@echo !!!! compiling !!! >>exec\rules.mk
    @echo compile2: >exec\other.mk
    # precede the second @echo with a tab character
    @echo <tab>@echo !!!! compiling2 !!! >>exec\other.mk    

-include exec\rules.mk

为此makefile调用make compile会产生make错误消息:

*** No rule to make target 'compile'.  Stop.

第二次调用与输出!!!! compiling !!!正常运行 我想只运行一次make,因为这应该在没有交互的构建服务器上运行。

此makefile是constructed included makefiles中的规则与具有中间目标的多个目标的组合的组合。

我的问题是:可以修改此makefile以实现我的目标吗?

我尝试了几种解决方法。其中之一是省略中间目标并使用rules.mk作为标记文件。这对应于疯狂科学家的文章,但不包括必要的依赖性。

将规则重新设置为$(rules_OutputFiles): $(rules_InputFiles)会导致配方执行两次,这是不可取的。

1 个答案:

答案 0 :(得分:0)

这与 INTERMEDIATE 无关,这是因为你在撒谎 make

在最初的make-the-makefiles-up-to-date阶段, make 看到它必须更新exec/rules.mk。 在此之前,它必须更新exec/rules.temp

  • exec/rules.temp不存在
    • 运行exec/rules.temp
    • 的食谱
  • exec/rules.mk的配方不存在
    • make 什么都不做,遗憾的是没有注意到这个文件是作为exec/rules.temp
    • 的配方的副作用神奇地创建的

要证明这是一种情况,只需添加exec/rules.mk的食谱。 什么都行。 最简单的事情是:

exec/rules.mk: ;

通过这个简单的添加, make 现在将检查exec/rules.mk自上次读取(或无法读取)以来是否实际更新过。 任务完成。 (除了让你的makefile以狡猾的风格离开。道德:如果你不欺骗 make ,你的生活会更加快乐。)