CMP0125

3.21 版本新增。

find_file()find_path()find_library()find_program() 命令会将它们的结果缓存到由其第一个参数指定的变量中。在 CMake 3.21 之前,如果在调用之前已存在同名的缓存变量但该缓存变量没有类型,则任何同名的非缓存变量都将被丢弃,并且总是使用缓存变量(另请参阅 CMP0126 以了解不同但类似的行为)。这违反了非缓存变量应优先于同名缓存变量的约定。这种情况可能发生在用户在命令行上设置了缓存变量而未指定类型时,例如 cmake -DMYVAR=blah ... 而不是 cmake -DMYVAR:FILEPATH=blah

与上述情况相关的是,如果指定名称的缓存变量已存在且确实有类型,则各种 find_...() 命令将保持不变地返回该值。特别是,如果它包含相对路径,在这种情况下将不会转换为绝对路径。

当策略 CMP0125 设置为 OLD 或未设置时,行为如上所述。当它设置为 NEW 时,行为如下:

  • 如果在调用 find_...() 命令时存在指定名称的非缓存变量,则无论同名缓存变量是否存在,都将使用其值。在这种情况下,如果之前不存在这样的缓存变量,则不会创建缓存变量。如果指定名称的缓存变量已存在,则缓存将更新以匹配非缓存变量。

  • 各种 find...() 命令将在结果变量中始终提供绝对路径,除非缓存或非缓存变量提供的相对路径无法解析为现有路径。

此策略在 CMake 版本 3.21 中引入。它可以通过 cmake_policy()cmake_minimum_required() 设置。如果未设置,CMake 不会发出警告,并使用 OLD 行为。

注意

策略的 OLD 行为 根据定义已被弃用,并可能在未来的 CMake 版本中被移除。