You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:54:04