沉默CMP0048供应项目中的警告

时间:2016-06-02 04:09:06

标签: cmake

我的git子模块包含CMakeLists.txt个文件,这些文件由于CMP0048而导致警告。警告看起来像这样:

CMake Warning (dev) at submodule_directory/CMakeLists.txt:24 (project):
  Policy CMP0048 is not set: project() command manages VERSION variables.
  Run "cmake --help-policy CMP0048" for policy details.  Use the cmake_policy
  command to set the policy and suppress this warning.

  The following variable(s) would be set to empty:

    PROJECT_VERSION
    PROJECT_VERSION_MAJOR
    PROJECT_VERSION_MINOR
    PROJECT_VERSION_PATCH
This warning is for project developers.  Use -Wno-dev to suppress it.

我不控制这些CMakeLists.txt文件,我不想分叉,所以没有什么可以做的,我只是希望CMake关闭它。在添加子模块目录之前使用cmake_policy(SET CMP0048 OLD)并不能解决这个问题。 (我猜project()重置cmake政策?)。

我可以做些什么吗?

2 个答案:

答案 0 :(得分:1)

如果您不关心启用策略,最简单的解决方案就是在 CMake 命令行中将 CMAKE_POLICY_DEFAULT_CMP0048 设置为 NEW 。以下答案显示了一种替代方法,可让您采取更零碎的方法。


在 CMake 3.15+ 中有一个使用 CMAKE_PROJECT_INCLUDE_BEFORE 变量的更灵活的解决方案。在此处查看我的示例:

$ tree
.
├── CMakeLists.txt
├── cmake
│   └── EnableCMP0048.cmake
└── subproj
    └── CMakeLists.txt

我假设 subproj/CMakeLists.txt 包含这个:

cmake_minimum_required(VERSION 2.8.12) # Never do this
project(subproj)

cmake/EnableCMP0048.cmake 中,输入:

cmake_policy(SET CMP0048 NEW)

./CMakeLists.txt 中,输入:

cmake_minimum_required(VERSION 3.15)
project(test VERSION 1.0.0)

set(CMAKE_PROJECT_INCLUDE_BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/EnableCMP0048.cmake")
add_subdirectory(subproj)
unset(CMAKE_PROJECT_INCLUDE_BEFORE)  # if you don't want to affect subsequent add_subdirectory calls.

现在这将启用 CMP0048 并清除子项目中提到的变量。鉴于在您的问题中,您试图通过修改政策来解决这个问题,我认为这没问题。但如果没有,您可以添加另一个脚本,cmake/RestoreProjectVars.cmake:

# Recall the top-level CMakeLists.txt had project(test).
set(PROJECT_VERSION "${test_VERSION}")
set(PROJECT_VERSION_MAJOR "${test_VERSION_MAJOR}")
set(PROJECT_VERSION_MINOR "${test_VERSION_MINOR}")
set(PROJECT_VERSION_PATCH "${test_VERSION_PATCH}")

然后在调用 set(CMAKE_PROJECT_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RestoreProjectVars.cmake") 之前的 add_subdirectory 以在调用后恢复这些变量。

答案 1 :(得分:0)

晚了聚会,但仍然没有明显的解决办法...
但是,我最终要做的是在项目的顶层目录下创建一个版本文本文件,其内容为1.2.3,然后使用file(STRINGS ...)从CMake读取它,然后将其存储在缓存变量中命名为MY_PROJECT_VERSION,然后在必要时使用此变量。

这确实很难看,但是它在很大程度上完成了工作。