Как убрать конечные пробелы в переменной CMake?

Мы пытаемся улучшить make-файлы, созданные 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 через Current. Это примерно возвращает нас к 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

Вы также можете использовать строку STRIP команды CMake, которая удалит начальные и конечные пробелы (и завершающий перевод строки).

string(STRIP <string> <output variable>)

Добавление знака доллара и фигурных скобок, ${UNAME_MACHINE}, приводит к той же самой первоначальной проблеме (новая строка все еще присутствует).

Если вы используете фигурные скобки, вам также нужны кавычки. НАПРИМЕР:

string(STRIP "${UNAME_MACHINE}" UNAME_MACHINE)
Другие вопросы по тегам