沉默CMP0048供应项目中的警告

Pra*_*tic 5 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.
Run Code Online (Sandbox Code Playgroud)

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

我能做些什么吗?

Ale*_*ing 4

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

\n
\n

CMake 3.15+ 中有一个使用CMAKE_PROJECT_INCLUDE_BEFORE变量的更灵活的解决方案。请参阅我的示例:

\n
$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmake\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 EnableCMP0048.cmake\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 subproj\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
cmake_minimum_required(VERSION 2.8.12) # Never do this\nproject(subproj)\n
Run Code Online (Sandbox Code Playgroud)\n

输入cmake/EnableCMP0048.cmake

\n
cmake_policy(SET CMP0048 NEW)\n
Run Code Online (Sandbox Code Playgroud)\n

输入./CMakeLists.txt

\n
cmake_minimum_required(VERSION 3.15)\nproject(test VERSION 1.0.0)\n\nset(CMAKE_PROJECT_INCLUDE_BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/EnableCMP0048.cmake")\nadd_subdirectory(subproj)\nunset(CMAKE_PROJECT_INCLUDE_BEFORE)  # if you don\'t want to affect subsequent add_subdirectory calls.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
# Recall the top-level CMakeLists.txt had project(test).\nset(PROJECT_VERSION "${test_VERSION}")\nset(PROJECT_VERSION_MAJOR "${test_VERSION_MAJOR}")\nset(PROJECT_VERSION_MINOR "${test_VERSION_MINOR}")\nset(PROJECT_VERSION_PATCH "${test_VERSION_PATCH}")\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n