Forráskód Böngészése

TestBigEndian: Re-implement using byte order detected from ABI check

Document the module as deprecated in favor of the ABI check results.
Brad King 5 éve
szülő
commit
fcc89bda1d

+ 5 - 0
Help/release/dev/TestBigEndian-use-abi-result.rst

@@ -0,0 +1,5 @@
+TestBigEndian-use-abi-result
+----------------------------
+
+* The :module:`TestBigEndian` module has been deprecated in favor
+  of the :variable:`CMAKE_<LANG>_BYTE_ORDER` variable.

+ 28 - 8
Modules/TestBigEndian.cmake

@@ -5,19 +5,41 @@
 TestBigEndian
 -------------
 
-Define macro to determine endian type
+.. deprecated:: 3.20
 
-Check if the system is big endian or little endian
+  Supserseded by the :variable:`CMAKE_<LANG>_BYTE_ORDER` variable.
 
-::
+Check if the target architecture is big endian or little endian.
+
+.. command:: test_big_endian
+
+  .. code-block:: cmake
+
+    test_big_endian(<var>)
+
+  Stores in variable ``<var>`` either 1 or 0 indicating whether the
+  target architecture is big or little endian.
 
-  TEST_BIG_ENDIAN(VARIABLE)
-  VARIABLE - variable to store the result to
 #]=======================================================================]
+include_guard()
 
 include(CheckTypeSize)
 
-macro(TEST_BIG_ENDIAN VARIABLE)
+function(TEST_BIG_ENDIAN VARIABLE)
+  if(";${CMAKE_C_BYTE_ORDER};${CMAKE_CXX_BYTE_ORDER};${CMAKE_CUDA_BYTE_ORDER};${CMAKE_OBJC_BYTE_ORDER};${CMAKE_OBJCXX_BYTE_ORDER};" MATCHES ";(BIG_ENDIAN|LITTLE_ENDIAN);")
+    set(order "${CMAKE_MATCH_1}")
+    if(order STREQUAL "BIG_ENDIAN")
+      set("${VARIABLE}" 1 PARENT_SCOPE)
+    else()
+      set("${VARIABLE}" 0 PARENT_SCOPE)
+    endif()
+  else()
+    __TEST_BIG_ENDIAN_LEGACY_IMPL(is_big)
+    set("${VARIABLE}" "${is_big}" PARENT_SCOPE)
+  endif()
+endfunction()
+
+macro(__TEST_BIG_ENDIAN_LEGACY_IMPL VARIABLE)
   if(NOT DEFINED HAVE_${VARIABLE})
     message(CHECK_START "Check if the system is big endian")
     message(CHECK_START "Searching 16 bit integer")
@@ -119,5 +141,3 @@ macro(TEST_BIG_ENDIAN VARIABLE)
       endif()
   endif()
 endmacro()
-
-

+ 1 - 0
Tests/RunCMake/ABI/C-stdout.txt

@@ -0,0 +1 @@
+-- Check if the system is big endian

+ 15 - 0
Tests/RunCMake/ABI/C.cmake

@@ -5,3 +5,18 @@ if(NOT CMAKE_C_BYTE_ORDER MATCHES "^(BIG_ENDIAN|LITTLE_ENDIAN)$")
   endif()
   message(FATAL_ERROR "CMAKE_C_BYTE_ORDER has unexpected value '${CMAKE_C_BYTE_ORDER}'")
 endif()
