<Linux开发> linux开发工具-之-CMake语法[细见2]
Cmake相关文章如下:
<Linux开发> linux开发工具-之-CMake简单例程[初见]
<Linux开发> linux开发工具-之-CMake简单例程[再见]
<Linux开发> linux开发工具-之-CMake语法[细见1]
<Linux开发> linux开发工具-之-CMake语法[细见2]
<Linux开发> linux开发工具-之-CMake语法[细见3]
本片是衔接 <Linux开发> linux开发工具-之-CMake语法[细见1] 继续补充的。
四、一些常用变量(variable)
前面介绍了一些命令(command),接下来介绍一些变量(variable);变量(variable)也是编写CMakeLists.txt常用的方法。以存在的变量(variable)可以在cmake的官网查看:变量(variable)
从官网上的说明可看到变量(variable)分为多种类型,如下:
名称 | 类型 |
---|---|
Variables that Provide Information | 提供信息的变量 |
Variables that Change Behavior | 改变行为的变量 |
Variables that Describe the System | 描述系统的变量 |
Variables that Control the Build | 控制生成的变量 |
Variables for Languages | 语言的变量 |
Variables for CTest | CTest的变量 |
Variables for CPack | CPack的变量 |
Variable Expansion Operators | 可变展开算子 |
Internal Variables | 内部变量 |
下面列举一部分类型的变量进行解析。读者也可自行在官网查阅。
五、常用变量(variable)之提供信息的变量
提供信息的变量,顾名思义,这类变量可以提供某种信息,既然如此,那么我们一般情况下只需要读取变量即可,而不需要对变量进行修改,这类变量有很多,这里列举部分进行说明:
变量 | 说明 |
---|---|
PROJECT_SOURCE_DIR | 这是在当前目录作用域或其父目录中对project()命令进行的最后一次调用的源目录。工程顶层目录,也就是顶层 CMakeLists.txt 源码所在目录,该文件也是第一个编译的cmake文件 |
PROJECT_BINARY_DIR | 项目的生成目录的完整路径。工 程 BINARY_DIR , 也 就 是 顶 层 CMakeLists.txt 源码的BINARY_DIR |
CMAKE_SOURCE_DIR | 指向源树顶层的路径。这是当前CMake源树顶层的完整路径。对于源代码内构建,这将与CMAKE_BINARY_DIR相同。与 PROJECT_SOURCE_DIR 等价 |
CMAKE_BINARY_DIR | 生成树顶层的路径。这是当前CMake构建树的顶层的完整路径。对于源代码内构建,这将与CMAKE_source_DIR相同。与 PROJECT_BINARY_DIR 等价 |
CMAKE_CURRENT_SOURCE_DIR | 当前正在处理的源目录的路径。这是cmake当前正在处理的源目录的完整路径。当前源码所在路径 |
CMAKE_CURRENT_BINARY_DIR | 当前正在处理的二进制目录的路径。这是当前cmake正在处理的生成目录的完整路径。add_subdirectory()添加的每个目录都将在构建树中创建一个二进制目录,并且在处理过程中会设置此变量。对于源代码内构建,这是当前正在处理的源目录。 |
CMAKE_MAJOR_VERSION | CMAKE_version变量的第一个版本号组件。cmake 的主版本号 |
CMAKE_MINOR_VERSION | CMAKE_version变量的第二个版本号组件。cmake 的次版本号 |
CMAKE_VERSION | CMake版本字符串为三个由分隔的非负整数分量。以及可能跟在后面的-和其他信息。前两个组件表示功能级别,第三个组件表示bug修复级别或开发日期,cmake 的版本号(主+次+修订) |
PROJECT_VERSION_MAJOR | PROJECT_version变量的第一个版本号组件,由PROJECT()命令设置。工程的主版本号 |
PROJECT_VERSION_MINOR | PROJECT_version变量的第二个版本号组件,由PROJECT()命令设置。工程的次版本号 |
PROJECT_VERSION | 最近一次调用project()命令的VERSION选项的值(如果有的话)。工程的版本号 |
CMAKE_PROJECT_NAME | 顶级项目的名称。此变量保存由project()命令在顶级CMakeLists.txt文件中指定的项目名称。如果顶级CMakeLists.txt包含多个project()调用,则该顶级CMakeLists.txt中最近调用的一个将决定CMAKE_project_name包含的名称。 |
PROJECT_NAME | 给定给project命令的项目的名称。这是当前目录范围或更高版本中最近调用的project()命令的名称。 |
使用示例如下:
#设置最低要求的cmake版本
cmake_minimum_required(VERSION 3.5)
#设置工程项目的名称
project(WATER )
#点加扫描子目录
add_subdirectory(OneFu_Hello)
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
message(${CMAKE_MAJOR_VERSION})
message(${CMAKE_MINOR_VERSION})
message(${CMAKE_VERSION})
project(WATER VERSION 11.22.2017.123)
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})
message(${PROJECT_VERSION})
message(${CMAKE_PROJECT_NAME})
message(${PROJECT_NAME})
运行输出如下:
例2:
Cmake/Cmake_test10/CMakeLists.txt内容如下:
#设置最低要求的cmake版本
cmake_minimum_required(VERSION 3.5)
#设置工程项目的名称
project(WATER )
#点加扫描子目录
add_subdirectory(OneFu_Hello)
message("顶级CMakeLists.txt输出开始")
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
message(${CMAKE_MAJOR_VERSION})
message(${CMAKE_MINOR_VERSION})
message(${CMAKE_VERSION})
project(WATER VERSION 11.22.2017.123)
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})
message(${PROJECT_VERSION})
message(${CMAKE_PROJECT_NAME})
message(${PROJECT_NAME})
message("顶级CMakeLists.txt输出结束!!!")
add_subdirectory(src)
Cmake/Cmake_test10/src/CMakeLists.txt内容如下:
message("src CMakeLists.txt输出开始")
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
message(${CMAKE_MAJOR_VERSION})
message(${CMAKE_MINOR_VERSION})
message(${CMAKE_VERSION})
project(WATER VERSION 66.55.2023.321)
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})
message(${PROJECT_VERSION})
message(${CMAKE_PROJECT_NAME})
message(${PROJECT_NAME})
message("src CMakeLists.txt输出结束!!!")
运行效果如下:
有输出信息可知,相关提供信息的变量可获取得到。
详细介绍可参考官方:提供信息的变量
六、常用变量(variable)之改变行为的变量
改变行为的变量,顾名思义,意味着这些变量可以改变某些行为,所以我们可以通过对这些变量进行设置以改变行为。这类变量也有很多,这里列举部分进行说明:
变量 | 说明 |
---|---|
BUILD_SHARED_LIBS | 全局标志,用于在启用时使add_library()创建共享库。控制 cmake 是否生成动态库 |
CMAKE_BUILD_TYPE | 指定单个配置生成器(例如Makefile generators或Ninja)上的生成类型。典型的值包括Debug、Release、RelWithDebInfo和MinSizeRel,但也可以定义自定义构建类型。一般 release 或 debug |
CMAKE_SYSROOT | 在–sysroot标志中传递给编译器的路径。CMAKE_SYSROOT内容在–SYSROOT标志中传递给编译器(如果支持的话)。如果安装时有必要,该路径也会从RPATH/RUNPATH中剥离。CMAKE_SYSROOT还用于为find_*命令搜索的路径加前缀。对应编译器的在–sysroot 选项 |
CMAKE_IGNORE_PATH | 以分号分隔的目录列表 被各种命令忽略。设置被 find_xxx 命令忽略的目录列表 |
CMAKE_INCLUDE_PATH | 指定搜索路径的目录的分号分隔列表 对于 find_file() 和 find_path() 命令。默认情况下,它 为空,旨在由项目设置。为 find_file()和 find_path()命令指定搜索路径的目 |
录列表 | |
CMAKE_INCLUDE_DIRECTORIES_BEFORE | 用于控制 include_directories()命令的行为 |
CMAKE_LIBRARY_PATH | 指定 find_library()命令的搜索路径的目录列表 |
CMAKE_MODULE_PATH | 指定要由 include()或 find_package()命令加载的 |
CMake 模块的搜索路径的目录列表 | |
CMAKE_PROGRAM_PATH | 指定 find_program()命令的搜索路径的目录列表 |
改变行为的变量例程如下:
新建文件如下:
xxx@xxxx-Tower-PC:~/test/Cmake/Cmake_test11$ tree
.
├── build
├── CMakeLists.txt
├── OneFu_Hello
│ ├── CMakeLists.txt
│ ├── Hello
│ │ ├── CMakeLists.txt
│ │ ├── Hello.c
│ │ └── Hello.h
│ ├── OneFu
│ │ ├── CMakeLists.txt
│ │ ├── OneFu.c
│ │ └── OneFu.h
│ ├── OneFu_Hello.c
│ └── OneFu_Hello.h
└── src
├── CMakeLists.txt
└── main.c
5 directories, 12 files
Cmake/Cmake_test11/CMakeLists.txt文件内容如下:
#设置最低要求的cmake版本
cmake_minimum_required(VERSION 3.5)
#设置工程项目的名称
project(WATER )
#设置工程版本
project(HELLO VERSION 1.1.2023.001)
add_library(OneFu1 OneFu_Hello/OneFu/OneFu.c)
add_library(Hello1 OneFu_Hello/Hello/Hello.c)
#设置默认构建库类型 开启动态库
set(BUILD_SHARED_LIBS on)
add_library(OneFu2 OneFu_Hello/OneFu/OneFu.c)
add_library(Hello2 OneFu_Hello/Hello/Hello.c)
# Debug 版本
set(CMAKE_BUILD_TYPE Debug)
# Release 版本
#set(CMAKE_BUILD_TYPE Release)
#找文件
#CMAKE_INCLUDE_PATH 指定了一个目录列表,find_file()、find_path()会去这个目录列表中查找文件
#需要设置包含查找的路径否则会提示找不到
set(CMAKE_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/OneFu_Hello/OneFu/)
find_file(P_VAR OneFu.c)
message("find_file: " ${P_VAR})
#找库文件
#find_library()将会从CMAKE_LIBRARY_PATH 变量设置的目录列表中进行搜索
#需要设置包含查找的路径否则会提示找不到
set(CMAKE_LIBRARY_PATH ${PROJECT_SOURCE_DIR}/build)
find_library(V_VAR Hello1)
message("find_library: " ${V_VAR})
#CMAKE_INCLUDE_DIRECTORIES_BEFORE
#这个变量它可以改变 include_directories()命令的行为。include_directories()命令默
#认情况下会将目录添加到列表的后面,如果将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 on,则
#include_directories()命令会将目录添加到列表前面;同理若将 CMAKE_INCLUDE_DIRECTORIES_BEFORE
#设置为 off 或未设置该变量,include_directories()会将目录添加到列表后面。
#CMAKE_IGNORE_PATH
#要被 find_program()、find_library()、find_file()和 find_path()命令忽略的目录列表。
#表示这些命令不会去CMAKE_IGNORE_PATH 变量指定的目录列表中搜索。
#点加扫描子目录
#add_subdirectory(OneFu_Hello)
#add_subdirectory(src)
详细介绍可参考官方:改变行为的变量
七、常用变量(variable)之描述系统的变量
描述系统的变量,这些变量描述了系统相关的一些信息,下面列举一部分分析一下:
变量 | 说明 |
---|---|
CMAKE_HOST_SYSTEM_NAME | 正在运行cmake的操作系统的名称。此变量设置为uname-s的输出 |
CMAKE_HOST_SYSTEM_PROCESSOR | 正在运行CMake的CPU 的名称。(uname -p) |
CMAKE_HOST_SYSTEM | 正在运行CMake的OS 的组合名称。 |
CMAKE_HOST_SYSTEM_VERSION | 正在运行CMake的操作系统版本 |
CMAKE_HOST_UNIX | 如果运行 cmake 的操作系统是 UNIX 和类 UNIX,则 |
该变量为 true,否则是空值 | |
CMAKE_HOST_WIN32 | 如果运行 cmake 的操作系统是 Windows,则该变量 |
为 true,否则是空值 | |
CMAKE_SYSTEM_NAME | 目标主机操作系统的名称 |
CMAKE_SYSTEM_PROCESSOR | 目标主机的处理器名称 |
CMAKE_SYSTEM | 目标主机的操作系统(复合信息) |
CMAKE_SYSTEM_VERSION | 目标主机操作系统的版本号 |
ENV | 用于访问环境变量 |
UNIX | 与 CMAKE_HOST_UNIX 等价 |
WIN | 与 CMAKE_HOST_WIN32 等价 |
描述系统的变量例程如下:
新建文件如下:
xxx@xxx-Tower-PC:~/Cmake/Cmake_test12$ tree
.
├── build
└── CMakeLists.txt
Cmake/Cmake_test12/CMakeLists.txt文件内容如下:
# 打印信息
message("打印系统信息")
#正在运行cmake的操作系统的名称
message(${CMAKE_HOST_SYSTEM_NAME})
#正在运行CMake的CPU 的名称
message(${CMAKE_HOST_SYSTEM_PROCESSOR})
#正在运行CMake的OS 的组合名称
message(${CMAKE_HOST_SYSTEM})
#正在运行CMake的操作系统版本
message(${CMAKE_HOST_SYSTEM_VERSION})
#目标主机操作系统的名称
message(${CMAKE_SYSTEM_NAME})
#目标主机的处理器名称
message(${CMAKE_SYSTEM_PROCESSOR})
#目标主机的操作系统(复合信息)
message(${CMAKE_SYSTEM})
#目标主机操作系统的版本号
message(${CMAKE_SYSTEM_VERSION})
编译如下:
可以看到当前运行cmake的主机信息 和目标主机信息是一样,因为我们还没有设置目标主机的相关参数。这个后续讲解使用交叉编译工具时再进一步验证这个系统信息。
详细介绍可参考官方:描述系统的变量
八、常用变量(variable)之控制生成的变量
变量 | 说明 |
---|---|
EXECUTABLE_OUTPUT_PATH | 可执行程序的输出路径 |
LIBRARY_OUTPUT_PATH | 库文件的输出路径 |
CMAKE_ARCHIVE_OUTPUT_DIRECTORY | 生成时,将所有ARCHIVE目标文件放在何处 |
CMAKE_ANDROID_NDK | 当使用NDK为Android进行交叉编译时,此变量保存NDK根目录的绝对路径。该目录必须包含一个平台子目录,其中包含android-<api>目录。 |
在一般工程中用的比较多的就是EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH了,下面举例说明,其它变量后续开发例程中有涉及到在讲解。
参考Cmake_test6例程:
Cmake/Cmake_test6/src/CMakeLists.txt内容如下:
include_directories(${PROJECT_SOURCE_DIR}/lib/OneFu)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(OneFu main.c)
target_link_libraries(OneFu libOneFu)
其中第2行就是设置控制变量EXECUTABLE_OUTPUT_PATH的路径,即设置目标OneFu的输出路径。
Cmake/Cmake_test6/lib/OneFu/CMakeLists.txt内容如下:
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/libbin/OneFu)
add_library(libOneFu SHARED OneFu.c)
set_target_properties(libOneFu PROPERTIES OUTPUT_NAME "OneFu")
其中第1行就是设置控制变量LIBRARY_OUTPUT_PATH的路径,即设置目标libOneFu的输出路径。
详细介绍可参考官方:控制生成的变量
上述就是变量(variable)相关介绍,当然还有很多变量(variable),读者根据在实际开发过程,可直接在官网上查阅相关变量(variable)的使用说明。
上述是cmake基本语法的第二部分,由于篇幅过长,将再分一篇写,读者这查阅下一篇文章。