CMake中add_custom_target的使用

news2024/11/16 19:55:33

      CMake中的add_custom_target命令用于添加一个没有输出的target,以便始终构建它,其格式如下:

add_custom_target(Name [ALL] [command1 [args1...]]
                  [COMMAND command2 [args2...] ...]
                  [DEPENDS depend depend depend ... ]
                  [BYPRODUCTS [files...]]
                  [WORKING_DIRECTORY dir]
                  [COMMENT comment]
                  [JOB_POOL job_pool]
                  [VERBATIM] [USES_TERMINAL]
                  [COMMAND_EXPAND_LISTS]
                  [SOURCES src1 [src2...]])

      添加给定名称的target以执行给定命令(Adds a target with the given name that executes the given commands)。target没有输出文件,并且始终被认为是过时的,即使命令尝试创建具有target名称的文件也是如此。使用add_custom_command命令生成具有依赖项的文件。默认情况下,没有什么依赖于自定义target。使用add_dependencies命令向其它target添加依赖项。
      可选项包括:
      (1).ALL:表示要把这个target加入到默认的构建target中,以便每次都会运行
      (2).BYPRODUCTS:指定命令预期生成的文件,但其修改时间可能会或可能不会在后续构建中更新。如果副产品(byproduct)名称是相对路径,它将相对于与当前源目录相对应的构建树目录进行解释。每个副产品将自动标记为GENERATED源文件属性。
      BYPRODUCTS的参数可以使用一组受限制的生成器表达式(generator expression)。不允许使用依赖于target的表达式。
      (3).COMMAND:指定要在构建时执行的命令行。如果指定了多个COMMAND,它们将按顺序执行,但不一定组成有状态的shell或batch脚本。
      命令和参数是可选的,如果未指定,将创建一个空target.
      (4).COMMENT:在构建时执行命令之前显示给定的消息。
      (5).DEPENDS:在同一目录(CMakeLists.txt文件)中使用add_custom_command命令创建的自定义命令的引用文件和输出(reference files and outputs)。它们将在构建targets时更新。
      (6).COMMAND_EXPAND_LISTS:COMMAND参数中的列表(list)将被扩展。
      (7).JOB_POOL:为Ninja生成器指定一个池(pool).
      (8).SOURCES:指定要包含在自定义target中的其它源文件。指定的源文件将添加到IDE项目文件中,以便于编辑,即使它们没有构建规则。
      (9).VERBATIM:对于构建工具,命令的所有参数都将正确转义(escaped properly),将正确转义命令的所有自变量,以便调用的命令接收每个参数不变。建议使用 VERBATIM,因为它可以实现正确的行为。当未指定VERBATIM时,行为是特定于平台的。
      (10).USES_TERMINAL:如果可能,该命令将被授予直接访问终端(terminal)的权限。
      (11).WORKING_DIRECTORY:使用给定的当前工作目录执行命令。如果是相对路径,会被解释为相对于当前源目录对应的构建树目录。

message("#### test_${TEST_CMAKE_FEATURE}.cmake ####")

# 创建一个空的target:add,在build目录下并不会生成add
add_custom_target(add)
if(TARGET add)
    message("target add") # print
endif()

file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/docs)
add_custom_target(DOCUMENTATION
    ALL
    COMMAND ${CMAKE_COMMAND} -E echo_append "**** Building API Documentation..."
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/docs
    COMMAND ${CMAKE_COMMAND} -E echo "**** Done."
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/docs
    COMMENT "**** test cmake command: add_custom_target"
    VERBATIM
)
if(TARGET DOCUMENTATION)
    message("target DOCUMENTATION") # print
endif()

      执行测试代码需要多个文件

      build.sh内容如下:

#! /bin/bash

# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \
		find_library find_path find_file find_program find_package \
		cmake_policy cmake_minimum_required project include \
		string list set foreach message option if while return \
		math file configure_file \
		include_directories add_executable add_library target_link_libraries install \
		target_sources add_custom_command add_custom_target)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

if [[ ! -d "build" ]]; then
	mkdir build
	cd build
else
	cd build
fi

echo "==== test $1 ===="

# test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
# test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
cmake -DTEST_CMAKE_FEATURE=$1 ..
# It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
make
# make install # only used in cmake files with install command

      CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)

message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

      test_add_custom_target.cmake内容为上面的所有测试代码段。

      另外还包括三个目录:include,source,samples,它们都是非常简单的实现,仅用于测试,如下:

      可能的执行结果如下图所示:

      GitHub: https://github.com/fengbingchun/Linux_Code_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue中使用visibilitychange事件来获取页面当前可见性

前言 在系统中,如果有打开新页面进行相关操作,若是有关联操作就需要通过判断页面的可见性来进行后绪的操作 一、触发visibilitychange变更的情况 页面的可见性有三个层面 页面可见时,用户关闭 Tab 页或浏览器窗口。页面可见时&#xff0c…

ASP.NET Zero Core系统配置工具

ASP.NET Zero Core系统配置工具 ASP。NET Zero是具有现代复杂应用程序连接的新web应用程序的起点。使用高级页面和强大的下属,您将能够从您的时间中受益。您可以使用ASP.NET ZERO作为基础程序,直接开始开发自己的代码和业务。 ASP.NET ZERO工具选项和功能…

sklearn中的特征选择feature_selection

特征选择 概念:就是从所有的特征中,选择出有意义,对模型有帮助的特征,以避免必须将所有特征都导入模型去训练的情况。特征选择常用的方法有:过滤法,嵌入法,包装法,和降维算法 过滤…

BN128曲线

