]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Probe assembler for supported -m* flags
authorJoel Rosdahl <joel@rosdahl.net>
Tue, 14 Jul 2020 13:08:22 +0000 (15:08 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Tue, 14 Jul 2020 13:08:22 +0000 (15:08 +0200)
Since CMake uses the assembler executable for compiling assembler source
code it’s not quite correct to probe the C++ compiler (nor the C
compiler) since it may not be the same as the assembler.

Fixes #625.

cmake/CheckAsmCompilerFlag.cmake [new file with mode: 0644]
src/third_party/blake3/CMakeLists.txt

diff --git a/cmake/CheckAsmCompilerFlag.cmake b/cmake/CheckAsmCompilerFlag.cmake
new file mode 100644 (file)
index 0000000..07f5f8e
--- /dev/null
@@ -0,0 +1,62 @@
+include(CMakeCheckCompilerFlagCommonPatterns)
+
+function(check_asm_compiler_flag flag var)
+  if(DEFINED "${var}")
+    return()
+  endif()
+
+  set(locale_vars LC_ALL LC_MESSAGES LANG)
+  foreach(v IN LISTS locale_vars)
+    set(locale_vars_saved_${v} "$ENV{${v}}")
+    set(ENV{${v}} C)
+  endforeach()
+
+  check_compiler_flag_common_patterns(common_patterns)
+
+  set(test_file "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.S")
+  file(WRITE "${test_file}" ".global main\nmain:\n")
+
+  if(NOT CMAKE_REQUIRED_QUIET)
+    message(STATUS "Performing Test ${var}")
+  endif()
+  try_compile(
+    ${var}
+    "${CMAKE_BINARY_DIR}"
+    "${test_file}"
+    COMPILE_DEFINITIONS "${flag}"
+    OUTPUT_VARIABLE output)
+
+  check_compiler_flag_common_patterns(common_fail_patterns)
+
+  foreach(regex ${common_fail_patterns})
+    if("${output}" MATCHES "${regex}")
+      set(${var} 0)
+    endif()
+  endforeach()
+
+  if(${${var}})
+    set(${var} 1 CACHE INTERNAL "Test ${var}")
+    if(NOT CMAKE_REQUIRED_QUIET)
+      message(STATUS "Performing Test ${var} - Success")
+    endif()
+    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+      "Performing ASM SOURCE FILE Test ${var} succeeded with the following output:\n"
+      "${output}\n"
+      "Source file was:\n${test_file}\n")
+  else()
+    if(NOT CMAKE_REQUIRED_QUIET)
+      message(STATUS "Performing Test ${var} - Failed")
+    endif()
+    set(${var} "" CACHE INTERNAL "Test ${var}")
+    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+      "Performing ASM SOURCE FILE Test ${var} failed with the following output:\n"
+      "${output}\n"
+      "Source file was:\n${test_file}\n")
+  endif()
+
+  foreach(v IN LISTS locale_vars)
+    set(ENV{${v}} ${locale_vars_saved_${v}})
+  endforeach()
+
+  set(${var} "${${var}}" PARENT_SCOPE)
+endfunction()
index 52b2077b35676aae248b50362379548c76687e1c..3851c89804bac501a203a2de901a21af69c415c3 100644 (file)
@@ -3,16 +3,23 @@ add_library(blake3 STATIC blake3.c blake3_dispatch.c blake3_portable.c)
 target_link_libraries(blake3 PRIVATE standard_settings)
 
 if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+  set(blake_source_type asm)
   set(blake_suffix "_x86-64_unix.S")
 else()
+  set(blake_source_type c)
   set(blake_suffix ".c")
 endif()
 
-include(CheckCXXCompilerFlag)
+include(CheckAsmCompilerFlag)
+include(CheckCCompilerFlag)
 
 function(add_source_if_enabled feature compile_flags)
-  string(TOUPPER "have_${feature}" have_feature)
-  check_cxx_compiler_flag(${compile_flags} ${have_feature})
+  string(TOUPPER "have_${blake_source_type}_${feature}" have_feature)
+  if(${blake_source_type} STREQUAL "asm")
+    check_asm_compiler_flag(${compile_flags} ${have_feature})
+  else()
+    check_c_compiler_flag(${compile_flags} ${have_feature})
+  endif()
 
   if(${have_feature})
     target_sources(blake3 PRIVATE blake3_${feature}${blake_suffix})