在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
答案 0 :(得分:3)
如果这只是出于提供信息的目的,绝对最简单的方法是在time
命令下运行您的构建。
要完整回答您的问题,请继续阅读。
默认情况下,配方的每一行都在一个单独的shell实例中运行。要使用早期命令中的变量,请使用单个shell。也许是这样的:
myitem:
d=$$(date +%s)\
; build \
&& echo "Build took $$(($$(date +%s)-d)) seconds"
反斜杠转义换行符,以便make
将其视为一条长逻辑行。分号和&&
是语句分隔符 - 我发现它有用(因为它太丑了!)将它们放在下一行的开头只是为了提醒自己这个是一个复合命令。如果构建失败,&&
之后的内容将不会执行;这有点不优雅,但比没想到你的构建成功更好。
我切换到date +%s
(自纪元以来的秒数),因为以编程方式工作更加容易。
在GNU Make中,您也可以使用.ONESHELL。
答案 1 :(得分:1)
一种简单的方法是在命令前添加/bin/time
,例如:
/bin/time --format="took %E" <the build command, i.e. g++ xxxx.cpp>
答案 2 :(得分:0)
发布一个较晚的答案,但是如果其他人正在查看它:另一个解决方案是将您的时间传递到一个临时文件中,并在那里进行更改:
all:
date +%s > _time_$@.txt
sleep 3
echo $$(($$(date +%s)-$$(cat _time_$@.txt)))
rm _time_$@.txt
这避免了必须合并所有您可能不想做的食谱。