Cygwin的cmake与CMAKE_SYSTEM_NAME不匹配

时间:2014-02-24 18:18:25

标签: c++ regex cmake cygwin match

我正在使用cmake对cygwin采取stange行为。 我尝试检查我的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

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

配置:

  • cmake version 2.8.11.2
  • uname CYGWIN_NT-6.1

PS:我也用FOO =“CYGWIN”进行了检查,但两者都不匹配。似乎只有这个特殊的字符串不适用于MATCHES ......

2 个答案:

答案 0 :(得分:3)

原因

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()

解毒剂

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

> 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()

相关

答案 1 :(得分:1)

更改此内容:

if (${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN")

为:

if (CMAKE_SYSTEM_NAME MATCHES "CYGWIN")

有预期的效果。