CMP0074 cmake build_error ai_generated true

CMake Error: Target "mylib" has policy scope mismatch when exporting. Policy CMP0074 is not set.

ID: cmake/exported-target-policy-scope-mismatch

Also available as: JSON · Markdown · 中文
80%Fix Rate
82%Confidence
1Evidence
2024-01-10First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
CMake 3.12 active
CMake 3.18 active
CMake 3.22 active

Root Cause

When exporting a target via install(EXPORT) or export(), the target's directory-level policy settings differ from the importing project's policy scope, causing CMake to reject the export to prevent inconsistent behavior.

generic

中文

通过 install(EXPORT) 或 export() 导出目标时,目标目录级别的策略设置与导入项目的策略范围不同,导致 CMake 拒绝导出以防止行为不一致。

Official Documentation

https://cmake.org/cmake/help/latest/policy/CMP0074.html

Workarounds

  1. 85% success Ensure that the policy CMP0074 is set to NEW in both the exporting and importing projects by adding `cmake_policy(SET CMP0074 NEW)` in the top-level CMakeLists.txt before any target creation.
    Ensure that the policy CMP0074 is set to NEW in both the exporting and importing projects by adding `cmake_policy(SET CMP0074 NEW)` in the top-level CMakeLists.txt before any target creation.
  2. 80% success Use `cmake_policy(PUSH)` and `cmake_policy(POP)` around the target definition to isolate policy settings, ensuring the export sees the same scope as the importing project.
    Use `cmake_policy(PUSH)` and `cmake_policy(POP)` around the target definition to isolate policy settings, ensuring the export sees the same scope as the importing project.
  3. 75% success Regenerate the exported configuration file using `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` with a consistent policy set before calling export().
    Regenerate the exported configuration file using `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` with a consistent policy set before calling export().

中文步骤

  1. 通过在导出和导入项目的顶层 CMakeLists.txt 中在任何目标创建之前添加 `cmake_policy(SET CMP0074 NEW)`,确保两个项目中策略 CMP0074 都设置为 NEW。
  2. 在目标定义周围使用 `cmake_policy(PUSH)` 和 `cmake_policy(POP)` 隔离策略设置,确保导出看到与导入项目相同的作用域。
  3. 使用 `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` 重新生成导出配置文件,在调用 export() 之前设置一致的策略。

Dead Ends

Common approaches that don't work:

  1. Using cmake_policy(SET CMP0074 OLD) to force old behavior 65% fail

    Setting cmake_policy(SET CMP0074 OLD) in the exporting project may suppress the error but can lead to subtle build failures in the importing project.

  2. Removing export() or install(EXPORT) from CMakeLists.txt 90% fail

    Removing the export() call entirely avoids the error but breaks the intended package distribution.

  3. Manually duplicating target definition in importing project 80% fail

    Copying the target's CMakeLists.txt into the importing project manually may resolve the immediate error but creates maintenance burden and duplicates code.