如何让CMake生成的Makefile添加指定自定义简单目标?
如何在CMake生成的Makefile中添加极简自定义PHONY目标?
如果你想在CMake生成的Makefile里直接添加类似这样的极简规则:
.PHONY: target-I-want target-I-want: echo "Hello World"
并且避免执行时出现额外的CMake构建检查步骤,这里有两种规范的解决方案:
方案一:直接在CMake中定义自定义目标(推荐)
不用依赖外部的makefile.dev,直接通过CMake的add_custom_target来定义目标,同时配置参数消除额外操作:
add_custom_target(target-I-want COMMAND echo "Hello World" VERBATIM # 确保命令被正确解析,处理特殊字符 ALWAYS # 强制每次执行目标时都运行命令,等效于.PHONY的效果 EXCLUDE_FROM_ALL TRUE # 不将目标加入默认的`all`构建集合,避免不必要的依赖检查 COMMENT "Printing Hello World" # 执行时显示的提示信息 )
为什么这能解决问题?
EXCLUDE_FROM_ALL TRUE让这个目标独立于项目的默认构建流程,执行make target-I-want时不会触发整个项目的构建检查步骤。ALWAYS参数确保每次调用目标都会执行命令,不会因为文件状态未变化而跳过,完美模拟.PHONY的行为。- 直接定义命令避免了调用外部Makefile的额外开销。
方案二:优化外部Makefile的调用(如果你想复用makefile.dev的内容)
如果你还是想保留makefile.dev里的逻辑,只需要给原来的add_custom_target添加几个关键参数,就能减少额外操作:
add_custom_target(target-I-want COMMAND make -f ${CMAKE_CURRENT_SOURCE_DIR}/makefile.dev target-I-want VERBATIM EXCLUDE_FROM_ALL TRUE ALWAYS COMMENT "Running target from makefile.dev" )
优化点说明:
EXCLUDE_FROM_ALL TRUE阻止CMake在执行这个目标时触发项目构建系统的检查(比如重新生成Makefile、检查依赖更新等)。ALWAYS确保每次执行都会调用外部Makefile,不会因为缓存而跳过。
避免踩坑:为什么原来的配置会有额外操作?
你之前的代码没有添加EXCLUDE_FROM_ALL TRUE,导致这个自定义目标被纳入了CMake的默认构建依赖链中。执行时,CMake会先检查整个项目的构建系统是否需要更新(比如是否修改了CMakeLists.txt、依赖文件是否变化),才会执行你的命令。加上这个参数后,目标就完全独立于主构建流程了。
内容的提问来源于stack exchange,提问作者Erick Sepúlveda
相关产品推荐
相关产品推荐

