Cygwin的cmake与CMAKE_SYSTEM_NAME不匹配
Cygwin's cmake does not match for CMAKE_SYSTEM_NAME
我在cygwin上使用cmake有一个斯坦格行为。我尝试检查我的 CMakeList 中的操作系统.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
而不是预期的"匹配小天鹅"。我觉得这很奇怪,它适用于其他变量(如这里的 FOO)。我做错了什么吗?
配置:
- CMAKE 版本 2.8.11.2
- uname CYGWIN_NT-6.1
PS:我也检查了FOO ="CYGWIN",它都不匹配。似乎只有这个特定的字符串不适用于 MATCHES...
原因
if
cmake 命令的签名是
if(<variable|string> MATCHES regex)
但不是
if(<string> MATCHES regex)
这意味着首先检查变量CYGWIN
,如果没有这样的变量,则使用CYGWIN
字符串。
证明
只需尝试打印CYGWIN
变量(请参阅文档):
> 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(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "CYGWIN" is_cygwin)
if(is_cygwin)
message("Hello, cygwin!")
endif()
请注意,在您的特定情况下,您可以简单地使用变量检查CYGWIN
:
if(CYGWIN)
message("Hello, cygwin!")
endif()
相关
- CMake 与空字符串的比较与 STREQUAL 失败
更改此设置:
if (${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN")
自:
if (CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
具有预期的效果。
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- 为什么"using System;"不被视为不良做法?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- 为什么我的数组值与此处的全局变量不匹配?
- 引号之间匹配/不匹配,带有不可避免的引号和多行
- 映射迭代器与运算符不匹配
- C++调用和定义不匹配