如何对Makefile目标做基准测试并解决shell命令提前执行问题
问题根因
你观察到的时间一致是GNU Make的执行逻辑导致的:
$(shell ...)是Make的内置函数,会在Make解析阶段(也就是所有recipe实际执行前)就完成求值,因此两个$(shell date)会在解析Makefile的时候同步执行,时间完全相同,之后展开成固定的字符串嵌入到echo命令里,执行echo时自然不会重新获取时间。
解决方案
不要使用Make层面的$(shell)函数,把date命令的执行交给运行recipe的shell进程处理即可,只需将$(shell date)替换为$$(date):
- Make中连续两个
$会转义为字面量的$,最终传递给shell的命令就是echo "$(date) Before test",由shell执行到对应行时才会调用date命令获取当前时间。
修改后的正确Makefile如下:
test: @echo "$$(date) Before test" sleep 10 @echo "$$(date) After test"
修改后再次运行,你会看到两次date输出的时间差为10秒,符合基准测试的需求。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

