使用 CMake 时忽略外部模块中的警告

Ignore warnings in external modules when using CMake

我正在使用 CMake GUI(无版本)和 CMake 3.6.1。我正在使用带有 add_subdirectory 的外部模块,它向我显示了一些我不喜欢的警告(因为烦人的污染):

CMake Warning (dev) at D:/Sources/.../external/g3log/latest/Build.cmake:11 (IF):
  Policy CMP0054 is not set: Only interpret if() arguments as variables or
  keywords when unquoted.  Run "cmake --help-policy CMP0054" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  Quoted variables like "MSVC" will no longer be dereferenced when the policy
  is set to NEW.  Since the policy is not set the OLD behavior will be used.
Call Stack (most recent call first):
  D:/Sources/.../external/g3log/latest/CMakeLists.txt:72 (INCLUDE)
This warning is for project developers.  Use -Wno-dev to suppress it.

我想在不触及外部文件的情况下隐藏这些警告。 -Wno-dev 如果它只影响外部模块(g3log)就可以了。

我试过像下面这样使用 cmake_policy 但没有效果:

cmake_policy(PUSH)
cmake_policy(SET CMP0054 OLD)
add_subdirectory(${g3log_DIR} ${CMAKE_BINARY_DIR}/../g3log)
cmake_policy(POP)

将我的评论变成答案

听起来你的外部模块确实有一个 project() 命令。这会重置 sub-module 及以下版本的政策。

为了演示可能的解决方案,假设您有一个如下所示的外部项目:

g3log/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(g3log NONE)

set(VAR1 "Hello World")
set(VAR2 "VAR1")
if ("${VAR2}" STREQUAL "${VAR1}")
    message("CMP0054 old behavior")
endif()

您现在可以将 CMAKE_POLICY_DEFAULT_CMP0054 设置为 OLD(或者更好地设置为 NEW;没有人真正想要 "OLD" 行为)以摆脱 "Policy CMP0054 is not set" 较新版本的 CMake 会收到警告:

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(PolicyOverwrite NONE)

set(CMAKE_POLICY_DEFAULT_CMP0054 NEW)
add_subdirectory(g3log)

现在您已经设置了策略 CMP0054 的默认值,如果在您的项目或您正在使用的外部项目之一中明确给出了 none,则将使用该策略。