在Make文件中,我可以在构建开始之前打印并完成。
myitem: printf 'start time is %s\n' "$$(date --iso-seconds)" #other build command, i.e. g++ xxxx.cpp printf 'end time is %s\n' "$$(data --iso-seconds)"
在Make文件中是否还有其他实现方式如下所示?
myitem: starttime = $$(date) #start my build printf "The build took time:" NowTime - startTime
如果这只是为了提供信息,最简单的方法是在time
命令下运行您的构建。
但是,要完整地回答您的问题,请继续阅读。
默认情况下,配方的每一行都在单独的shell实例中运行。要使用早期命令中的变量,请使用单个shell。也许是这样的:
myitem:
d=$$(date +%s)\
; build \
&& echo "Build took $$(($$(date +%s)-d)) seconds"
反斜杠转义换行符,以便make
将其视为一条长逻辑行。分号和&&
是语句分隔符 - 我觉得它有用(因为它太丑了!)将它们放在下一行的开头只是为了提醒自己这是一个复合命令。如果构建失败,&&
之后的东西将不会执行;这有点不优雅,但比不认为你的构建成功更好。
我切换到date +%s
(自纪元以来的秒数),因为这样可以更容易地以编程方式工作。
在GNU Make中,您也可以使用.ONESHELL。
一种简单的方法是在命令前添加/bin/time
,例如:
/bin/time --format="took %E" <the build command, i.e. g++ xxxx.cpp>
发布一个迟到的答案,但万一其他人正在看它:另一种解决方案是将你的时间用于临时文件,并在那里做差异:
all:
date +%s > [email protected]
sleep 3
echo $$(($$(date +%s)-$$(cat [email protected])))
rm [email protected]
这可以防止必须合并您可能不想做的所有配方。