如何在Makefile目标的每行执行前记录时间戳
问题
我有一个包含多步骤的Makefile目标,示例如下:
do-something: cat Dockerfile ls
我希望在执行每个步骤前输出带时间戳的日志,目前的写法如下,但感觉不够简洁高效,有没有更好的实现方式?
do-something: echo $(shell date -u +'%d-%m-%Y %H:%M:%S:%N') calling step1 cat Dockerfile echo $(shell date -u +'%d-%m-%Y %H:%M:%S:%N') calling step2 ls echo $(shell date -u +'%d-%m-%Y %H:%M:%S:%N') Done
解决方案
可以通过定义Makefile宏来复用日志打印逻辑,既减少重复代码,又能保持格式统一:
# 定义带时间戳的日志宏,$1为传入的日志内容 logLine = @date -u +'%d-%m-%Y %H:%M:%S:%N $1' do-something: $(call logLine, calling step1) cat Dockerfile @date -u +'%d-%m-%Y %H:%M:%S:%N calling step2' # 也可以直接调用date命令 ls $(call logLine, Done)
说明
- 用
logLine宏封装了时间戳格式和date命令调用,通过$(call)可以快速传入自定义日志内容,避免重复编写相同的时间格式字符串 - 命令前加
@可以阻止Make打印命令本身,只输出日志内容 - 如果偶尔需要临时打印,也可以直接写
@date...的形式,灵活度高
内容的提问来源于stack exchange,提问作者Datha
相关产品推荐
相关产品推荐

