当前位置: 首页 > news >正文

CMake add_custom_xxx说明

add_custom_command是 CMake 中用于在构建阶段(即执行makeninja或 Visual Studio 生成时)执行自定义命令的指令。它不会在运行 CMake 配置时立即执行,而是告诉构建系统在需要的时候(例如某个文件缺失或依赖更新时)自动运行指定的命令。

主要用途

  • 生成源文件:例如,通过脚本从 IDL 文件生成 C++ 代码,或使用工具预处理某些资源。
  • 执行额外的构建步骤:比如在链接完成后对可执行文件进行签名、拷贝文件、运行测试等。
  • 自定义目标行为:与add_custom_target配合,定义一些不产生输出文件的命令(如打包、清理等)。

两种常用形式

1. 用于生成文件(Output 形式)

add_custom_command( OUTPUT output1 [output2 ...] COMMAND command1 [args...] DEPENDS depend1 [depend2 ...] [COMMENT comment] ... )
  • 何时执行:当OUTPUT文件不存在,或者其依赖项(DEPENDS)比OUTPUT更新时,在构建阶段执行。通常,某个目标会依赖于这些OUTPUT文件,从而触发该命令。

2. 添加到目标(Target 形式)

add_custom_command( TARGET target PRE_BUILD | PRE_LINK | POST_BUILD COMMAND command1 [args...] [COMMENT comment] ... )
  • 何时执行:在构建指定目标的过程中,按指定的阶段执行:
    • PRE_BUILD:在执行目标内部编译之前(Visual Studio 生成器专有,其他生成器等同于PRE_LINK)。
    • PRE_LINK:在编译之后、链接之前执行。
    • POST_BUILD:在目标所有编译链接步骤完成后执行。

重要提示

  • add_custom_command本身是 CMake配置阶段的命令,它只是将自定义命令的规则写入生成的构建系统(如 Makefile 或 .vcxproj)中,真正的执行由底层构建工具在构建阶段触发。
  • 如果使用OUTPUT形式,必须确保有某个目标依赖该输出,否则命令永远不会被执行。

示例

# 生成文件形式:每次更新 version.h.in 时,执行脚本生成 version.h add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/version.h COMMAND ${CMAKE_COMMAND} -DVERSION=${PROJECT_VERSION} -P ${CMAKE_CURRENT_SOURCE_DIR}/gen_version.cmake DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/version.h.in COMMENT "Generating version.h" ) # 让目标 mylib 依赖生成的 version.h add_library(mylib ${CMAKE_CURRENT_BINARY_DIR}/version.h src/foo.cpp) # 目标形式:在 mylib 链接完成后,执行签名命令 add_custom_command( TARGET mylib POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylib> ${OUTPUT_DIR} COMMENT "Copying library to output directory" )

简而言之,add_custom_command是连接 CMake 配置与构建执行的桥梁,用于在编译过程中插入任意自定义步骤。


add_custom_target用于创建一个没有输出文件(或输出不被 CMake 跟踪)的自定义构建目标。它通常用于执行一些额外任务,例如:

  • 运行测试、代码格式化、静态分析
  • 打包、安装、生成文档
  • 拷贝文件、触发脚本

与普通目标(如可执行文件、库)不同,自定义目标默认不会被构建,除非显式指定(如make mytarget)或通过ALL选项加入默认构建。

基本语法

add_custom_target(Name [ALL] [command1 [args1...]] [DEPENDS depend1 depend2 ...] [COMMENT comment] [SOURCES src1 src2 ...])
  • ALL:将该目标加入默认构建(即执行makeninja时也会构建它)。
  • COMMAND:要执行的命令(可以多条,按顺序执行)。
  • DEPENDS:指定依赖的其他目标或文件(用于触发重建)。
  • SOURCES:仅用于 IDE 显示,不影响构建。

add_custom_command的区别

特性add_custom_commandadd_custom_target
本质为生成特定文件而定义的构建规则定义一个显式的构建目标
输出必须指定OUTPUT文件(或绑定到目标)没有输出文件,或输出不被 CMake 跟踪
执行时机当输出文件缺失或依赖更新时,在构建过程中自动执行当用户显式构建该目标,或作为依赖被其他目标需要时执行
是否成为目标否,它只是附着于某个目标的规则是,可以通过make target直接调用
常见用途生成源文件、代码生成、编译后处理(如签名)打包、测试、文档生成、清理等独立任务

典型配合使用

add_custom_command负责生成文件,add_custom_target可以依赖这些文件来触发额外操作,或者将一系列命令组织成一个独立目标。

