Как очистить конечные пробелы в переменной CMake?
мы пытаемся улучшить makefiles, производимые CMake. Для 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)
как мне удалить конечную новую строку из UNAME_MACHINE
в CMake?
или я должен переключиться на выражение matches
, который не должен быть затронуты строки?
или я должен сделать что-то еще?
мы пытаемся поддерживать 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 ответов
Это полосы, заканчивающиеся новой строкой в переменной
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 прокладки команда, которая удалит начальные и конечные пробелы (и конечную новую строку).
string(STRIP <string> <output variable>)
добавление знака доллара и фигурных скобок, ${UNAME_MACHINE}, приводит к та же оригинальная проблема (новая строка все еще присутствует).
Если вы используете фигурные скобки, вы также нужны кавычки. Например:
string(STRIP "${UNAME_MACHINE}" UNAME_MACHINE)