继上一篇文章(点击查看),继续吧。
上一篇提到CMake除了是一个命令行工具外,也是一门图灵完备的语言。
那针对语言关键字,继续深入了解一下语言特性吧。
学习任何一门语言,一般都先学以下输出,即打印消息到控制台。
这里也不例外。
1、输出信息message
1.1、格式:
message([<mode>] "message to display" ...)
mode是可选,message可变参数,即可以是一个参数,也可以是多个参数。
1.2、新建一个空工程测试下吧
mkdir -p /home/lirizhong/cmake/src/message
cd /home/lirizhong/cmake/src/message
新建CMakeLists.txt源代码文件,内容如下:
cmake_minimum_required(VERSION 3.10)
project("message")
message("-------------------------------------------------")
message("hello" " " "world")
message("-------------------------------------------------")
1.3、开始构建,即执行CMake语言程序。
mkdir build
cd build
cmake ..
输出内容:
...
-------------------------------------------------
hello world
-------------------------------------------------
...
至于mode参数,可以自己试下:
(none) = 重要信息
STATUS = 提醒信息
WARNING = 警告信息,会继续执行
AUTHOR_WARNING = 警告信息,会继续执行
SEND_ERROR = 错误信息,会继续执行,但跳过生成
FATAL_ERROR = 致命错误信息,停止执行
2、变量
CMake变量只支持一种基础数据类型,那就是字符串,虽然有不少的函数、宏可以将字符串转换成其他类型,但对CMake来说就只有一种数据类型。
2.1、说明
通过set命令可设置变量,${变量名}可获取变量值。
变量的作用域包括3种:
2.2、函数作用域
在function内部声明的变量
function(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endfunction(<name>)
2.3、目录作用域
CMake工程就是一个目录树,每个需要构建的目录有CMakeLists.txt文件,CMake在加载CMakeLists.txt后,会自动为该目录维护以下CMake预定义的变量,当然,CMakeLists.txt也可以定义业务侧的变量,或者为CMake预定义的变量重新赋值。然后对子目录而言,先继承父目录的所有变量,然后针对一些变量设置为子目录作用域。
2.4、Cache域
即多个子工程间共享,只要在一个工程内声明了,其他子工程就能读取到。
声明变量:
2.5、普通变量
格式:
set(<variable> <value>... [PARENT_SCOPE])
需要说明的是如果使用了PARENT_SCOPE,则把变量作用域提升到父亲作用域。很少用这个特性。一般都是set(变量名称 "变量值")。
2.6、Cache变量
格式:
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
Cache变量提供了能力,用于可以通过“cmake -D变量名=变量值“修改,而不是使用代码设置的值,除非使用强制参数FORCE。docstring一般使用一段字符串描述该变量的用途。而类型type包括如下值:
BOOL
Boolean ON/OFF value
FILEPATH
Path to a file on disk
PATH
Path to a directory on disk
STRING
2.7、环境变量
格式:
set(ENV{<variable>} <value>...)
实践一下吧:
2.7.1、验证函数作用域
修改CMakeLists.txt源代码文件,内容如下:
cmake_minimum_required(VERSION 3.10)
project("variable")
function(tars_build_server APP SERVER)
set(TARS_PATH "/usr/local/tars/cpp")
endfunction(tars_build_server)
tars_build_server("example" "HelloServer")
message("-------------------------------------------------")
message("TARS_PATH:" ${TARS_PATH})
message("-------------------------------------------------")
set(TARS_PATH "/usr/local/tars/cpp")
message("\n")
message("-------------------------------------------------")
message("TARS_PATH:" ${TARS_PATH})
message("-------------------------------------------------")
构建运行看下:
cmake ..
输出内容:
...
-------------------------------------------------
TARS_PATH:
-------------------------------------------------
-------------------------------------------------
TARS_PATH: /usr/local/tars/cpp
-------------------------------------------------
...
2.7.2、验证Cache作用域
修改CMakeLists.txt源代码文件,内容如下:
cmake_minimum_required(VERSION 3.10)
project("variable")
set(TARS_PATH "/usr/local/tars/cpp" CACHE PATH "Set Tars Install Path")
message("-------------------------------------------------")
message("TARS_PATH: ${TARS_PATH}")
message("-------------------------------------------------")
构建运行看下:
cmake ..
输出内容:
...
-------------------------------------------------
TARS_PATH: /usr/local/tars/cpp
-------------------------------------------------
...
构建运行看下:
cmake .. -DTARS_PATH=/home/lirizhong/tars/cpp
输出内容:
...
-------------------------------------------------
TARS_PATH: /home/lirizhong/tars/cpp
-------------------------------------------------
...
2.7.3、验证获取变量值
上面已经有获取变量值的代码了,这里再演示下获取环境变量的值。
修改CMakeLists.txt源代码文件,内容如下:
cmake_minimum_required(VERSION 3.10)
project("variable")
message("-------------------------------------------------")
message("PATH: $ENV{PATH}")
message("-------------------------------------------------")
构建运行看下:
cmake ..
输出内容:
...
-------------------------------------------------
PATH: /home/lirizhong/.cargo/bin:/usr/local/nosqlbooster:/usr/local/pycharm/bin:/usr/local/clion/bin:/usr/local/datagrid/bin:/usr/local/idea/bin:/usr/local/goland/bin:/usr/local/go/bin:/usr/local/protoc/bin:/usr/local/maven/bin:/usr/local/java/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-------------------------------------------------
...
2.7.4、列表
格式:
set(srcs a.c b.c c.c) # sets "srcs" to "a.c;b.c;c.c"
set(x a "b;c") # sets "x" to "a;b;c", not "a;b\;c"
后续会提到如何便利列表。
好了,累了,孩子也哭了,不写了。
本文暂时没有评论,来添加一个吧(●'◡'●)