+
+include(TestBigEndian)
+test_big_endian(IS_BIG_ENDIAN)
+if(IS_BIG_ENDIAN AND NOT CMAKE_C_BYTE_ORDER STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()
+
+# Test legacy check.
+set(byte_order "${CMAKE_C_BYTE_ORDER}")
+unset(CMAKE_C_BYTE_ORDER)
+include(TestBigEndian)
+test_big_endian(IS_BIG)
+if(IS_BIG AND NOT byte_order STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()

+ 6 - 0
Tests/RunCMake/ABI/CUDA.cmake

@@ -5,3 +5,9 @@ if(NOT CMAKE_CUDA_BYTE_ORDER MATCHES "^(BIG_ENDIAN|LITTLE_ENDIAN)$")
   endif()
   message(FATAL_ERROR "CMAKE_CUDA_BYTE_ORDER has unexpected value '${CMAKE_CUDA_BYTE_ORDER}'")
 endif()
+
+include(TestBigEndian)
+test_big_endian(IS_BIG_ENDIAN)
+if(IS_BIG_ENDIAN AND NOT CMAKE_CUDA_BYTE_ORDER STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()

+ 1 - 0
Tests/RunCMake/ABI/CXX-stdout.txt

@@ -0,0 +1 @@
+-- Check if the system is big endian

+ 15 - 0
Tests/RunCMake/ABI/CXX.cmake

@@ -5,3 +5,18 @@ if(NOT CMAKE_CXX_BYTE_ORDER MATCHES "^(BIG_ENDIAN|LITTLE_ENDIAN)$")
   endif()
   message(FATAL_ERROR "CMAKE_CXX_BYTE_ORDER has unexpected value '${CMAKE_CXX_BYTE_ORDER}'")
 endif()
+
+include(TestBigEndian)
+test_big_endian(IS_BIG_ENDIAN)
+if(IS_BIG_ENDIAN AND NOT CMAKE_CXX_BYTE_ORDER STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()
+
+# Test legacy check.
+set(byte_order "${CMAKE_CXX_BYTE_ORDER}")
+unset(CMAKE_CXX_BYTE_ORDER)
+include(TestBigEndian)
+test_big_endian(IS_BIG)
+if(IS_BIG AND NOT byte_order STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()

+ 6 - 0
Tests/RunCMake/ABI/OBJC.cmake

@@ -5,3 +5,9 @@ if(NOT CMAKE_OBJC_BYTE_ORDER MATCHES "^(BIG_ENDIAN|LITTLE_ENDIAN)$")
   endif()
   message(FATAL_ERROR "CMAKE_OBJC_BYTE_ORDER has unexpected value '${CMAKE_OBJC_BYTE_ORDER}'")
 endif()
+
+include(TestBigEndian)
+test_big_endian(IS_BIG_ENDIAN)
+if(IS_BIG_ENDIAN AND NOT CMAKE_OBJC_BYTE_ORDER STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()

+ 6 - 0
Tests/RunCMake/ABI/OBJCXX.cmake

@@ -5,3 +5,9 @@ if(NOT CMAKE_OBJCXX_BYTE_ORDER MATCHES "^(BIG_ENDIAN|LITTLE_ENDIAN)$")
   endif()
   message(FATAL_ERROR "CMAKE_OBJCXX_BYTE_ORDER has unexpected value '${CMAKE_OBJCXX_BYTE_ORDER}'")
 endif()
+
+include(TestBigEndian)
+test_big_endian(IS_BIG_ENDIAN)
+if(IS_BIG_ENDIAN AND NOT CMAKE_OBJCXX_BYTE_ORDER STREQUAL "BIG_ENDIAN")
+  message(FATAL_ERROR "test_big_endian result does not match ABI result")
+endif()

+ 2 - 0
Tests/RunCMake/ABI/RunCMakeTest.cmake

@@ -11,3 +11,5 @@ endif()
 if(CMake_TEST_CUDA)
   run_cmake(CUDA)
 endif()
+
+run_cmake(TestBigEndian-NoLang)

+ 1 - 0
Tests/RunCMake/ABI/TestBigEndian-NoLang-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/ABI/TestBigEndian-NoLang-stderr.txt

@@ -0,0 +1,8 @@
+^CMake Error at [^
+]*/Modules/TestBigEndian.cmake:[0-9]+ \(message\):
+  TEST_BIG_ENDIAN needs either C or CXX language enabled
+Call Stack \(most recent call first\):
+  [^
+]*/Modules/TestBigEndian.cmake:[0-9]+ \(__TEST_BIG_ENDIAN_LEGACY_IMPL\)
+  TestBigEndian-NoLang.cmake:[0-9]+ \(test_big_endian\)
+  CMakeLists.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/ABI/TestBigEndian-NoLang.cmake

@@ -0,0 +1,2 @@
+include(TestBigEndian)
+test_big_endian(var)