CMake中如何在clean目标执行成功后打印自定义消息?
解决CMake中给自动生成的clean目标添加执行后消息的问题
这个问题我之前也碰到过,确实CMake自动生成的clean目标没法直接用add_custom_command来加POST_BUILD步骤,因为它属于全局目标,并非当前目录下创建的自定义目标,所以会提示找不到目标。下面给你几个可行的解决方案:
方案1:创建自定义的clean封装目标
最直观的方式是自己定义一个目标,把原生clean命令和你要的提示消息封装进去:
add_custom_target(my_clean COMMAND ${CMAKE_COMMAND} -E echo "Starting cleanup for project '${CMAKE_PROJECT_NAME}'..." COMMAND ${CMAKE_BUILD_TOOL} clean COMMAND ${CMAKE_COMMAND} -E echo "Cleanup done in Project '${CMAKE_PROJECT_NAME}'" VERBATIM )
使用时直接执行make my_clean(Makefile构建系统)或者ninja my_clean(Ninja构建系统)即可,它会先打印开始提示,执行原生clean操作,最后输出完成消息。
- 优点:逻辑清晰,兼容性好,不会影响原生clean目标的使用
- 缺点:需要用户记住执行自定义目标,而不是原生的
clean
方案2:修改原生clean命令的内容
通过修改CMAKE_CLEAN_COMMAND变量,把echo命令追加到原生clean命令之后:
set(CMAKE_CLEAN_COMMAND "${CMAKE_CLEAN_COMMAND};${CMAKE_COMMAND} -E echo \"Cleanup done in Project '${CMAKE_PROJECT_NAME}'\"")
这样当用户执行原生的make clean或ninja clean时,clean操作完成后会自动打印你设置的消息。
- 优点:不需要用户改变操作习惯,直接用原生clean命令即可
- 缺点:不同构建系统的命令格式可能存在兼容性问题,需要测试确保在你使用的构建工具下正常工作
方案3:给全局clean目标添加依赖(进阶方式)
利用CMake的全局目标依赖特性,创建一个执行echo命令的自定义目标,让原生clean目标依赖它:
# 创建一个执行echo命令的自定义命令 add_custom_command( OUTPUT clean_done_marker COMMAND ${CMAKE_COMMAND} -E echo "Cleanup done in Project '${CMAKE_PROJECT_NAME}'" VERBATIM ) # 创建依赖上述命令的自定义目标 add_custom_target(clean_post ALL DEPENDS clean_done_marker) # 让原生clean目标依赖这个自定义目标 add_dependencies(clean clean_post)
这种方式可以让原生clean执行完成后自动触发echo消息,但需要注意:部分CMake版本或构建系统可能对全局目标的依赖处理有差异,需要验证是否符合你的需求。
内容的提问来源于stack exchange,提问作者Abeya
相关产品推荐
相关产品推荐

