web-dev-qa-db-ja.com

CMake変数の末尾の空白を取り除く方法は?

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)
_

CMakeで_UNAME_MACHINE_から末尾の改行を削除するにはどうすればよいですか?

または、改行の影響を受けない正規表現matchesに切り替える必要がありますか?

または、他に何かすべきですか?


Currentを通じてCMake 2.8をサポートしようとしています。大まかに、Ubuntu 12.04 LTSに戻ります。その頃、他にいくつかのオペレーティングシステムがあり、少し後押しされています。 string(STRIP <string> <output variable>)は有望に見えますが、 CMakeはドキュメントにバージョン情報を提供しません なので、要件を満たしているかどうかはわかりません。

[〜#〜] edit [〜#〜]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}_を追加すると、同じ元の問題が発生します(改行がまだ存在します)。

11
jww

これにより、変数<varname>の終了改行が削除されます。

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

CMake 2.8以降に携わったプロジェクトの1つで機能します。

15
Tsyvarev

execute_processには、標準出力または標準エラー(あるいはその両方)の末尾の空白を取り除くフラグがあります。

            [OUTPUT_STRIP_TRAILING_WHITESPACE]
            [ERROR_STRIP_TRAILING_WHITESPACE]

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

12
xaxxon

CMakeの文字列 [〜#〜] strip [〜#〜] コマンドを使用して、先頭と末尾のスペース(および末尾の改行)を削除することもできます。

string(STRIP <string> <output variable>)
8
AhmedBM

ドル記号と中括弧$ {UNAME_MACHINE}を追加すると、同じ元の問題が発生します(改行がまだ存在します)。

中括弧を使用する場合は、引用符も必要です。例えば:

string(STRIP "${UNAME_MACHINE}" UNAME_MACHINE)
0
DavidS