在决定构建什么以及如何构建它之前,我们需要确定GNU AS(GAS)的版本。一些较旧的GAS,如与CentOS 5和OpenBSD 6一起分发的GAS,无法处理SSE4及更高版本。我们需要禁用使用SSE4,AES-NI,SHA,AVX和BMI的代码路径。
我们的主要构建系统是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 :(得分: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}")
<强>参考强>
答案 1 :(得分:-1)
不是试图找到汇编程序版本并硬编码汇编程序版本支持哪些功能的映射,而不是最好只测试汇编一些你知道在旧版本中失败的最小代码片段?