CMake分两个阶段生成项目的构建系统:配置阶段(解析CMakeLists.txt)和生成阶段(实际生成构建环境)。生成器表达式在生成阶段进行计算,可以使用仅在生成时才能知道的信息来调整构建系统。

生成器表达式常用于根据不同配置动态生成不同的内容,比如

  • 条件链接:针对同一个编译目标,debug版本和release版本链接不同的库文件。
  • 条件定义:针对不同编译器,定义不同的宏。
  • 条件编译:针对不同编译器,使用不同的头文件,配置不同的编译选项。

常用的生成器表达式

1. 条件表达式

Cmake支持两种形式的条件生成器表达式:

形式1:如果condition1,则求值为true_string,如果condition0,则求值为false_string

$<IF:condition, true_string, false_string>

形式2:如果condition1,则求值为true_string,如果condition0,则求值为空字符串。

$<condition:true_string>

可以通过以下生成器表达式将string转为condition

$<BOOL:string>

如果

  • string 为空
  • string 是不区分大小写的等于 0FALSEOFFNNOIGNORE 或 ` NOTFOUND`(不区分大小写)
  • string 以后缀 -NOTFOUND 结尾(区分大小写)

则将 string 转换为 0,否则将string转换为或 1

2. 逻辑运算表达式

AND

conditions是以逗号分隔的布尔表达式列表,所有这些表达式的计算结果必须为10

如果所有条件都为1,则整个表达式的计算结果为1,否则为0

$<AND:conditions>

OR

conditions是以逗号分隔的布尔表达式列表,所有这些表达式的计算结果必须为10

如果所有条件中至少一个为1,则整个表达式的计算结果为1,否则为0

$<OR:conditions>

NOT

condition 必须是 01。如果为1,则计算结果为1,否则为0

$<NOT:condition>

3. 字符串比较表达式

$<STREQUAL:string1,string2>

如果 string1string2 相等,则计算结果为1,否则为 0。比较区分大小写。

$<EQUAL:value1,value2>

如果value1value2 在数值上相等,则计算结果为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目标时使用的文件。