如何为CMake流程中执行的各命令添加时间戳以调试依赖问题?
问题
我正调试一个疑似因构建依赖设置不当引发的问题,需确认该猜想。为此,我希望记录CMake流程中每个执行命令的带秒数的时间戳。
我的配置命令为:
cmake -G Ninja -DCUTLASS_NVCC_ARCHS=80 -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCUTLASS_INSTALL_TESTS=ON ^"-DCMAKE_NINJA_WHAT=ninja\ -d\ explain\ -d\ stats^" -DCMAKE_INSTALL_PREFIX=d:/test/worker/build-tools-main/cutlass/install -DCMAKE_TEST_INSTALL_PREFIX=d:/test/worker/build-tools-main/cutlass/install -Wno-dev d:/test/worker/test-main/cutlass
构建命令为:
cmake --build . --target install --verbose
请问是否有简便方法可为每个执行的构建命令添加时间戳?CMake是否有相关内置标志?
解决方案
一、CMake无直接内置时间戳标志
CMake本身没有专门为构建命令添加时间戳的内置开关,但可以通过以下几种简便方式实现需求:
二、利用Ninja原生日志功能(推荐)
由于你使用Ninja生成器,Ninja自带的日志追踪功能可以直接输出带时间戳的命令执行记录:
- 直接给构建命令传递Ninja参数,控制台输出会包含时间戳:
cmake --build . --target install --verbose -- -d trace - 若需要生成详细日志文件,可使用:
执行后会生成cmake --build . --target install --verbose -- -t tracebuild.ninja.trace文件,里面记录了每个命令的开始/结束时间(精确到毫秒),同时控制台也会输出关键时间节点信息。
三、通过命令行工具包装输出
如果需要在控制台实时看到每行输出的时间戳,可借助通用命令行工具:
- Linux/macOS:使用
ts命令(需先安装moreutils包),通过管道给输出加时间戳:cmake --build . --target install --verbose | ts '[%Y-%m-%d %H:%M:%.S]' - Windows PowerShell:自定义函数处理输出:
function Add-Timestamp { process { "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff')] $_" } } cmake --build . --target install --verbose | Add-Timestamp
四、修改CMake配置添加时间戳前缀
若需针对编译命令强制添加时间戳,可在项目的CMakeLists.txt中修改编译规则:
set(CMAKE_CXX_COMPILE_OBJECT "echo [$(date +%Y-%m-%d\ %H:%M:%S.%N)] && <CMAKE_CXX_COMPILER> <FLAGS> <DEFINES> <INCLUDES> -o <OBJECT> -c <SOURCE>") set(CMAKE_C_COMPILE_OBJECT "echo [$(date +%Y-%m-%d\ %H:%M:%S.%N)] && <CMAKE_C_COMPILER> <FLAGS> <DEFINES> <INCLUDES> -o <OBJECT> -c <SOURCE>")
注意:这种方式仅覆盖C/C++编译命令,无法涵盖所有构建阶段的命令。
内容的提问来源于stack exchange,提问作者vam
相关产品推荐
相关产品推荐

