diff options
| author | Christian Andersen <csandersen3@gmail.com> | 2024-02-04 19:16:14 +0100 |
|---|---|---|
| committer | Christian Andersen <csandersen3@gmail.com> | 2024-02-04 22:24:10 +0100 |
| commit | 5bd332ec20ea1c66e769f841b510a76320b995c3 (patch) | |
| tree | 1f3c556953bdbe1c3f3461097c0550c691ccc1d7 | |
| parent | 3d30672656b840756910809a52ac5fe54c24ec01 (diff) | |
| download | portable-5bd332ec20ea1c66e769f841b510a76320b995c3.tar.gz portable-5bd332ec20ea1c66e769f841b510a76320b995c3.tar.bz2 portable-5bd332ec20ea1c66e769f841b510a76320b995c3.zip | |
Windows: Improve the check for endianness when using Visual Studio.
Visual studio does not define __BYTE_ORDER__ so all architectures
were detected as LITTLE_ENDIAN since both __BYTE_ORDER__ and
__ORDER_LITTLE_ENDIAN__ would evaluate to 0 and compare equal. This
updates the checks to use CMakes detection of endianness, with a hard
error, if this also fails.
| -rw-r--r-- | CMakeLists.txt | 9 | ||||
| -rw-r--r-- | include/compat/endian.h | 17 |
2 files changed, 25 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b8c1aa..730b84d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
| @@ -142,6 +142,15 @@ endif() | |||
| 142 | if(MSVC) | 142 | if(MSVC) |
| 143 | add_definitions(-Dinline=__inline) | 143 | add_definitions(-Dinline=__inline) |
| 144 | message(STATUS "Using [${CMAKE_C_COMPILER_ID}] compiler") | 144 | message(STATUS "Using [${CMAKE_C_COMPILER_ID}] compiler") |
| 145 | |||
| 146 | include(TestBigEndian) | ||
| 147 | TEST_BIG_ENDIAN(HAVE_BIG_ENDIAN) | ||
| 148 | if(HAVE_BIG_ENDIAN) | ||
| 149 | add_definitions(-DHAVE_BIG_ENDIAN) | ||
| 150 | else() | ||
| 151 | add_definitions(-DHAVE_LITTLE_ENDIAN) | ||
| 152 | endif() | ||
| 153 | |||
| 145 | if(CMAKE_C_COMPILER_ID MATCHES "MSVC" OR CMAKE_C_COMPILER_ID MATCHES "Clang") | 154 | if(CMAKE_C_COMPILER_ID MATCHES "MSVC" OR CMAKE_C_COMPILER_ID MATCHES "Clang") |
| 146 | set(MSVC_DISABLED_WARNINGS_LIST | 155 | set(MSVC_DISABLED_WARNINGS_LIST |
| 147 | "C4018" # 'expression' : signed/unsigned mismatch | 156 | "C4018" # 'expression' : signed/unsigned mismatch |
diff --git a/include/compat/endian.h b/include/compat/endian.h index d0dcfe3..5376c1a 100644 --- a/include/compat/endian.h +++ b/include/compat/endian.h | |||
| @@ -13,13 +13,28 @@ | |||
| 13 | #define PDP_ENDIAN 3412 | 13 | #define PDP_ENDIAN 3412 |
| 14 | 14 | ||
| 15 | /* | 15 | /* |
| 16 | * Use GCC and Visual Studio compiler defines to determine endian. | 16 | * Use GCC compiler defines to determine endianness. |
| 17 | */ | 17 | */ |
| 18 | #if defined(__BYTE_ORDER__) | ||
| 18 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | 19 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| 19 | #define BYTE_ORDER LITTLE_ENDIAN | 20 | #define BYTE_ORDER LITTLE_ENDIAN |
| 20 | #else | 21 | #else |
| 21 | #define BYTE_ORDER BIG_ENDIAN | 22 | #define BYTE_ORDER BIG_ENDIAN |
| 22 | #endif | 23 | #endif |
| 24 | #endif | ||
| 25 | |||
| 26 | /* | ||
| 27 | * Use build system defines to determine endianness. | ||
| 28 | */ | ||
| 29 | #if !defined(BYTE_ORDER) | ||
| 30 | #if defined(HAVE_LITTLE_ENDIAN) | ||
| 31 | #define BYTE_ORDER LITTLE_ENDIAN | ||
| 32 | #elif defined(HAVE_BIG_ENDIAN) | ||
| 33 | #define BYTE_ORDER BIG_ENDIAN | ||
| 34 | #else | ||
| 35 | #error "Could not detect endianness." | ||
| 36 | #endif | ||
| 37 | #endif | ||
| 23 | 38 | ||
| 24 | #elif defined(HAVE_ENDIAN_H) | 39 | #elif defined(HAVE_ENDIAN_H) |
| 25 | #include_next <endian.h> | 40 | #include_next <endian.h> |
