Cmake常用命令(一)

概要

Cmake就是一门脚本语言,用于生成Makefile.

exec_program

在 CMakeList.txt 文件中运行一条shell命令

示例

exec_program("export LD_LIBRARY_PATH=../../third-64/protobuf/lib/ && ../../third-64/protobuf/bin/protoc --cpp_out=./c/ *.proto" ${DIR})

表示在${DIR}目录里运行字符串里的命令

cmake_minimum_required

该命令指明了对cmake的最低()版本的要求,...为低版本和高版本之间的连接符号

示例

cmake_minimum_required (VERSION 3.12.2...3.10.2)

project

语法

project(<PROJECT-NAME> [<language-name>...])

project命令用于指定cmake工程的名称,实际上,它还可以指定cmake工程的版本号(VERSION关键字)、简短的描述(DESCRIPTION关键字)、主页URL(HOMEPAGE_URL关键字)和编译工程使用的语言(LANGUAGES关键字)。

这个命令的有个附加功能,就是给默认变量进行赋值。如:

·  PROJECT_NAME:将当前工程的名称赋值给PROJECT_NAME,对于本例子,就是${PROJECT_NAME}=mytest。

·  PROJECT_SOURCE_DIR:当前工程的源码路径。

·  <PROJECT-NAME>_SOURCE_DIR:指定工程的源码路径,这个变量和PROJECT_SOURCE_DIR的区别就是,<PROJECT-NAME>_SOURCE_DIR跟具体的工程名字关联起来,若<PROJECT-NAME>就是当前工程,则该变量和PROJECT_SOURCE_DIR相等。

·  PROJECT_BINARY_DIR:当前工程的二进制路径。

·  <PROJECT-NAME>_BINARY_DIR:指定工程的二进制路径,这个变量和PROJECT_BINARY_DIR的区别就是,<PROJECT-NAME>_BINARY_DIR跟具体的工程名字关联起来,若<PROJECT-NAME>就是当前工程,则该变量和PROJECT_BINARY_DIR相等。

·  CMAKE_PROJECT_NAME:顶层工程的名称。例如当前调用的CMakeLists.txt位于顶层目录(可以理解为使用cmake命令首次调用的那个CMakeLists.txt),那么工程名还会赋值给CMAKE_PROJECT_NAME。


set

可以对三类变量进行赋值,分别是一般变量,缓存变量和环境变量

一般变量(Set Normal Variable)

语法

set(<variable> <value>... [PARENT_SCOPE])
  1. variable:只能有一个
  2. value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值
  3. PARENT_SCOPE(父作用域):作用域,传递给上层函数或者上层CMakeList.txt。不带这个参数,作用域在函数中,或本CMakeList.txt中。

缓存变量(Set Cache Entry)

语法

set(<variable> <value>... CACHE <type> <docstring> [FORCE])

和命令行中使用 -D的形式保持一致

它是跨作用域的

如果之前设置过,则不会覆盖之前的值,除非使用FORCE

环境变量

语法

set(ENV{<variable>} [<value>])

1)该命令设置的环境变量只在当前的cmake进程生效,既不会影响调用者的环境变量,也不会影响系统环境变量。(与schell环境独立)
2)如果<value>值为空或者ENV{<variable>}后没有参数,则该命令会清除掉当前环境变量的值。
3)<value>后的参数会被忽略。

Option

通常用法,CMake中的option用于控制编译流程,相当于C语言中的宏条件编译。与add_definitions配合使用。

语法

option(<variable> "<help_text>" [value])
  • variable:定义选项名称
  • help_text:说明选项的含义
  • value:定义选项默认状态,一般是OFF或者ON除去ON之外,其他所有值都为认为是OFF

使用场景 : 编译脚本传递参数 -> CMake脚本接收option -> 源代码宏

Message

make 中的 message 命令就像是 C 语言中的 printf 函数,该命令可以将变量的值显示到终端。

语法

message([<mode>] "message text" ...)

mode 的值包括 FATAL_ERRORWARNINGAUTHOR_WARNINGSTATUSVERBOSE等。我主要使用其中的 2 ——FATAL_ERRORSTATUS

