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目标时使用的文件。