GNU Make统计目标耗时代码报错,请求排查问题原因
问题分析与修复方案
核心问题
你的Makefile代码混淆了Make语法和Shell语法,导致执行错误:
- 目标下的命令行(recipe)中,每一行默认会被当作独立的Shell命令执行。你写的
start_time := $(date +"%S")是Make的变量赋值语法,但它被放在recipe里时,Make会把它当成Shell命令去执行,而Shell中不存在start_time这个可执行程序,因此报错找不到文件。 - 另外,Make本身没有
date内置函数,直接写$(date +"%S")无法正确调用系统的date命令。
修复方案
根据需求,有两种常见的实现方式:
方式1:使用Make变量存储时间
如果要把时间存在Make变量中,需要用$(shell ...)函数调用Shell命令,同时用eval在recipe内完成变量赋值:
date: $(eval start_time := $(shell date +"%S")) @echo "Start Time: $(start_time) s"
$(shell date +"%S"):让Make调用Shell的date命令获取秒数$(eval ...):在recipe内执行Make的变量赋值操作
方式2:纯Shell语法实现
如果不需要把时间存在Make变量里,直接用Shell语法更简单,注意要让变量赋值和echo在同一个Shell进程中执行(用分号或反斜杠连接行):
date: @start_time=$(date +"%S"); echo "Start Time: $$start_time s"
start_time=$(date +"%S"):Shell的变量赋值语法$$start_time:在Make的recipe里,需要写两个$才能让Shell识别为变量,避免被Make提前解析
完整耗时统计示例
如果要实现目标的完整耗时统计,可以记录开始/结束时间戳并计算差值:
date: @start_time=$(date +%s); \ echo "Start Time: $$start_time"; \ # 这里替换为目标的实际执行命令,比如 sleep 2; \ end_time=$(date +%s); \ echo "End Time: $$end_time"; \ echo "Elapsed: $$((end_time - start_time)) seconds"
- 用
date +%s获取时间戳(秒数),方便计算时间差 - 用反斜杠
\连接多行,确保所有命令在同一个Shell进程中执行,变量可以共享
内容的提问来源于stack exchange,提问作者Twowolfs
相关产品推荐
相关产品推荐

