]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cmake: extract Yasm check into a module
authorKefu Chai <kchai@redhat.com>
Fri, 27 Jul 2018 17:34:17 +0000 (01:34 +0800)
committerKefu Chai <kchai@redhat.com>
Sat, 28 Jul 2018 08:53:10 +0000 (16:53 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
cmake/modules/CheckYasm.cmake [new file with mode: 0644]
src/CMakeLists.txt

diff --git a/cmake/modules/CheckYasm.cmake b/cmake/modules/CheckYasm.cmake
new file mode 100644 (file)
index 0000000..39a899e
--- /dev/null
@@ -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()
index fb975135ec0899a94675685920b895a528555d5c..b3c0a5ef1a8408e06e077342d79e1f797fd126ea 100644 (file)
@@ -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")