在Makefile

时间:2016-06-09 12:06:49

标签: makefile

在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

3 个答案:

答案 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

这避免了必须合并所有您可能不想做的食谱。