从本质上讲,类似以下内容是我正在寻找的东西——或者是一个相当干净的技巧来实现它:
GET_TIMESTAMP = $(shell perl -e 'print time()')
START_TIME := ${GET_TIMESTAMP}
all: T1 T2 ... TN
T1:
T2:
...:
TN:
#...
timer:
@perl -e 'printf( "Loaded makefiles in %ds, build completed in %ds\n", $ARGV[1] - $ARGV[0], $ARGV[2] - $ARGV[1] );' ${START_TIME} ${LOAD_COMPLETE} ${GET_TIMESTAMP}
.ATEND: timer
LOAD_COMPLETE := ${GET_TIMESTAMP}
Run Code Online (Sandbox Code Playgroud)
...可以通过多种方式启动:
~ gmake all
(...)
Loaded makefiles in 8s, build completed in 93s
~ gmake T2 T3 T4
(...)
Loaded makefiles in 8s, build completed in 13s
Run Code Online (Sandbox Code Playgroud)
它的核心是一个.ATEND特殊目标的想法,它会在所有CMDGOALS或DEFAULTGOALS完成时导致某些事情发生。
我刚刚想到了一个解决方案:
GET_TIMESTAMP = $(shell perl -e 'print time()')
START_TIME := ${GET_TIMESTAMP}
all: T1 T2 ... TN
T1:
T2:
...:
TN:
timer_target : ${TIMER_DEPENDENCY}
@echo do whatever to print out timing info
Run Code Online (Sandbox Code Playgroud)
这可以从命令行使用:
gmake timer_target TIMER_DEPENDENCY='T3 T4 T5'
Run Code Online (Sandbox Code Playgroud)
...或类似的东西。
它不会无缝地适用于每个目标,但它是可用的。