(七)CMake变量及其设置

关于CMAKE系统内置的变量,可以在此查看:https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html

一、CMake变量

变量是CMake语言的最基本的存储单元。变量的值始终为字符串类型,尽管一些命令将会将其理解为其他类型的值。命令set()unset()用于显式地设置或重置一个变量,其他命令有可能改变变量的语义。变量名是区分大小写、可以是几乎所有的文本类型,但是我们还是建议大家命名只是用加(+)、减(-)和点划线(-.)。变量可以通过setunset的选项设置不一样的范围:

  • 函数范围
  • 目录范围
  • 永久缓存

如何打印一个变量?使用message函数,分为三个消息类型:FATAL_ERROR(致命错误) WARNING(警告) STATUS(正常)

message(WARNING "OpenCV requires Android SDK tools revision 14 or newer.")

二、设置一个普通变量(Set Normal Variable)

通过命令Set可一个普通、缓存和环境变量的值。语法格式:

set(<variable> <value>... [PARENT_SCOPE])

...这一部分可以是零个以上的值,也就是意味着可以为空。多个参数将以分号分隔的列表形式连接,以形成要设置的实际变量值。如果值为空,那么等价于unset

访问一个值,格式${} 。不太理解为什么CMake变量设置简单(不用带任何符号),使用起来复杂(美元符号+大括号包裹要使用的变量名)

三、CMAKE内置变量

  1. CMAKE_BINARY_DIR
    PROJECT_BINARY_DIR
    _BINARY_DIR顶层二进制目录(静态)

CMake编译系统的二进制相关的目录其实指的都是cmake命令。你在哪里调用这个二进制cmake,其的目录就在哪里。

  1. CMAKE_SOURCE_DIR
    PROJECT_SOURCE_DIR
    _SOURCE_DIR 主cmake所在路径(静态)

CMake编译系统中源CMakeLists.txt目录。需要理解的一个概念是CMake编译系统中,源文件指的是CMakeLists.txt。这个是指整个编译系统最上层的CMakeLists.txt所在的目录,有点像是Workspace目录。

  1. CMAKE_CURRENT_SOURCE_DIR 当前正在处理的源文件目录

CMake编译树中可能包含多个CMakeLists.txt,前面我们知道顶层CMakeLists.txt由变量CMAKE_SOURCE_DIR表示,CMake编译系统会分别进入不同的CMakeLists.txt所在的目录执行cmake命令,此时进入的子目录就是CMAKE_CURRENT_SOURCE_DIR

  1. CMAKE_CURRRENT_BINARY_DIR CMake当前工作目录

如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 编译,他指的是 target 编译目录。
使用我们上面提到的 ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。
使用 SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。

  1. CMAKE_CURRENT_LIST_FILE

输出调用这个变量的 CMakeLists.txt 的完整路径

  1. CMAKE_CURRENT_LIST_LINE

输出这个变量所在的行

  1. CMAKE_MODULE_PATH

这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。比如SET(CMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake)这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

  1. EXECUTABLE_OUTPUT_PATH 和
    LIBRARY_OUTPUT_PATH

分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。

  1. PROJECT_NAME

返回通过 PROJECT 指令定义的项目名称。

  1. CMAKE_SYSTEM

返回系统名称。Linux下是返回Linux内核版本,如Linux-5.13.0-35-generic

  1. CMAKE_SYSTEM_NAME

系统平台名称。如LinuxFreeBSDWindows

  1. CMAKE_SYSTEM_VERSION

系统版本号。如5.13.0-35-generic

  1. CMAKE_SYSTEM_PROCESSOR

处理器名称。如:x86_64

  1. UNIX WIN32 APPLE

这个通常会被用在根据不同平台选择额外的编译选项,一个典型的应用就是使用M_PI的值,在WINDOWS下除了需要定义cmath/math.h外还需要定义一个宏:_USE_MATH_DEFINES

IF (WIN32)
    add_compile_definitions(_USE_MATH_DEFINES)
ELSEIF (APPLE)
    MESSAGE(STATUS "Now is Apple systens.")
ELSEIF (UNIX)
    MESSAGE(STATUS "Now is UNIX-like OS's.")
ENDIF ()
  1. CMAKE_MAJOR_VERSION CMAKE_MINOR_VERSION CMAKE_PATCH_VERSION

以2.8.6作为例子,2表示主版本号,8表示次版本号,6表示补丁等级

  1. CMAKE_C_COMPILER CMAKE_CXX_COMPILER

C编译器和C++编译器,也可以通过ADD_DEFINITION来指定,默认为/usr/bin/gcc /usr/bin/c++

  1. CMAKE_C_FLAGS CMAKE_CXX_FLAGS

编译时传递给编译器的选项,如-g

  1. CMAKE_INCLUDE_PATH

头文件包含路径。默认为空,配合指令FIND_FILE和FIND_PATH使用

  1. CMAKE_LIBRARY_PATH

库文件搜索路径。默认为空,配合FIND_LIBRARY使用

  1. CMAKE_INSTALL_PREFIX

定义cmake默认安装路径。不加定义则为/usr/local

  1. CMAKE_CURRENT_BINARY_DIR

默认为空。指定命令find_package find_program find_library find_filefind_path的前缀。

  1. CMAKE_MODULE_PATH

默认为空。CMake为上百个软件包提供了查找器(FindXXX.cmake),使用非CMake自带的查找器需要指定目录,也就是设定CMAKE_MODULE_PATH,非自带的需要配合FIND_PACKAGE

  1. CMAKE_BUILD_TYPE

控制构建类型。None默认,Debug带调试,Release发布版本。你可以通过命令行指定,如: cmake -DCMAKE_BUILD_TYPE=Debug

  1. BUILD_SHARED_LIBS

所有程序库的目标设置为共享库,如果没有设置且没有ADD_LIBRARY,默认生成静态库。

  1. EXECUTABLE_OUTPUT_PATH

定义目标二进制文件存放位置,默认为空

  1. LIBRARY_OUTPUT_PATH

定义目标链接库文件存放位置,默认为空

四、C/C++相关

对于gcc编译器选项而言,

set(CXX  "-CXX -Wall -pthread")
set(CMAKE_CXX_FLAGS ${CXX})

其实若只有一个参数,可以这么写:

set(CMAKE_CXX_FLAGS -pthread)

[1] https://www.cnblogs.com/xianghang123/p/3556425.html

你可能感兴趣的:(编译工具,CMake,变量)