1. 引言 BN系列椭圆曲线E(Fp):y2x3b,其中b≠0E(\mathbb{F}_p):y^2x^3b,其中b\neq 0E(Fp​):y2x3b,其中b​0,由Paulo S. L. M. Barreto1 和 Michael Naehrig 在2005年论文 Pairing-Friendly Elliptic Curves of Prime Order中首…

增长思维 —— 撬动企业增长的杠杆

增长一定不是只适用于互联网公司 营销:获客 增长:研究的是用户全生命周期 增长思维:以供需分析为基础,从用户全生命周期寻找增长点的方法论 这个模型的核心是啊哈时刻,指的是一个产品对用户价值感最强的那个点 一个…

画饼画到世界地图上:按比例呈现多组数据

地图是数据可视化的一部分,做群体遗传学、动物学、植物学、微生物学等的朋友经常用到世界地图,比如绘制不同小麦品种的世界分布。一般情况下,我们根据经纬度将数据标注在地图上,然而有些时候,我们会需要更高级的标注&a…

Apache doris 1.2.0 release

亲爱的社区小伙伴们,再一次经历数月的等候后,我们很高兴地宣布,Apache Doris 于 2022 年 12 月 7 日迎来 1.2.0 Release 版本的正式发布!有近 118 位 Contributor 为 Apache Doris 提交了超 2400 项优化和修复,感谢每一…

Ubuntu 22.04 桌面美化之Mac Big Sur风格

Ubuntu 默认的桌面也是一个不错的样式,但千篇一律的主题很容易让人疲惫。本文描述了如何通过安装 gnome 桌面主题和动画,使桌面趋向于 Mac 的样式。 美化后的样式如下,请参考: 一、主题和图标美化 1.1 安装 tweaks 打开终端&…

抽奖小程序怎么做?

抽奖小程序怎么做?大概需要多少钱? 价格方面,平台按年收费,一年1498至2498元。 明码标价,7天退款制度,随时退。 抽奖小程序怎么做步骤: 1.进入第三方抽奖小程序制作平台官网注册账号并登录。 抽奖小程…

Kubernetes集群安装卸载

生命无罪,健康万岁,我是laity。 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它在空虚时,用爱欲来填充; 第三次,在困难和容易之…

银河麒麟服务器系统V10开启root用户自动登录的图文教程

HI,最近公司拿回来一个联想服务器,配置还可以啊,所以就想着在本地搭建一套常用的测试环境,但是这个服务器是扁平的,不像是主机那样,这种是锁定在主机箱上的,而且噪音很大,一直嗡嗡嗡的,所以打算弄好之后放在离我远一些的地方,不然真的没法工作,全是噪音,系统都部署…

transformer14

太强了都连载14了~~ 这次是无残差连接或归一化层,也能成功训练深度 尽管取得了很多显著的成就,但训练深度神经网络(DNN)的实践进展在很大程度上独立于理论依据。大多数成功的现代 DNN 依赖残差连接和归一化层的特定排列&#xff…

ROS多机通信(ssh控制)

这种方法需要在局域网范围内进行,通信距离取决于WIFI模块的传播距离 1、连接同局域网 将主机和从机连接相同的网络,在同一局域网内。例如192.168.0.*(前三位相同) 网络会自动给每个机器一个IP 2、安装SSH sudo apt-get insta…

SpringBoot自动配置的原理-@SpringBootApplication

文章目录1自动配置原理1.1 SpringBootConfiguration1.2.ComponentScan1.3 EnableAutoConfiguration2 为什么不使用 Import 直接引入自动配置类学完这篇文章,可以了解到 SpringBoot 自动配置原理1自动配置原理 SpringBootConfiguration 是一个组合注解,由…

Pinely Round 1 (Div. 1 + Div. 2) E.Make It Connected(思维题/并查集+分类讨论)

题目 n(n<4e3)个点不包含自环和重边的无向图&#xff0c; 你可以执行以下操作若干次&#xff1a; 1. 选择一个点u 2. 对于每个点v(v≠u)来说&#xff0c;若u、v之间当前有一条边相连&#xff0c;则断开这条边&#xff0c; 否则在u、v之间加一条边&#xff0c;使之相连 …

C++Mysql8.0数据库跨平台编程实战(下)

CMysql8.0数据库跨平台编程实战&#xff08;下&#xff09;第六章 跨平台中文乱码问题和mysql锁1、MySQLAPIC封装策略和方法说明windows上字符集gbk和utf8互转开始写代码把测试框架搭起来linux上字符集GBK和UTF8互转ZPMysql库添加字符集转换函数并测试GBK插入utf-8的数据我们把…

Android之Zygote(下)--- SystemServer详解

SystemServer是由zygote.forkSystemServer函数fork出来的子进程&#xff0c;forkSystemServer是一个native函数&#xff0c; /dalvik/vm/native/dalvik_system_Zygote.c static void Dalvik_dalvik_system_Zygote_forkSystemServer(const u4* args, JValue* pResult) {pid_t …

ABAP学习笔记之——第十章:面向对象ALV

一、ALV ALV 是 ABAP List Viewer 的缩写&#xff0c;是实际业务中查询数据或修改数据时经常使用的程序。 1、ALV的主要功能排序功能 (Ascending/Descending); 过滤设置; 变更列宽; 变更布局; ABC 分析; 下载 Excel及 Word 文档的保存。 2、ALV的类型 Function ALV; …

java计算机毕业设计ssm校园疫情防控系统u3669(附源码、数据库)

java计算机毕业设计ssm校园疫情防控系统u3669&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Docker安装以及容器使用笔记

我们知道容器是一个打包了应用和相关依赖的盒子,那怎么去操控这个盒子呢? 这一篇我通过一个简单的aspnetcore程序来加深对盒子的理解,使用之前先 安装一下Docker的环境。 一:Docker的安装 官方下载地址:Install Docker Engine on CentOS | Docker Documentation ,跟着文…