首页 文章

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

提问于
浏览
0

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

这是我想要运行的一个小例子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 !!! 正常运行我想只运行一次,因为这应该在没有交互的构建服务器上运行 .

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

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

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

将规则重新设置为 $(rules_OutputFiles): $(rules_InputFiles) ,导致配方执行两次,这是不希望的 .

1 回答

  • 0

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

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

    • exec/rules.temp 不存在

    • 运行 exec/rules.temp 的配方

    • exec/rules.mk 的配方不存在

    • make什么都不做,遗憾的是没有注意到这个文件是神奇地创建的_11126905_食谱的副作用

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

    exec/rules.mk: ;
    

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

相关问题