在Makefile中显示构建持续时间

问题描述 投票:3回答:3

在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
makefile
3个回答
3
投票

如果这只是为了提供信息,最简单的方法是在time命令下运行您的构建。

但是,要完整地回答您的问题,请继续阅读。

默认情况下,配方的每一行都在单独的shell实例中运行。要使用早期命令中的变量,请使用单个shell。也许是这样的:

myitem:
    d=$$(date +%s)\
    ; build \
    && echo "Build took $$(($$(date +%s)-d)) seconds"

反斜杠转义换行符,以便make将其视为一条长逻辑行。分号和&&是语句分隔符 - 我觉得它有用(因为它太丑了!)将它们放在下一行的开头只是为了提醒自己这是一个复合命令。如果构建失败,&&之后的东西将不会执行;这有点不优雅,但比不认为你的构建成功更好。

我切换到date +%s(自纪元以来的秒数),因为这样可以更容易地以编程方式工作。

在GNU Make中,您也可以使用.ONESHELL


1
投票

一种简单的方法是在命令前添加/bin/time,例如:

/bin/time --format="took %E" <the build command, i.e. g++ xxxx.cpp>

0
投票

发布一个迟到的答案,但万一其他人正在看它:另一种解决方案是将你的时间用于临时文件,并在那里做差异:

all:
    date +%s > [email protected]
    sleep 3
    echo $$(($$(date +%s)-$$(cat  [email protected])))
    rm [email protected]

这可以防止必须合并您可能不想做的所有配方。

© www.soinside.com 2019 - 2024. All rights reserved.