cmake 6:生成器表达式
CMake分两个阶段生成项目的构建系统:配置阶段(解析CMakeLists.txt)和生成阶段(实际生成构建环境)。生成器表达式在生成阶段进行计算,可以使用仅在生成时才能知道的信息来调整构建系统。
生成器表达式常用于根据不同配置动态生成不同的内容,比如
- 条件链接:针对同一个编译目标,debug版本和release版本链接不同的库文件。
- 条件定义:针对不同编译器,定义不同的宏。
- 条件编译:针对不同编译器,使用不同的头文件,配置不同的编译选项。
常用的生成器表达式
1. 条件表达式
Cmake支持两种形式的条件生成器表达式:
形式1:如果condition
为1
,则求值为true_string
,如果condition
为0
,则求值为false_string
。
$<IF:condition, true_string, false_string>
形式2:如果condition
为1
,则求值为true_string
,如果condition
为0
,则求值为空字符串。
$<condition:true_string>
可以通过以下生成器表达式将string转为condition
:
$<BOOL:string>
如果
string
为空string
是不区分大小写的等于0
、FALSE
、OFF
、N
、NO
、IGNORE
或 ` NOTFOUND`(不区分大小写)string
以后缀-NOTFOUND
结尾(区分大小写)
则将 string
转换为 0
,否则将string转换为或 1
。
2. 逻辑运算表达式
AND
conditions是以逗号分隔的布尔表达式列表,所有这些表达式的计算结果必须为1
或0
。
如果所有条件都为1
,则整个表达式的计算结果为1
,否则为0
。
$<AND:conditions>
OR
conditions是以逗号分隔的布尔表达式列表,所有这些表达式的计算结果必须为1
或0
。
如果所有条件中至少一个为1
,则整个表达式的计算结果为1
,否则为0
。
$<OR:conditions>
NOT
condition
必须是 0
或 1
。如果为1
,则计算结果为1
,否则为0
。
$<NOT:condition>
3. 字符串比较表达式
$<STREQUAL:string1,string2>
如果 string1
和 string2
相等,则计算结果为1
,否则为 0
。比较区分大小写。
$<EQUAL:value1,value2>
如果value1
和value2
在数值上相等,则计算结果为1
,否则为0
。
4. 配置表达式
配置名称
$<CONFIG>
如果配置是逗号分隔列表cfgs
中的任何一个条目,则为1
,否则为0
。
不区分大小写。
$<CONFIG:cfgs>
5. 字符串值表达式
平台
-
$<PLATFORM_ID>
当前系统的 CMake 平台 id。
-
$<PLATFORM_ID:platform_ids>
如果 CMake 的平台 ID 与逗号分隔列表
platform_ids
中的任何一个条目匹配,则为1
,否则为0
。
编译器版本
- $<C_COMPILER_VERSION>
-
$<CXX_COMPILER_VERSION> 使用的C/C++编译器的版本。
- $<C_COMPILER_VERSION:version>
- $<CXX_COMPILER_VERSION:version>
如果C/C++编译器的版本与
version
匹配,则为1
,否则为0
。
编译器语言和ID
- $<C_COMPILER_ID>
-
$<CXX_COMPILER_ID> 使用的C/C++编译器的 CMake 编译器 ID。
- $<C_COMPILER_ID:compiler_ids>
-
$<CXX_COMPILER_ID:compiler_ids>
compiler_ids
是以逗号分隔的列表。如果C/C++编译器的 CMake 编译器 ID 与compiler_ids
中的任何一个条目匹配,则为1
,否则为0
。 -
$<COMPILE_LANGUAGE>
获取编译选项时源文件的编译语言。
- $<COMPILE_LANGUAGE:languages>
当用于编译单元的语言与 languages
中任何逗号分隔的条目匹配时,则为1
,否则为 0
。
此表达式可用于指定编译选项、编译定义以及在目标中包含特定语言的源文件的目录。
链接器语言和 ID
-
$<LINK_LANGUAGE>
获取链接选项时目标的链接语言。
-
$<LINK_LANGUAGE:languages>
当用于链接步骤的语言与
languages
中任何逗号分隔的条目匹配时,则为1
,否则为0
。该表达式可用于指定目标中特定语言的链接库、链接选项、链接目录和链接依赖项。
6. 目标相关表达式
-
$<TARGET_EXISTS:target>
如果
target
作为 CMake 目标存在,则为1
,否则为0
。 -
$<TARGET_NAME_IF_EXISTS:target>
如果目标存在,则为目标名称
target
,否则为空字符串。 -
$<TARGET_FILE:target>
target
二进制文件的完整路径。 -
$<TARGET_FILE_BASE_NAME:target>
target
的基本名称,即没有前缀和后缀的$<TARGET_FILE_NAME:target>
。例如,如果
target
文件名为libbase.so
,则基本名称为base
。 -
$<TARGET_FILE_PREFIX:target>
target
文件名的前缀(例如lib
) -
$<TARGET_FILE_SUFFIX:target>
target
文件名的后缀(扩展名为.so
或.exe
)。 -
$<TARGET_FILE_NAME:target>
target
文件名。 -
$<TARGET_FILE_DIR:target>
target
二进制文件的目录。 -
$<TARGET_LINKER_FILE:target>
链接到
target
目标时使用的文件。