17

私たちは、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)

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

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

または、何か他のことをする必要がありますか?


現在、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

4 に答える 4

22

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

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

CMake 2.8 以降に関与したプロジェクトの 1 つに取り組んでいます。

于 2016-09-14T17:18:02.207 に答える