如何去除 CMake 变量中的尾随空格?
How to strip trailing whitespace in CMake variable?
我们正在努力改进 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()
消息语句显示来自 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(REGEX REPLACE "\n$" "" <varname> "${<varname>}")
适用于我从 CMake 2.8 开始参与的项目之一。
execute_process
有一个标志,用于在标准输出或标准错误(或两者)上去除尾随空格
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
https://cmake.org/cmake/help/v3.0/command/execute_process.html
您还可以使用 CMake 的字符串 STRIP 命令,该命令将删除前导空格和尾随空格(以及尾随换行符)。
string(STRIP <string> <output variable>)
Adding dollar sign and curly braces, ${UNAME_MACHINE}, results in the
same original problem (the newline is still present).
如果您使用大括号,则还需要引号。例如:
string(STRIP "${UNAME_MACHINE}" UNAME_MACHINE)
我们正在努力改进 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()
消息语句显示来自 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(REGEX REPLACE "\n$" "" <varname> "${<varname>}")
适用于我从 CMake 2.8 开始参与的项目之一。
execute_process
有一个标志,用于在标准输出或标准错误(或两者)上去除尾随空格
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
https://cmake.org/cmake/help/v3.0/command/execute_process.html
您还可以使用 CMake 的字符串 STRIP 命令,该命令将删除前导空格和尾随空格(以及尾随换行符)。
string(STRIP <string> <output variable>)
Adding dollar sign and curly braces, ${UNAME_MACHINE}, results in the same original problem (the newline is still present).
如果您使用大括号,则还需要引号。例如:
string(STRIP "${UNAME_MACHINE}" UNAME_MACHINE)