gnuMake,如何强制一个虚拟目标运行不止一次?

5
我的构建系统坚持一次性执行所有目标的 make 命令,因此我会得到以下命令:
``` make clean test clean build ```
第二个 clean 命令只会输出 "Nothing to be done for 'clean'.",即使它已经被添加到了 .PHONY 目标中。
有什么解决办法吗?

简短回答:不行。更长的回答是:也许可以,你想做什么? - Beta
@Beta 基本上我有一个虚假步骤来创建一些数据文件(基本上是将一些文件连接起来并运行模板引擎来填补一些空缺),然后我运行测试,然后清理一切并再次运行该数据文件步骤作为最后一步来实际打包软件... 公司使用的是Hudson作业。我想我会在第一个步骤完成测试后触发一个新的打包步骤。试图避免这样做,因为创建新的VM和所有这些东西太昂贵了(时间方面)... 或者我只是将那个虚假目标的工作复制两次(毕竟它只有2行在make文件中)。 - gcb
1
你确定 test 步骤修改了数据文件吗?如果是的话,你应该重新考虑你的设计;如果不是,就没有必要重建它们。话虽如此,最简单的方法可能是复制构建它们的命令。 - Beta
2个回答

7

不要这样做!不要依赖目标的暗示顺序——当你使用make -j时,它会完全改变。让你的顺序变得更加明确。如果你真的必须在构建之间进行清理,那么可以尝试以下操作:

.PHONY: everything
everything:
    ${MAKE} clean
    ${MAKE} test
    ${MAKE} clean
    ${MAKE} build

再次强调,递归make虽然有些臭味,但在这种情况下是您最好的选择。


我在这个环境中对-j有控制权,但是记住这一点非常重要。 - gcb
@gcb 在我看来,-j 是 make 的重点,也是检验你的 makefile 是否正确的好方法。 - bobbogo

5

我已经验证过了。请尝试以下方法:

test: ...
    ...

build: ...
    ...

clean%: ...
    ...

那么,您可以调用:

make clean1 test clean2 build

似乎只要目标名称不同,即使它命中了相同的目标模式,也会重新运行它。


遗憾的是,当您使用并行_make_(这也是_make_的全部意义所在)时,它会完全崩溃。 - bobbogo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接