<Linux开发> linux开发工具-之-CMake语法[细见2]

<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 CTestCTest的变量
Variables for CPackCPack的变量
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_VERSIONCMAKE_version变量的第一个版本号组件。cmake 的主版本号
CMAKE_MINOR_VERSIONCMAKE_version变量的第二个版本号组件。cmake 的次版本号
CMAKE_VERSIONCMake版本字符串为三个由分隔的非负整数分量。以及可能跟在后面的-和其他信息。前两个组件表示功能级别,第三个组件表示bug修复级别或开发日期,cmake 的版本号(主+次+修订)
PROJECT_VERSION_MAJORPROJECT_version变量的第一个版本号组件,由PROJECT()命令设置。工程的主版本号
PROJECT_VERSION_MINORPROJECT_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基本语法的第二部分,由于篇幅过长,将再分一篇写,读者这查阅下一篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waterAdmin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值