使用Cmake的add_custom_target建立自定义的Target后,必须将这个Target加入all依赖,否则生成的Makefile不会执行这个Target的内容。这样会有个问题,如果需要编译如下目录:

目录下有N个目录,这些目录下或是目录,或是文件,那么递归下去,就会有若干CMakeLists.txt,也就是说,会有若干个add_custom_target(all ...)的存在。进入单独目录编译或许不要紧,但是如果我们在顶层或者中间层执行cmake生成Makefile,就会报重复Target的错误,这个重复的Target就是多次添加的all。错误如下:

add_custom_target cannot create target "all" becauseanother target with the same name already exists.  The existing target is acustom target created in source directory
See documentationfor policy CMP0002 for more details.

只能在叶子编译而不能在中上层编译,这样显然不行。一个可行的解决方案是,在向all中添加Target前,先判断Target‘是否存在,如果不存在,则使用add_custom_target添加依赖(add_custom_target的问题在于,它本身不判断Target是否存在,每次都是新建);如果存在,则使用add_dependencies添加依赖(add_dependencies只是添加依赖,而不会新建Target)。在这里,使用get_target_property判断Target存在与否,原型如下:

get_target_property(VAR target property)

这里的property和VAR相当于一个map键值对,property是键,VAR是值,这个键值对从属于target,如果这个target没有这个键,那么VAR将返回OUTPUT_VALUE-NOTFOUND。

有get必有set,向一个Target添加键值的方法是set_property,原型如下:

set_property(<GLOBAL                            |DIRECTORY [dir]                   |TARGET    [target1 [target2 ...]] |SOURCE    [src1 [src2 ...]]       |TEST      [test1 [test2 ...]]     |CACHE     [entry1 [entry2 ...]]>[APPEND] [APPEND_STRING]PROPERTY <name> [value1 [value2 ...]])

这里功能较多,我们只需要设置TARGET为指定的target名,PROPERTY设置为需要的键值对即可。如此,判断一个Target是否存在就可以这么写:

get_target_property(OUTPUT_VALUE all STATUS)
if(${OUTPUT_VALUE} STREQUAL OUTPUT_VALUE-NOTFOUND)#Target all 不存在
else()#Target all 存在
endif()

在此基础上,包装一个自定义的函数append_dependencies,它向all中添加依赖,在all不存在的情况下,使用add_custom_target新建Target all并且增加依赖,对Target增加键值对讯息,如果all存在,则使用add_dependencies添加依赖,代码如下:

function(append_dependencies)set(multiValueArgs DEPENDENCIES)cmake_parse_arguments(APPEND_DEPENDENCIES "" "" "${multiValueArgs}" ${ARGN})get_target_property(OUTPUT_VALUE all STATUS)if(${OUTPUT_VALUE} STREQUAL OUTPUT_VALUE-NOTFOUND)add_custom_target(all DEPENDS ${APPEND_DEPENDENCIES_DEPENDENCIES})set_property(TARGET all PROPERTY STATUS AVAILABLE)else()add_dependencies(all DEPENDS ${APPEND_DEPENDENCIES_DEPENDENCIES})endif()endfunction()<pre name="code" class="plain">

使用append_dependencies向all添加依赖,这样就能有效解决在中上层目录中Target冲突的现象。

CMake中使用get_target_property判断Target是否存在相关推荐

  1. cmake(二十七)Cmake中target再理解

    cmake翻译手册详解 cmake FAQ问题 一    目录结构 ++++++++++++++目录结构-->'最佳实践'++++++++++++++1)对于一个优秀的程序员而言,不仅仅是'编写 ...

  2. HelloWorld CMake Demo 03:CMake中构建静态库与动态库及其使用

    继续完善Hello World,建立它的共享库,包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc向终端输出Hello W ...

  3. CMake中link_directories/target_link_directories的使用

    CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for librarie ...

  4. CMake中define_property的使用

    CMake中的define_property命令用于定义和记录自定义属性,其格式如下: define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE ...

  5. CMake中add_custom_command的使用

    CMake中的add_custom_command命令用于将自定义构建规则添加到生成的构建系统(Add a custom build rule to the generated build syste ...

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

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

  7. CMake 中的 PUBLIC,PRIVATE,INTERFACE

    一.概述 CMake中经常会使用 target_**() 相关命令,target_**() 命令支持通过 PUBLIC,PRIVATE 和 INTERFACE 关键字来控制传播.本文主要介绍下这三个关 ...

  8. CMake中file的使用

    CMake中的file命令用于文件操作,其文件格式如下:此命令专用于需要访问文件系统的文件和路径操作 Readingfile(READ <filename> <variable> ...

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

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

  10. Unity中根据矩阵判断一个点在自身的哪一侧

    如果你还不是很理解矩阵的含义那么请转到 https://blog.csdn.net/qq_39426265/article/details/101373494 问题起源 在Unity自带的函数中并没有 ...

最新文章

  1. Form_通过FND_FNDFLUPL标准功能上传CSV控件(案例)
  2. 2017-9-11-颜色空间
  3. python中处理日期和时间的标准模块是-关于时间和Python的时间处理模块
  4. linux kernel的spinlock在armv7和armv8中的不同
  5. 201521123031 《Java程序设计》第6周学习总结
  6. EOS从入门到精通-设计背景与DPOS算法(文字稿)
  7. android n-ify miui,MIUI7.5版刷机包
  8. P3600-随机数生成器【dp,数学期望】
  9. 牛客网华为机试考试java_牛客网——华为机试(题17:坐标移动)(Java)
  10. ESP32开发 CMakeLists包含同级目录.h文件,error: gpioX.h: No such file or directory
  11. 关于成员变量和局部变量是否都会被默认初始化的问题
  12. 自然语言处理在金融实时事件监测和财务快讯中的应用
  13. 《湮灭》脑洞:行星级癌变与人的自我救赎
  14. 关于静态博客的评论系统
  15. id门禁卡复制到手机_使用iPhone解锁开门?手机复制门禁卡教程分享
  16. 上传声音 微信小程序_微信小程序实现录制、试听、上传音频功能(带波形图)...
  17. cacti graphs new.php,Cacti /graphs_new.php SQL Injection Vulnerability
  18. Spark 3.0 - 6.ML 自定义 Transformer 踩坑大全
  19. 制作自己的数据-深度恢复
  20. 王大师送福利啦!2021年面试题目汇总

热门文章

  1. 华为大数据学习笔记——ModelArts
  2. 在线微信编辑器(构思编辑器)——如何让微信公众号文章图文设计更完美
  3. 如何使用xbrowser图形化连接centos
  4. 简单剖析B树(B-Tree)与B+树
  5. 1960-2018年世界各国GDP排名变化--Python动图实现
  6. win10系统没有信息服务器地址,Win10没有有效的ip配置
  7. Crowd 和 JIRA、Confluence、Fisheye and Crucible共享账户集成登入
  8. python中新建标签页的三种方法
  9. 神奇的夏时令——本来设置好的日期在保存完成后少了一天?
  10. 泰尔指数r语言_EG指数:从繁琐到简单