示例:先通过命令生成文档,再创建一个自定义目标来构建文档。

# 用自定义命令生成文档文件(假设由脚本生成) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/docs/index.html COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile DEPENDS Doxyfile ${PROJECT_SOURCE_DIR}/src/*.h COMMENT "Generating API documentation" ) # 创建自定义目标,依赖生成的文档文件 add_custom_target(docs DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/docs/index.html COMMENT "Build documentation" )

现在执行make docs就会先运行 Doxygen 生成文档(如果文件过时),然后标记目标完成。

另一个常见模式:创建一个总是执行的“打包”目标,不依赖任何输出。

add_custom_target(package COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target install COMMAND ${CPACK_COMMAND} COMMENT "Creating binary package" )

小结

  • 如果你需要生成某个文件,并在构建主目标时自动触发,用add_custom_command(通常与add_library/add_executable的源文件列表结合)。
  • 如果你需要定义一个可单独调用的任务(如打包、测试),或想将多个命令组合成一个目标,用add_custom_target
  • 二者常协同工作:add_custom_target可以DEPENDSadd_custom_command的输出,从而在需要时触发文件生成。
http://www.jsqmd.com/news/440237/

相关文章:

  • 2026年真空上料机厂家推荐排行榜:螺旋/气动/连续式/自动/粉体/干粉/颗粒真空上料机及真空吸料机实力品牌深度解析 - 品牌企业推荐师(官方)
  • 扬帆出海:中科恒一能源逐光而行,闪耀意大利国际能源展
  • [软件下载]网站日志分析工具 v1.4.2
  • 筑牢新能源安全防线:电池绝热量热仪选型全景与实战策略 - 品牌推荐大师
  • http模块
  • Spring开发系列教程(27)——使用WebSocket
  • 基恩士KV7500程序 基恩士PLC 基恩士KV7500,基恩士触摸屏,搭载KV-SH04PL...
  • Spring开发系列教程(28)——集成第三方组件
  • 启用Spring Initializr 快速创建Maven管理的springBoot方案
  • Spring Boot 3.2+ GraalVM原生镜像构建实战(JDK21+GraalVM 23.2实测)
  • leetcode76. 最小覆盖子串(传引用 unordered_map的慢 可以用数组来代替哈希表)
  • 网易智企肖钰妍:未来三年,服务营销领域 Agent 五大趋势预测
  • 2026省选邮寄
  • 软件开发创新日志 #1项目分析+二次开发
  • BurpSuite安装教程
  • 2026年比较好的疲劳试验机厂家推荐:电动伺服疲劳试验机/橡胶弹性体疲劳试验机/山东橡胶弹性体疲劳试验机专业制造厂家推荐 - 品牌宣传支持者
  • 函数栈帧的创建与销毁
  • 2026年靠谱的阻燃硅橡胶品牌推荐:胶辊硅橡胶/抗静电硅橡胶/自润滑硅橡胶口碑好的厂家推荐 - 品牌宣传支持者
  • AI 基础概念
  • 通过计算重用提取内在潜在内存FlashMem: Distilling Intrinsic Latent Memory via Computation Reuse
  • 2026年评价高的风力选煤设备厂家推荐:智能干选选煤设备/煤炭提质选煤设备厂家推荐哪家好 - 品牌宣传支持者
  • 晶圆寻边器厂家哪家靠谱?能适配8-12寸晶圆且精度达±0.1mm吗?
  • Git 中 提交(commit)和 合并(merge)的区别
  • 零基础中医执医技能操作怎么练?深度测评阿虎医考 - 医考机构品牌测评专家
  • 简单说明,轻松搞懂 ,AI混剪,AI智能成片有什么区别
  • 该套程序是正压检漏机程序,总共有9个 A6总线伺服电机,6个总线步进电机,采用EtherCAT...
  • 2026年靠谱的聚脲水箱工厂推荐:喷涂聚脲体育看台/天冬聚脲屋顶防水专业制造厂家推荐 - 品牌宣传支持者
  • Flutter 三方库 firebase_dart 的鸿蒙化适配指南 - 纯 Dart 实现的 Firebase 客户端、告别原生 SDK 依赖、鸿蒙级实时数据库与鉴权实战
  • 2026年评价高的定速式摩擦磨损试验机厂家推荐:山东直线往复摩擦磨损试验机实力工厂推荐 - 品牌宣传支持者
  • 2026年口碑好的环保选煤设备工厂推荐:煤炭提质选煤设备/新型多级风力选煤设备值得信赖的生产厂家 - 品牌宣传支持者