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