在我的项目中,我有一个同时产生多个输出文件的动作 . 其中一个包含编译目标等规则 .
这是我想要运行的一个小例子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 回答
这与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
的配方 . 什么都行 . 最简单的事情是:通过这个简单的添加,make现在将检查
exec/rules.mk
自上次读取(或无法读取)以来是否已实际更新 . 任务完成 . (除了让你的makefile以狡猾的风格离开 . 道德:如果你不撒谎,你的生活将会更加快乐 . )