Per*_*n93 9 cmake cmake-modules cmake-language
我正在使用一些外部库,这些库作为 git 子模块包含在该add_subdirectory
命令中。其中一些正在使用旧版本的 cmake,并发出有关策略 CMP0048 和 CMP0077 的警告。
有没有办法关闭这些库的所有 cmake 警告?
我尝试在包含项目之前明确设置策略,OLD
但没有帮助。
我不想编辑 git 子模块中的任何文件,因为当有人必须克隆我的项目的存储库并在他们的计算机上构建它时,就会有额外的步骤。
小智 1
我知道这是一个老问题,但如果有人偶然发现同样的问题,这里是我的发现。
在调用之前设置策略add_subdirectory()
将不起作用,因为cmake_minimum_required()根据所需版本隐式设置一组特定的策略,这可能会覆盖设置的策略。此外,OLD
即使没有覆盖它们,将它们显式设置为也没有效果,因为因为OLD
它是该版本的默认值或因为它是显式设置的,所以没有区别。在这两种情况下都会发出警告,因为正如每个策略的文档所述,旧行为根据定义已被弃用。
我可以想到以下解决方案:
使用未记录的变量CMAKE_SUPPRESS_DEVELOPER_WARNINGS
,该变量也在传递-Wno-dev
命令行时设置(请参阅cmake.cxx)。由于您可能不希望这对您的项目产生影响并禁用所有开发人员警告,因此您应该在调用后恢复原始值add_subdirectory()
:
set(no_dev_warnings_backup "$CACHE{CMAKE_SUPPRESS_DEVELOPER_WARNINGS}")
set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ON CACHE INTERNAL "" FORCE)
add_subdirectory(...)
set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ${no_dev_warnings_backup} CACHE INTERNAL "" FORCE)
Run Code Online (Sandbox Code Playgroud)
该变量可能没有记录,因此不如记录的变量那么可靠,但我不会太担心它。它自 CMake 2.x 时代以来就已经存在,并且不太可能去任何地方。
将CMAKE_POLICY_DEFAULT_CMP<NNNN>设置为NEW
:
set(CMAKE_POLICY_DEFAULT_CMP0048 "NEW")
set(CMAKE_POLICY_DEFAULT_CMP0077 "NEW")
add_subdirectory(...)
Run Code Online (Sandbox Code Playgroud)
请注意,这不仅会禁用警告,还会改变 CMake 处理受影响CMakeLists.txt
文件的方式。这可能会破坏您的外部库的构建!
使用CMAKE_PROJECT__INCLUDE或其相关变量之一将一些 CMake 代码注入到外部库的构建中。然后,注入的代码可以调用cmake_policy(SET CMP<NNNN> NEW)
来覆盖该策略。请注意,就像 2. 解决方案一样,这可能会破坏构建!
您可以使用FetchContent来代替 git 子模块,它会获取外部库并调用add_subdirectory()
它们。由于与ExternalProjectFetchContent
非常相关,它允许修补检索到的源,因此您可以修复/自定义外部库的构建:
include(FetchContent)
find_package(Patch REQUIRED)
FetchContent_Declare(myextlib
GIT_REPOSITORY <url>
GIT_TAG <tag_or_hash>
PATCH_COMMAND "${Patch_EXECUTABLE}" -p1 < path/to/myextlib.patch
)
FetchContent_MakeAvailable(myextlib)
Run Code Online (Sandbox Code Playgroud)
有关差异和补丁的更多信息可以在这里找到。或者,您也可以使用git apply作为补丁命令,因为无论如何您都使用 Git。
我建议使用 1 或 4。方法 4 是最灵活的,因为如果有必要,您也可以在其他方面改进构建,但它也是最复杂的一种,因为每当您更改外部库的版本时,还需要处理您的补丁并检查它们是否仍然有效等。如果您不需要这种灵活性并且只关心禁用警告,则方法 1 将是最直接的解决方案。
归档时间: |
|
查看次数: |
666 次 |
最近记录: |