在决定构建什么和如何构建之前,我们需要确定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时,我们如何确定汇编程序的版本?
发布于 2017-03-30 05:17:16
我已经运行了一些测试并检查了CMake的汇编器检测代码。CMake做到了
与例如CXX)
CMAKE_ASM-ATT_COMPILER_ID一样,
CMAKE_ASM-ATT_COMPILER_VERSION因此,我使用了您的示例代码,并将其转换为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}")参考
发布于 2017-03-28 21:17:08
与其尝试查找汇编程序版本并硬编码哪些汇编程序版本支持哪些功能的映射,不如只测试汇编一些您知道在旧版本中失败的最小代码片段不是最好的吗?
https://stackoverflow.com/questions/43059015
复制相似问题