FATAL_ERROR:产生 CMake Error,会停止编译系统的构建过程;

STATUS:最常用的命令,常用于查看变量值,类似于编程语言中的 DEBUG 级别信息。

"message text"为显示在终端的内容。可以将变量(缓存变量、环境变量)值打印出来,注意需要在双引号内部。

List

语法

list (subcommand <list> [args...])

subcommand为具体的列表操作子命令,例如读取、查找、修改、排序这四大类。<list>为待操作的列表变量,[args...]为对列表变量操作需要使用的参数表,不同的子命令对应的参数也不一致。

list命令即对列表的一系列操作,cmake中的列表变量是用分号;分隔的一组字符串,创建列表可以使用set命令,例如:set (var a b c d)创建了一个列表 "a;b;c;d"

列表的读取

命令

格式

解释

示例

LENGTH

list (LENGTH <list> <output variable>)

读取列表长度

<output variable>为新创建的变量,用于存储列表的长度

set (list_test a b c d) # 创建列表变量"a;b;c;d"
list (LENGTH list_test length)

GET

list (GET <list> <element index> [<element index> ...] <output variable>)

读取列表中指定索引的的元素,可以指定多个索引

0开始编号,索引0的元素为列表中的第一个元素;索引也可以是负数,-1表示列表的最后一个元素

set (list_test a b c d) # 创建列表变量"a;b;c;d"
list (GET list_test 0 1 -1 -2 list_new)

JOIN

list (JOIN <list> <glue> <output variable>)

将列表中的元素用连接字符串连接起来组成一个字符串

set (list_test a b c d) # 创建列表变量"a;b;c;d"
list (JOIN list_test -G- list_new)

SUBLIST

list (SUBLIST <list> <begin> <length> <output variable>)

用于获取列表中的一部分(子列表)

set (list_test a b c d) # 创建列表变量"a;b;c;d"
list (SUBLIST list_test 1 2 list_new)


列表的查找

命令

格式

解释

示例

FIND

list (FIND <list> <value> <output variable>)

查找列表是否存在指定的元素

set (list_test a b c d) # 创建列表变量"a;b;c;d"
list (FIND list_test d list_index)

列表的修改

命令

格式

解释

示例

APPEND

list (APPEND <list> [<element> ...])

用于将元素追加到列表

set (list_test a b c d) # 创建列表变量"a;b;c;d"
list (APPEND list_test 1 2 3 4)

FILTER

list (FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)

根据正则表达式包含或排除列表中的元素

list (FILTER list_test INCLUDE REGEX [a-z])

INSERT

list (INSERT <list> <element_index> <element> [<element> ...])

在指定位置将元素(一个或多个)插入到列表中

list (INSERT list_test 0 8 8 8 8)

POP_BACK

list (POP_BACK <list> [<out-var>...])

将列表中最后元素移除

<out-var>如果未指定输出变量,则仅仅是将原列表的最后一个元素移除。如果指定了输出变量,则会将最后一个元素移入到该变量,并将元素从原列表中移除。如果指定了多个输出变量,则依次将原列的最后一个元素移入到输出变量中,如果输出变量个数大于列表的长度,那么超出部分的输出变量未定义。

list (POP_BACK list_test)

POP_FRONT

list (POP_FRONT <list> [<out-var>...])

将列表中第一个元素移除

list (POP_FRONT list_test)

PREPEND

list (PREPEND <list> [<element> ...])

将元素插入到列表的0索引位置

list (PREPEND list_test p q r s t)

REMOVE_ITEM

list (REMOVE_ITEM <list> <value> [<value> ...])

将指定的元素从列表中移除

list (REMOVE_ITEM list_test a)

当指定的值在列表中存在重复的时候,会删除所有重复的值

 

列表的排序

命令

格式

解释

示例

REVERSE

list (REVERSE <list>)

用于将整个列表反转

list (REVERSE list_test)

SORT

list (SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])

对列表进行排序

list (SORT list_test) # 以字母顺序,按照大小写敏感方式,升序排列
list (SORT list_test COMPARE NATURAL ORDER DESCENDING) # 以自然顺序,降序排列

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值