From 78aad3a28cd83f2c3bbb8ad8efeda5ff04f0252f Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sat, 28 Jul 2018 01:34:17 +0800 Subject: [PATCH] cmake: extract Yasm check into a module Signed-off-by: Kefu Chai --- cmake/modules/CheckYasm.cmake | 41 ++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 44 ++++------------------------------- 2 files changed, 45 insertions(+), 40 deletions(-) create mode 100644 cmake/modules/CheckYasm.cmake diff --git a/cmake/modules/CheckYasm.cmake b/cmake/modules/CheckYasm.cmake new file mode 100644 index 0000000000000..39a899e40f981 --- /dev/null +++ b/cmake/modules/CheckYasm.cmake @@ -0,0 +1,41 @@ +macro(check_yasm_support _object_format _good_result _better_result) + execute_process( + COMMAND yasm -f "${_object_format}" ${CMAKE_SOURCE_DIR}/src/common/crc32c_intel_fast_asm.s -o /dev/null + RESULT_VARIABLE no_yasm + OUTPUT_QUIET) + if(NOT no_yasm) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64") + set(save_quiet ${CMAKE_REQUIRED_QUIET}) + set(CMAKE_REQUIRED_QUIET true) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles(" + #if defined(__x86_64__) && defined(__ILP32__) + #error x32 + #endif + int main() {} + " not_arch_x32) + set(CMAKE_REQUIRED_QUIET ${save_quiet}) + if(not_arch_x32) + set(${_good_result} TRUE) + execute_process(COMMAND yasm -f ${object_format} -i + ${CMAKE_SOURCE_DIR}/src/isa-l/include/ + ${CMAKE_SOURCE_DIR}/src/isa-l/erasure_code/gf_vect_dot_prod_avx2.asm + -o /dev/null + RESULT_VARIABLE rc + OUTPUT_QUIET) + if(NOT rc) + set(${_better_result} TRUE) + endif(NOT rc) + endif(not_arch_x32) + endif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64") + endif(NOT no_yasm) + if(no_yasm) + message(STATUS "Could NOT find Yasm") + elseif(NOT not_arch_x32) + message(STATUS "Found Yasm: but x86_64 with x32 ABI is not supported") + elseif(${_better_result}) + message(STATUS "Found Yasm: good -- capable of assembling x86_64") + elseif(${_good_result}) + message(STATUS "Found Yasm: better -- capable of assembling AVX2") + endif() +endmacro() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fb975135ec089..b3c0a5ef1a840 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -97,48 +97,12 @@ if(HAVE_INTEL) set(object_format "elf64") endif() set(CMAKE_ASM_FLAGS "-f ${object_format}") + include(CheckYasm) + check_yasm_support(${object_format} + HAVE_GOOD_YASM_ELF64 + HAVE_BETTER_YASM_ELF64) endif() -execute_process( - COMMAND yasm -f "${object_format}" ${CMAKE_SOURCE_DIR}/src/common/crc32c_intel_fast_asm.s -o /dev/null - RESULT_VARIABLE no_yasm - OUTPUT_QUIET) -if(no_yasm) - message(STATUS " we do not have a modern/working yasm") -else(no_yasm) - message(STATUS " we have a modern and working yasm") - if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64") - message(STATUS " we are x86_64") - set(save_quiet ${CMAKE_REQUIRED_QUIET}) - set(CMAKE_REQUIRED_QUIET true) - include(CheckCXXSourceCompiles) - check_cxx_source_compiles(" - #if defined(__x86_64__) && defined(__ILP32__) - #error x32 - #endif - int main() {} - " not_arch_x32) - set(CMAKE_REQUIRED_QUIET ${save_quiet}) - if(not_arch_x32) - message(STATUS " we are not x32") - set(HAVE_GOOD_YASM_ELF64 1) - execute_process(COMMAND yasm -f ${object_format} -i - ${CMAKE_SOURCE_DIR}/src/isa-l/include/ - ${CMAKE_SOURCE_DIR}/src/isa-l/erasure_code/gf_vect_dot_prod_avx2.asm - -o /dev/null - RESULT_VARIABLE rc - OUTPUT_QUIET) - if(NOT rc) - set(HAVE_BETTER_YASM_ELF64 1) - message(STATUS " yasm can also build the isa-l stuff") - endif(NOT rc) - else(not_arch_x32) - message(STATUS " we are x32; no yasm for you") - endif(not_arch_x32) - else(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64") - message(STATUS " we are not x86_64 && !x32") - endif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64") -endif(no_yasm) # require c++17 if(CMAKE_VERSION VERSION_LESS "3.8") -- 2.39.5