【问题标题】:Ignore warnings in external modules when using CMake使用 CMake 时忽略外部模块中的警告
【发布时间】:2017-06-01 10:46:12
【问题描述】:

我正在使用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() 命令。这将重置此子模块及以下的策略。您可以尝试设置CMAKE_POLICY_DEFAULT_CMP0054 而不是调用cmake_policy()
  • 确实有一个project (g3log)。所以你说是不可能的:(?如果你愿意,你可以制定一个答案。
  • 没有。我试图说cmake_policy(SET CMP0054 ...) 不起作用,但CMAKE_POLICY_DEFAULT_CMP0054 应该。只是还没有设置测试来验证它。
  • 原谅我的无知,但是如何呢? set(CMAKE_POLICY_DEFAULT_CMP0054, OLD) ?

标签: cmake suppress-warnings cmake-gui


【解决方案1】:

把我的 cmets 变成答案

听起来你的外部模块确实有一个project() 命令。这会重置此子模块及以下模块的策略。

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

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;没有人真正想要“旧”行为)以摆脱“策略 CMP0054 未设置”警告,您将在更新时收到CMake 版本:

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(PolicyOverwrite NONE)

set(CMAKE_POLICY_DEFAULT_CMP0054 NEW)
add_subdirectory(g3log)

现在,如果在您的项目或您正在使用的外部项目之一中没有明确给出,则您已为要使用的策略 CMP0054 设置默认值。

【讨论】:

  • “没有人真正想要“旧”行为”——除了这个模块 g3log,没有人想要,不是吗? set(CMAKE_POLICY_DEFAULT_CMP0054 NEW)add_subdirectory(g3log) 之前会改变这个模块的行为,不是吗?所以更好的答案是:set(CMAKE_POLICY_DEFAULT_CMP0054 OLD) add_subdirectory(${SOURCE_BASE_EXTERNAL}/corealpi/platform/cmake/core ${CMAKE_BINARY_DIR}/corealpi/core) set(CMAKE_POLICY_DEFAULT_CMP0054 NEW)
  • @Liviu 您能否添加/发布有问题的 g3log CMake 脚本行?我从来没有遇到过有人期望我放在引号中的东西会再次评估变量名的情况(另见here)。所以例如if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 是假的,甚至 CMAKE_CXX_COMPILER_ID 确实包含 MSVC?
  • IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang") 还有github,第 23 行。我会定期理解然后忘记这种特殊的语法。
  • @Liviu 以Clang 结尾的所有内容都是正则表达式。它想匹配一个字符串,所以绝对是NEW。我认为他们没有意识到旧版本 CMake 中的这个错误("${CMAKE_CXX_COMPILER_ID}" 可以评估为1)。
  • 当我说奇怪的语法时,我不是在谈论正则表达式,而是在谈论 CMake 和引号。谢谢!可以肯定的是,我会在几天后接受答复。
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2017-08-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多