GNU make:定时构建,是否可能有一个目标,其配方在所有目标完成后执行

Bri*_*erg 5 gnu-make

我的问题类似于this onethis one

从本质上讲,类似以下内容是我正在寻找的东西——或者是一个相当干净的技巧来实现它:

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特殊目标的想法,它会在所有CMDGOALSDEFAULTGOALS完成时导致某些事情发生。

Bri*_*erg 0

我刚刚想到了一个解决方案:

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)

...或类似的东西。

它不会无缝地适用于每个目标,但它是可用的。