2016-09-14 75 views
4

我們正在嘗試改進CMake生成的makefile。對於Clang,GCC和ICC,我們要添加-march=native。這樣做的塊的樣子:如何去除CMake變量中的尾部空白?

# -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},導致相同的原始問題(換行仍然存在)。

+0

'字符串(STRIP UNAME_MACHINE,UNAME_MACHINE)' - 這可能是因爲它失敗,因爲你提供一個逗號('')當參數由cmake的空格隔開。 –

+0

CMake文檔[狀態](https://cmake.org/cmake/help/v3.5/command/string.html#strip)'字符串(STRIP <輸出變量>)'所以你的命令實際上應該是'字符串(STRIP $ {UNAME_MACHINE} UNAME_MACHINE)' – AhmedBM

回答

8

這條終止換行符變量:因爲我參與到自CMake的2.8項目之一

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

作品。

+0

完美,非常感謝。 – jww

4

您還可以使用的CMake的字符串STRIP命令,它會刪除開頭和結尾的空格(和後面的換行符)。

string(STRIP <string> <output variable>