我的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政策?)。
我可以做些什么吗?
答案 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
,然后在必要时使用此变量。
这确实很难看,但是它在很大程度上完成了工作。