本文介绍了CMake中的add_custom_target命令。使用的CMake版本是3.22.1。
CMake中一切都是基于target的,如add_library会产生一个library的target,add_executable会产生一个exe的target…
本文的add_custom_target会根据命令的参数生成一个target,这个target相对的可以更定制化一点。

官方文档:https://cmake.org/cmake/help/v3.22/command/add_custom_target.html?highlight=add_custom

target默认不在all target中

all target的意思是,在cmake之后,make会生成和执行all target内所有的target。
例如add_executable默认就会生成在all target中。但如果在add_exe命令中加入EXCLUDE_FROM_ALL,才会从all target中移除,即make不会默认生成。

add_custom_target的target则是默认不在all target中。
如下面案例,定义了一个print-pwd的target,这个target执行pwd命令。

add_custom_target(print-pwdCOMMAND "pwd"
)

make之后,是没有任何反应的,这证明了此target不是all target内:

对于这种target,需要make <target-name>才会执行:

以上打印了这个target的COMMAND信息,以及target build完成了。

ALL

在声明target的时候,可以加上ALL,这个target就会加入all target中,默认进行执行了。

add_custom_target(print-pwdALLCOMMAND "pwd"
)

DEPENDS

target之间可以有依赖关系,A依赖B(A depends on B),意味着A的build,需要基于B 已经build完成。
要实现A依赖B,则要在定义A的时候,加上DEPENDS B。具体如下案例:

add_custom_target(print-pwdCOMMAND "pwd"
)add_custom_target(depend-print-pwdCOMMAND "echo" "depend pwd"DEPENDS print-pwd
)

定义了两个target,后者依赖前者,并且后者会打印"depend pwd"。
这里要注意一点,COMMAND中的命令和参数是分开的,如第二个target的COMMAND "echo" "depend pwd",而不能COMMAND "echo 'depend pwd'"

同样的,在make之后是没有反应的。在make depend-print-pwd后:

能发现会先build print-pwd,再build depend-print-pwd。

这里也可以把命令内的DEPENDS改为:add_dependencies(depend-print-pwd print-pwd),作用是一样的。

BYPRODUCTS

声明这个target在执行时随之生成的文件。
BYPRODUCTS需要和COMMAND配合使用,如果漏了COMMAND则会报错:

add_custom_target(byproductBYPRODUCTS "aaa.txt"
)


BYPRODUCTS不会校验文件是否生成了,即使没有生成文件,也不会报错:

add_custom_target(byproductCOMMAND "echo" "aaa"BYPRODUCTS "aaa.txt"
)

执行cmake .. ; make byproduct

make clean会清理掉BYPRODUCTS指定的文件:

add_custom_target(byproductCOMMAND "touch" "aaa.txt"COMMAND "touch" "bbb.txt"BYPRODUCTS "aaa.txt"
)

执行结果:

执行make clean

WORKING_DIRECTORY

用于修改这个target执行COMMAND时所在的路径,支持绝对路径相对路径
默认是在编译路径下所在的子目录。

add_custom_target(work-dirCOMMAND "pwd"
)

这个CMakeLists.txt是在源文件的src下的:

因此执行后打印的pwd就是在build内相应的子目录下:


WORKING_DIRECTORY使用绝对路径:

add_custom_target(work-dirCOMMAND "pwd"WORKING_DIRECTORY "/root/cmake_learning/src/test-add-custom-target/build/src2"
)

执行mkdir src2 ; cmake .. ; make work-dir
那么执行时的路径就在配置的绝对路径下:

同样的,使用相对路径:

add_custom_target(work-dirCOMMAND "pwd"WORKING_DIRECTORY "../src2"
)

执行命令,也是一样的效果。

那么在修改的执行路径后,BYPRODUCTS还有没有效果呢?

add_custom_target(work-dirCOMMAND "pwd"COMMAND "touch" "aaa.txt"WORKING_DIRECTORY "../src2"BYPRODUCTS "aaa.txt"
)

可以看到文件生成成功了:

但是用了make clean之后,文件却没有被删除。

这是因为WORKING_DIRECTORY的功能实际上是在执行每个COMMAND的命令前,先cd到指定路径,在执行相应命令。
这是在调试过程中偶然发现的:

因此估计是BYPRODUCTS定位不到生成的文件,导致make clean失败。
BYPRODUCTS设置为相对路径的文件:

add_custom_target(work-dirCOMMAND "pwd"COMMAND "touch" "aaa.txt"WORKING_DIRECTORY "../src2"BYPRODUCTS "../src2/aaa.txt"
)

make clean后删除成功了。
设置为绝对路径也成功了。

