17

我们正在尝试改进 CMake 生成的 makefile。对于 Clang、GCC 和 ICC,我们要添加-march=native. 这样做的块看起来像:

# -march=native for GCC, Clang and ICC on i386, i486, i586, i686 and x86_64.
message(STATUS, "1")
message(STATUS, "Compiler: x${CMAKE_CXX_COMPILER_ID}x")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
    message(STATUS, "2")
    message(STATUS, "Machine: x${UNAME_MACHINE}x")
    if (("${UNAME_MACHINE}" MATCHES "i.86") OR ("${UNAME_MACHINE}" STREQUAL "x86_64"))
            message(STATUS, "3")
        if (CMAKE_VERSION VERSION_LESS 2.8.12)
            add_definitions(-march=native)
        else()
            add_compile_options(-march=native)
        endif()
    endif()
endif()

消息语句显示机器字符串 fromuname有一个尾随换行符:

STATUS,1
STATUS,Compiler: xGNUx
STATUS,2
STATUS,Machine: xx86_64
x

要生产的块UNAME_MACHINE是:

# We need the output 'uname -m' for Unix and Linux platform detection
#    Be prepared for i386-i686, amd64, x86_64, arm, arm64, armel, armhf,
#    mips, mips64, aarch32 and aarch64 (for starters)
set (UNAME_CMD "uname")
set (UNAME_ARG "-m")
execute_process(COMMAND ${UNAME_CMD} ${UNAME_ARG}
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
    RESULT_VARIABLE UNAME_RESULT
    OUTPUT_VARIABLE UNAME_MACHINE)

如何从UNAME_MACHINECMake 中删除尾随换行符?

或者我应该切换到matches不受换行符影响的正则表达式?

或者,我应该做点别的吗?


我们正在尝试通过 Current 支持 CMake 2.8。这大致使我们回到了 Ubuntu 12.04 LTS。那个时候还有一些其他的操作系统把事情往后推了一点。虽然string(STRIP <string> <output variable>)看起来很有希望,但 CMake 并未在其文档中提供版本信息,因此我们不确定它是否符合要求。

编辑它似乎剥离在 3.0.2 中不起作用,所以看来我们需要别的东西。

# Strip lead and trailing whitepasce
string(STRIP UNAME_MACHINE, UNAME_MACHINE)

结果如下(我们期望xx86_64x):

STATUS,1
STATUS,Compiler: xGNUx
STATUS,2
STATUS,Machine: xUNAME_MACHINE,x

添加美元符号和花括号,${UNAME_MACHINE}会导致相同的原始问题(换行符仍然存在)。

4

4 回答 4

31

execute_process有一个标志用于在标准输出或标准错误(或两者)上剥离尾随空格

            [OUTPUT_STRIP_TRAILING_WHITESPACE]
            [ERROR_STRIP_TRAILING_WHITESPACE]

https://cmake.org/cmake/help/v3.0/command/execute_process.html

于 2017-02-25T04:39:12.013 回答
22

这会去除变量 <varname> 中的终止换行符:

string(REGEX REPLACE "\n$" "" <varname> "${<varname>}")

适用于我自 CMake 2.8 以来参与的项目之一。

于 2016-09-14T17:18:02.207 回答
11

您还可以使用 CMake 的字符串STRIP命令,该命令将删除前导和尾随空格(以及尾随换行符)。

string(STRIP <string> <output variable>)
于 2017-03-08T16:14:45.927 回答
2

添加美元符号和花括号 ${UNAME_MACHINE} 会导致相同的原始问题(换行符仍然存在)。

如果您使用花括号,则还需要引号。例如:

string(STRIP "${UNAME_MACHINE}" UNAME_MACHINE)
于 2018-07-27T15:12:39.987 回答