【问题标题】:Cygwin's cmake does not match for CMAKE_SYSTEM_NAMECygwin 的 cmake 与 CMAKE_SYSTEM_NAME 不匹配
【发布时间】:2014-02-24 18:18:25
【问题描述】:

我在使用 cmake 的 cygwin 上有一个奇怪的行为。 我尝试在我的 CMakeLists.txt 中检查操作系统,但似乎这种特殊情况不起作用...... 这是一个引发我的问题的例子:

set (FOO "BAR")

message(${CMAKE_SYSTEM_NAME})

if (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN")
    message("EQUALS CYGWIN")
endif()

if (${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN")
    message("MATCHES CYGWIN")
endif()

if (${FOO} MATCHES "BAR")
    message("MATCHES BAR")
endif()

CMake 打印:

CYGWIN
EQUALS CYGWIN
MATCHES BAR

而不是预期的“匹配 CYGWIN”。 我觉得这很奇怪,它适用于其他变量(比如这里的 FOO)。 是不是我做错了什么?

配置:

  • cmake 版本 2.8.11.2
  • 取消命名 CYGWIN_NT-6.1

PS:我也检查了 FOO = "CYGWIN",它也不匹配。似乎只有这个特定的字符串不适用于 MATCHES...

【问题讨论】:

    标签: c++ regex cmake cygwin match


    【解决方案1】:

    原因

    if cmake 命令的签名是

    if(<variable|string> MATCHES regex)
    

    但不是

    if(<string> MATCHES regex)
    

    这意味着变量CYGWIN首先检查了,如果没有这样的变量,则使用CYGWIN字符串

    证明

    尝试打印CYGWIN 变量(见documentation):

    > cat CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12)
    project(foo)
    message("cygwin variable: ${CYGWIN}")
    > cmake -H. -B_builds
    ...
    cygwin variable: 1
    ...
    

    详细

    if (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN")
        # variable CYGWIN vs variable CYGWIN, i.e. 1 == 1
        message("EQUALS CYGWIN") # success
    endif()
    
    if (${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN")
        # variable CYGWIN (i.e. 1) vs regex CYGWIN
        message("MATCHES CYGWIN") # fail
    endif()
    
    if (${FOO} MATCHES "BAR")
        # string BAR vs string BAR
        message("MATCHES BAR") # success
    endif()
    

    解药

    尽量避免使用带有&lt;variable|string&gt;签名的命令,因为 任何名称都可以应用于变量:

    > cat CMakeLists.txt
    cmake_minimum_required(VERSION 2.8.12)
    project(foo)
    set("/this/is/definitely/not/a/variable/name" "surprise!")
    message("${/this/is/definitely/not/a/variable/name}")
    > cmake -H. -B_builds
    ...
    surprise!
    ...
    

    例如你可以使用string命令:

    string(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "CYGWIN" is_cygwin)
    if(is_cygwin)
      message("Hello, cygwin!")
    endif()
    

    请注意,在您的特定情况下,您可以简单地使用 CYGWIN 变量检查:

    if(CYGWIN)
      message("Hello, cygwin!")
    endif()
    

    相关

    【讨论】:

    • 感谢您的解释。这个想法是有一个统一的方法来检查运行 cmake 的平台。你有一个通用的解决方案(比如说检查 linux、cygwin、osx 和 win32)?
    【解决方案2】:

    改变这个:

    if (${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN")
    

    到:

    if (CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
    

    有想要的效果。

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 2012-03-16
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多