2017-03-28 28 views
0

在決定構建什麼以及如何構建它之前,我們需要確定GNU的AS(GAS)版本。一些較老的GAS,像CentOS 5和OpenBSD 6分發的GAS一樣,無法處理SSE4及更高版本。我們需要禁用利用SSE4,AES-NI,SHA,AVX和BMI的代碼路徑。確定CMake中的彙編程序版本?

我們的主要構建系統是GNU Make和它performs the following

HAVE_GAS := $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler") 
ifneq ($(HAVE_GAS),0) 
    GAS210_OR_LATER := $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.[1-9][0-9]|[3-9])") 
    GAS217_OR_LATER := $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.1[7-9]|2\.[2-9]|[3-9])") 
    GAS219_OR_LATER := $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.19|2\.[2-9]|[3-9])") 
endif 

據向CMake的Assembler wiki,CMake的有彙編源文件的基本支持。但是它沒有討論如何獲得彙編器的版本。

我們如何確定使用CMake時的彙編版本?

+0

也許設置一個變量,以外殼命令(例如)'彙編--version'的結果。 [有用的鏈接](https://cmake.org/cmake/help/v2.8.9/cmake.html#command:execute_process)。 – Jerfov2

回答

-1

而不是試圖找到彙編程序版本和硬編碼什麼彙編版本支持哪些功能的映射,是不是最好只測試一些最小的代碼片段,你知道是與舊版本失敗?

1

我運行了一些測試並查看了CMake的彙編程序檢測代碼。 CMake的不

  • 沒有確定,也不能設置CMAKE_ASM-ATT_COMPILER_VERSION(因爲它會爲如CXX
  • 只設置CMAKE_ASM-ATT_COMPILER_ID

所以我用你的示例代碼,並將其直接轉換爲CMake的:

cmake_minimum_required(VERSION 2.6) 
project(AsmTest CXX) 

enable_language(ASM-ATT) 

if (CMAKE_ASM-ATT_COMPILER_ID STREQUAL "GNU") 
    execute_process(
     COMMAND ${CMAKE_ASM-ATT_COMPILER} --version 
     OUTPUT_VARIABLE _gas_version 
    ) 
    if (_gas_version MATCHES "GNU.[Aa]ssembler.*(2\.[1-9][0-9]|[3-9])") 
     set(GAS210_OR_LATER 1) 
    endif() 
endif() 
message(STATUS "GAS210_OR_LATER = ${GAS210_OR_LATER}") 

參考