CMAKE:忽略唯一的变量名称

时间:2016-10-03 19:55:19

标签: linux cmake cross-platform embedded-linux

我是在多个平台上运行的跨平台项目。项目中的每个目录都有一个CmakeLists.txt,大多数cmake文件的代码类似于:

输入:

# set target os
if (DEFINED target_os)
 SET (HRAD_SDK_TARGET_OS "${target_os}")
else ()
 SET (HRAD_SDK_TARGET_OS "${CMAKE_SYSTEM_NAME}")
endif ()
message(STATUS "=============== SDK: ccccccccccccccccccccccccccccccccccccccccccccccc==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")

# set target bit
if ("${HRAD_SDK_TARGET_OS}" MATCHES "Linux")
 message(STATUS "=============== SDK: ddddddddddddddddddddddddddddddddddddddddddddddd==============")
 message(STATUS "target_os: ${target_os}")
 message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")

 if ("${target_arch_bit}" MATCHES "64")
  SET (TARGET_ARCH_BIT -m64)
 else ()
  SET (TARGET_ARCH_BIT -m32)
 endif ()
endif ()
message(STATUS "TARGET_ARCH_BIT: ${TARGET_ARCH_BIT}")
# set flags
SET (ADDITION_C_FLAGS "-Wno-unused -Wno-parentheses")
if ("${HRAD_SDK_TARGET_OS}" MATCHES "LinuxARM")
 message(STATUS "=============== SDK: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==============")
 message(STATUS "target_os: ${target_os}")
 message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")

在上面的示例中,target_os可以包含Linux, LinuxARM, MacOSX, QNX

等值

但是,出于某种原因,它不喜欢名称LinuxARM,它似乎将其视为Linux

在上面的代码中,即使target_osLinuxARM,以Linux检查的循环也是如此,我得到如下输出,编译失败 -

输出:

-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- =============== SDK: ccccccccccccccccccccccccccccccccccccccccccccccc==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- =============== SDK: ddddddddddddddddddddddddddddddddddddddddddddddd==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- TARGET_ARCH_BIT: -m32
-- =============== SDK: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- =============== utils: CMakeLists.txt ==============
-- target os: LinuxARM
-- TARGET_OS: 
-- CMAKE_C_FLAGS:  -fPIC -Wno-unused -Wno-parentheses -D_REENTRANT
-- CMAKE_CPP_FLAGS:  -fPIC -Wno-unused -Wno-parentheses -std=gnu++0x -D_REENTRANT
-- CMAKE_CXX_FLAGS:   -fPIC -Wno-unused -Wno-parentheses -std=gnu++0x -D_REENTRANT
-- CMAKE_LD_FLAGS: -Wl -rpath-link,/usr/arm-linux-gnueabihf/lib
-- CMAKE_C_COMPILER: /usr/bin/arm-linux-gnueabihf-gcc
-- CMAKE_CPP_COMPILER: /usr/bin/arm-linux-gnueabihf-g++
-- CMAKE_CXX_COMPILER: /usr/bin/arm-linux-gnueabihf-g++

正如您所看到的那样,它不应该包含该行的块 ddddddddddddddddddddddddd

如果我将LinuxARM重命名为其他名称(如LINUX_ARM或完全随机的,例如NEWHLOS),则代码编译正常。

似乎LinuxLinuxARM的一个子集,它只是将其视为Linux

有人可以帮助为什么它不喜欢LinuxARM?我读到cmake变量名称区分大小写,但在我的情况下,变量是完全唯一的。

此外,我删除了所有cmake缓存文件并删除了所有以前的构建文件,但问题仍然存在。

更新1:

LINUX_ARM似乎与Linux没有任何问题。它工作正常。

1 个答案:

答案 0 :(得分:2)

MATCHES if()子命令执行正则表达式匹配,documented。当然,文字LinuxARM与正则表达式Linux匹配。你想要的是STREQUAL,而不是MATCHES

if ("${HRAD_SDK_TARGET_OS}" STREQUAL "Linux")