CMake之add_custom_target相关推荐

  1. 安装linux后找不到系统文件夹,CMake安装库到系统文件夹并被find_package找到

    大家经常在网上使用一些别人写好的库,大概步骤是先用github下载下来,在库的源文件夹中使用如下命令安装 cd mkdir build cd build cmake .. make sudo make ...

  2. cmake整理:在编译时拷贝文件之add_custom_comand 和 add_custom_target

    第一种通用形式: add_custom_command: 增加客制化的构建规则到生成的构建系统中.对于add_custom_command,有两种使用形式.第一种形式是增加一个客制命令用来产生一个输出 ...

  3. CMake命令之add_custom_comand 和 add_custom_target

    一.背景 在很多时候,需要在cmake中创建一些目标,如clean.copy等等,这就需要通add_custom_target来指定.而add_custom_command则可以用来完成对add_cu ...

  4. 【CMake】cmake的add_custom_command和add_custom_target指令

    在很多时候,需要在cmake中创建一些目标,如clean.copy等等,这就需要通过add_custom_target来指定.同时,add_custom_command可以用来完成对add_custo ...

  5. CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本: cmake未提供的功能而实际构建中又需要时,如获取Linux发行版本 项目构建时需要执行脚本才能完成,如boost构建过程 有的需要shell ...

  6. coverage 覆盖多个测试文件时_奇技淫巧[2]:cmake中添加lcov代码覆盖测试

    奇技淫巧[2]:cmake中添加lcov代码覆盖测试 1 目的 为CMake工程的test添加lcov代码覆盖性测试 2 要点 添加lcov支持的方法应该有很多,比较方便的有: (1)利用脚本基于文件 ...

  7. 利用CMake编译内核模块

    最近在做LDD书上的一些例子, 为了统一管理代码的编译,使内核模块的编译跟应用程序的编译过程一致,决定使用CMake来做工程的编译,编译脚本如下: cmake_minimum_required(VER ...

  8. CMake常见变量——Project和CMake相关信息

    CMAKE_AR: 静态库的归档工具的名称.这个变量指定了用于创建档案或静态库的程序的名称. CMAKE_ARGC: 在脚本模式下传给CMake的命令行参数的个数.当运行在-P脚本模式下,CMake设 ...

  9. 【CMake】CMake 引入 ( Android NDK 构建脚本 | CMake 命令手册 )

    文章目录 一.Android NDK 构建脚本 二.CMake 构建脚本示例 三.CMake 命令手册 1.CMake 脚本命令 2.CMake 工程命令 该系列博客的应用场景是 Android St ...

最新文章

  1. matlab中实时脚本与纯代码脚本
  2. 微信小程序android错误,app安卓端 跳转到微信小程序失败
  3. JAVA中的GridView每一个赋值,在ASP.NET 2.0中操作数据之六十二:GridView批量更新数据...
  4. [Go语言]从Docker源码学习Go——init()方法和identifier首字母大小写区分
  5. Java 并发编程之线程池 ExecutorService 接口
  6. Windows下VSCode运行shell
  7. 无限路由器故障排查细则
  8. win64 安装Oracle 11g
  9. 服务器实体机与虚拟机,八种虚拟机与实机之间数据交互的方法|虚拟机与实体机之间的互连与数据交换方法...
  10. Python面试宝典
  11. 天黑时间跟经度还是纬度有关_时差由纬度还是经度决定
  12. soap响应报文拼装_soap报文解析
  13. 数字后端概念——shielding
  14. 想让Word文档更整齐,这五个Word排版技巧少不了
  15. 宝塔面板搭建WordPress网站完整教程
  16. Three.js基础光源和特殊光源的用法
  17. flex布局交叉轴方向对齐方式详解
  18. 第四章第十二题(十六进制转二进制)(Hex to binary)
  19. DRBD中文应用指南
  20. 用python做一个简单的猜拳小游戏

热门文章

  1. 综述:当医学影像遇上深度学习
  2. 雅虎创始人杨致远简介
  3. 基于Django框架的零食商城系统之Python毕设选题推荐
  4. 温暖别人就是温暖自己
  5. 一维DOA估计之Capon算法(含程序)
  6. 为什么你看书记不住,记住不会用?-我的技术学习方法论
  7. [Map]-1-Hashtable、HashMap、TreeMap有什么不同
  8. 【高级Java开发】类QQ聊天工具的设计与实现(代码已上传)
  9. android 调用下载,使用Android系统提供的DownloadManager来下载文件
  10. 国家公务员局提醒考生:所谓命题专家不可信-公务员-国考