一. 简介
前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下:
CMakeLists.txt语法规则:部分常用命令说明一-CSDN博客
CMakeLists.txt语法规则:部分常用命令说明二-CSDN博客
CMakeLists.txt语法规则:部分常用命令说明三-CSDN博客
本文继续学习 CMakeLists.txt语法中部分常用命令。
二. CMakeLists.txt语法规则:部分常用命令
1. project 命令
project
命令用于设置工程名称:
# 设置工程名称为 HELLO
project(HELLO)
执行这个之后会引入两个变量:
HELLO_SOURCE_DIR
和
HELLO_BINARY_DIR
,注意这两个变量名的前缀就是工程名称。
HELLO_SOURCE_DIR
变量指的是
HELLO
工程源码目录、
HELLO_BINARY_DIR
变
量指的是
HELLO
工程源码的输出文件目录;
我们可以使用
message
命令打印变量,譬如
CMakeLists.txt
内
容如下所示:
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")
message(${HELLO_SOURCE_DIR})
message(${HELLO_BINARY_DIR})
进入
build
目录下,执行
cmake
:
但如果不加入 project(HELLO)命令,这两个变量是不存在的;
工程源码目录指的是顶层源码所在目录,cmake 定义了两个等价的变量 PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR,通常在 CMakeLists.txt 源码中都会使用这两个等价的变量。
通常只需要在顶层 CMakeLists.txt 源码中调用 project 即可!
set
命令用于设置变量,命令定义如下所示:
set(<variable> <value>... [PARENT_SCOPE])
设置变量的值,可选参数
PARENT_SCOPE
影响变量的作用域。
譬如
CMakeLists.txt
源码内容如下所示:
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")
# set 命令
set(VAR1 Hello) #设置变量 VAR1=Hello
set(VAR2 World) #设置变量 VAR2=World
# 打印变量
message(${VAR1} " " ${VAR2})
对应的打印信息:
通过
set
命令设置字符串列表,如下所示:
# 字符串列表
set(SRC_LIST 1.c 2.c 3.c 4.c 5.c)
此时
SRC_LIST
就是一个列表,它包含了
5
个元素(
1.c
、
2.c
、
3.c
、
4.c
、
5.c
),列表的各个元素使用分号 “
;
” 分隔,如下:
SRC_LIST = 1.c;2.c;3.c;4.c;5.c #列表
我们来测试一下,譬如
CMakeLists.txt
源码内容如下所示:
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")
# set 命令
set(SRC_LIST 1.c 2.c 3.c 4.c 5.c)
# 打印变量
message(${SRC_LIST})
执行
cmake
命令打印信息如下:
乍一看这个打印信息你是不是觉得
SRC_LIST
就是一个普通的变量(
SRC_LIST=1.c2.c3.c4.c5.c
),并不是列表呢?
事实并非如此。
我们可以修改
message
命令,将
${SRC_LIST}
放置在双引号中,如下:
# 打印变量
message("${SRC_LIST}")
再次执行
cmake
,打印信息如下:
可以看到此时打印出来的确实是一个列表,为何加了双引号就会这样呢?
SRC_LIST 是一个列表,我们用 "${MY_LIST}"
这种形式的时候,表示要让
CMake
把这个数
组的所有元素当成一个整体,而不是分散的个体。
既然是列表,那自然可以使用
list
命令对列表进行相关的操作:
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")
# 列表
set(SRC_LIST main.c world.c hello.c)
message("SRC_LIST: ${SRC_LIST}")
#列表操作
list(LENGTH SRC_LIST L_LEN)
message("列表长度: ${L_LEN}")
list(GET SRC_LIST 1 VAR1)
message("获取列表中 index=1 的元素: ${VAR1}")
list(APPEND SRC_LIST hello_world.c) #追加元素
message("SRC_LIST: ${SRC_LIST}")
list(SORT SRC_LIST) #排序
message("SRC_LIST: ${SRC_LIST}")
cmake
打印信息如下:
除此之外,在
cmake
中可以使用循环语句依次读取列表中的各个元素,后续再向大家介绍。
下一篇文章继续学习其他的 CMakeLists.txt语法的部分常用命令。