11 CMake
常用变量
英文版的全部列表在这里:
http://www.cmake.org/Wiki/CMake_Useful_Variables
11.1 CMake
系统信息
以下皆为字串类型
CMAKE_SYSTEM
系统全名,如
"Linux-2.4.22"
,
"FreeBSD-5.4-RELEASE"
或
"Windows 5.1"
CMAKE_SYSTEM_NAME
系统名称,如
"Linux"
,
"FreeBSD" or "Windows"
CMAKE_SYSTEM_VERSION
只有
CMAKE_SYSTEM
当中版本的部分
CMAKE_SYSTEM_PROCESSOR
CPU
名称,如
"Intel(R) Pentium(R) M processor 2.00GHz"
CMAKE_GENERATOR
在命令列所指定的
Generator
名称
11.2
系统旗标
以下皆为
BOOL
类型,若是与目前所属的操作系统
/
编译器相符,其值为
True
,否则为
False
。
UNIX
如果为真,表示为
UNIX-like
的系统,包括
Apple OS X
和
CygWin
WIN3
如果为真,表示为
Windows
系统,包括
CygWin
在
MINGW
、
CYGWIN
、
MSYS
亦为
True
APPLE
如果为真,表示为
Apple
系统
MINGW
MSYS
CYGWIN
BORLAND
WATCOM
MSVC
,
MSVC_IDE
,
CMAKE_COMPILER_2005
,
MSVC60
,
MSVC70
,
MSVC71
,
MSVC80
,
MSVC90
,
MSVC10
不同版本的微软
Visual C++
专案档
CMAKE_COMPILER_IS_GNUCC
目前使用
GNU C
编译器
CMAKE_COMPILER_IS_GNUCXX
目前使用
GNU C++
编译器
CMAKE_SIZEOF_VOID_P
表示
void*
的大小(例如为
4
或者
8
),可以使用其来判断当前构建为
32
位还是
64
位
11.3
资料夹和档案信息
CMAKE_SOURCE_DIR
内容为
source tree
根目录的完整路径,也就是
CMake
开始建置过程的进入点。
CMAKE_BINARY_DIR
内容为
binary tree
根目录的完整路径,在
in-source build
的时候值与
CMAKE_SOURCE_DIR
相同。
PROJECT_SOURCE_DIR
目前正在处理中的专案最上层目录,即内含
project()
指令的
CMakeLists
所在资料夹。
PROJECT_BINARY_DIR
目前所属专案的建置根目录。在
in-source build
时和
PROJECT_SOURCE_DIR
相同。
CMAKE_CURRENT_SOURCE_DIR
目前正在处理的
CMakeLists.txt
所在位置。
CMAKE_CURRENT_BINARY_DIR
目前正在处理的
CMakeLists.txt
对应的建置资料夹位置。在
in-source build
时和
CMAKE_CURRENT_SOURCE_DIR
相同。
CMAKE_CURRENT_LIST_DIR
表示正在处理的
CMakeLists.txt
文件的所在的目录的绝对路径(
2.8.3
以及以后版本才支
持)
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
用于设置
ARCHIVE
目标的输出路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY
用于设置
LIBRARY
目标的输出路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY
用于设置
RUNTIME
目标的输出路径
11.4
编译选项
BUILD_SHARED_LIBS
将所有程式库
target
设成共享程式库,只对未指定类型的程式库有效。
CMAKE_BUILD_TYPE
控制建置类型,值可为下列之一
:
None:
编译器默认值
Debug:
产生除错信息
Release:
进行最佳化
RelWithDebInfo:
进行最佳化,但仍然会启用
DEBUG flag
MinSizeRel:
进行程式码最小化
特别要注意的是,
CMAKE_BUILD_TYPE
在
configuration time
不会自动初始化为可读取的变
量,必须要在使用者指定建置类型后才可以利用。
C
编译标志相关变量
CMAKE_C_FLAGS
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
是在呼叫
C
编译器时附加的额外选项。其中:
CMAKE_C_FLAGS
或
CMAKE_CXX_FLAGS
可以指定编译标志
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
或
CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
则指定特定构建类型
的编译标志,这些编译标志将被加入到
CMAKE_C_FLAGS
或
CMAKE_CXX_FLAGS
中去,例
如,如果构建类型为
DEBUG
,那么
CMAKE_CXX_FLAGS_DEBUG
将被加入到
CMAKE_CXX_FLAGS
中去。
C++
编译标志相关变量
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
同上,但作用在
C++
编译器 。
链接标志相关变量
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
它们类似于编译标志相关变量。如
CMAKE_EXE_LINKER_FLAGS
是生成执行档时所使用的连
结选项。
CMAKE_SHARED_LINKER_FLAGS
是生成
shared library
时所使用的连结选项。
12
自定义编程语言
在默认的情况下
CMake
会启用
C
、
C++
两种编程语言,
CMake
内建了几种常见
C
、
C++
编
译器的相关知识,通常我们不需要费心思去操心编译细节。如果是
CMake
不认得的编程语
言或编译器,就需要指定相关的编译规则。
举个具体的例子,撰写
Win32
程式时常用到
Windows Resource
语言,必须将
.rc
档案编译
成
.res
档,再和其他
C
、
C++
的
.obj
连结成最后的程式。在
Visual C++
这并不会造成任何困
扰,只要把
.rc
档当成一般的源代码一起给
add_executable()
等指令,
Visual C++
的统一
编译窗口
cl.exe
会自动处理,不劳您费心。然而其它的编译器未必有如此贴心的服务,例
如
MinGW
的
gcc
就不会主动呼叫
windres
来编译资源档,我们必须手动指定。
利用
enable_language()
可以启用一个编程语言,通常还必须要设定几个变量告诉
CMake
这
个语言的编译器名称、源代码附档名、输出档附档名、命令列格式等等。由于
CMake
对
resource file
已经有部分的知识,我们只要设定编译器名称和用法即可。
if(MINGW)
set(CMAKE_RC_COMPILER_INIT windres)
enable_language(RC)
set(CMAKE_RC_COMPILE_OBJECT
"<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
endif()
然后将
.rc
档当成一般的源代码加到
add_executable()
、
add_library()
之中,
CMake
就会自
动辨识
.rc
档并且用上面
CMAKE_RC_COMPILE_OBJECT
给定的命令列格式编译。
-
识别MinGW环境:
if(MINGW) |
这一行检查是否正在使用MinGW编译器。MinGW是一个用于编译Windows应用程序的GCC工具集。
2. 设置资源编译器:
set(CMAKE_RC_COMPILER_INIT windres) |
这行指定用于编译资源文件的编译器为windres
。windres
是MinGW的一部分,用于将.rc
文件编译为.o
对象文件。
3. 启用RC语言:
enable_language(RC) |
这行告诉CMake启用RC语言。这意味着CMake知道如何处理.rc
文件。
4. 设置资源编译命令:
set(CMAKE_RC_COMPILE_OBJECT | |
"<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") |
这里定义了如何编译一个.rc
源文件。具体来说,它指定了如何使用windres
编译器来编译资源文件。例如,它指定了输出格式为coff
(Common Object File Format),这是Windows可执行文件的标准格式。
5. 添加.rc文件到可执行文件或库中:
一旦您设置了CMake以识别和处理.rc
文件,您可以将这些文件视为常规的源代码文件,并将其添加到add_executable()
或add_library()
中。CMake会自动知道如何处理这些文件,并使用上面定义的命令进行编译