每个规则的已用时间

jot*_*iez 6 linux bash makefile function

我有这个bash代码:

(在脚本的开头:)

function timer()
{
    if [[ $# -eq 0 ]]; then
        echo $(date '+%s')
    else
        local  stime=$1
        etime=$(date '+%s')

        if [[ -z "$stime" ]]; then stime=$etime; fi

        dt=$((etime - stime))
        ds=$((dt % 60))
        dm=$(((dt / 60) % 60))
        dh=$((dt / 3600))
        printf '%d:%02d:%02d' $dh $dm $ds
    fi
}

t=$(timer)
Run Code Online (Sandbox Code Playgroud)

(并且,在脚本结束时:)

printf 'Elapsed time: %s\n' $(timer $t)
Run Code Online (Sandbox Code Playgroud)

计算脚本经过的总时间.此代码在bash(shell)脚本中正常工作.所以,我想把这段代码放在每个规则的makefile中.

如何将此功能放在Makefile中?怎样才能在每条规则中呼唤?

我做了这样的事情:

define TIME
     stime=$(1)
     etime=$(date '+%s')
     dt=$((etime - stime)) \
     ds=$((dt % 60)) \
     ...
endef
Run Code Online (Sandbox Code Playgroud)

并在每个规则中:

rule1: dep1 dep2 dep3
    ...SOME STUFF
    @$(call TIME, starttime)

rule2: depx depD rule1
    ...SOME STUFF
    @$(call TIME, starttime)
Run Code Online (Sandbox Code Playgroud)

但数学运算不起作用.我尝试了很多东西,但我做不了

Bet*_*eta 5

麻烦的是,在你的bash脚本中,变量t从开始(工作之前)到结束(当它可以从结束时间中减去时)存活下来.在Make配方中,每一行都有自己的shell,因此在早期行中设置的shell变量在稍后的行中将不可用.

您可以将一个配方的所有命令串在一行,这样您就可以t在开头设置并在结尾处使用它,但这非常笨拙.我建议你写t一个文件,rule1_time这样两个调用timer就不需要一个公共变量了.哦,不要试图call在命令中使用:

STIME = date '+%s' > $@_time
ETIME = read st < $@_time ; echo $$((`date '+%s'`-$$st))

all:
    $(STIME)
    do stuff
    $(ETIME)
Run Code Online (Sandbox Code Playgroud)

编辑:
我写了上面的代码作为概念的证明; 我是为了清晰,而不是精益求精.如果我正确理解您的评论,您现在想知道如何将时间分解为小时,分钟和秒,而无需从每个规则调用多个函数.有几种方法可以做到这一点,这可能是最干净的:

ETIME = @read st < $@_time ; st=$$((`date '+%s'`-$$st-68400)) ; echo Elapsed time: `date -d @$$st '+%H:%M:%S'`
Run Code Online (Sandbox Code Playgroud)