如何去除 CMake 变量中的尾随空格?

Posted

技术标签:

【中文标题】如何去除 CMake 变量中的尾随空格?【英文标题】:How to strip trailing whitespace in CMake variable? 【发布时间】:2017-01-22 14:10:27 【问题描述】:

我们正在尝试改进 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_IDx")
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_MACHINEx")
    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()

消息语句显示来自uname 的机器字符串有一个尾随换行符:

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)

如何在 CMake 中去除 UNAME_MACHINE 的尾随换行符?

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

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


我们正在尝试通过 Current 支持 CMake 2.8。这大致使我们回到了 Ubuntu 12.04 LTS。那个时候还有一些其他的操作系统把事情往后推了一点。 string(STRIP <string> <output variable>) 看起来很有希望,CMake does not supply version information with its documentation,所以我们不确定它是否能满足要求。

编辑看来剥离在 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 会导致相同的原始问题(换行符仍然存在)。

【问题讨论】:

string(STRIP UNAME_MACHINE, UNAME_MACHINE) — 可能是因为在 cmake 中参数以空格分隔时包含逗号 (,) 导致失败。 CMake 文档 states string(STRIP <string> <output variable>) 所以你的命令实际上应该是 string(STRIP $UNAME_MACHINE UNAME_MACHINE) 【参考方案1】:

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

            [OUTPUT_STRIP_TRAILING_WHITESPACE]
            [ERROR_STRIP_TRAILING_WHITESPACE]

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

【讨论】:

【参考方案2】:

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

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

为我自 CMake 2.8 以来参与的项目之一工作。

【讨论】:

【参考方案3】:

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

string(STRIP <string> <output variable>)

【讨论】:

这与 3.16 版的 cmake 不同。第一部分为真(空格),第二部分,尾随换行,不是。【参考方案4】:

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

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

string(STRIP "$UNAME_MACHINE" UNAME_MACHINE)

【讨论】:

以上是关于如何去除 CMake 变量中的尾随空格?的主要内容,如果未能解决你的问题,请参考以下文章

IDEA去除行尾空格

cmake:前导或尾随空格(策略 CMP0004)

从 Java 字符串中去除前导和尾随空格

如何保留 perl 变量的尾随空格?

在 Access DAO SQL INSERT 中保留尾随空格

为啥我的 python pandas 数据框剥离方法不适用于尾随空格?我该如何解决?