diff options
-rw-r--r-- | CMakeLists.txt | 6 | ||||
-rw-r--r-- | build_files/cmake/have_features.cmake | 33 | ||||
-rw-r--r-- | intern/guardedalloc/CMakeLists.txt | 4 | ||||
-rw-r--r-- | intern/guardedalloc/intern/mallocn_intern.h | 3 | ||||
-rw-r--r-- | source/blender/blenlib/CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/blender/blenlib/intern/system.c | 10 | ||||
-rw-r--r-- | source/blender/makesdna/intern/CMakeLists.txt | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/CMakeLists.txt | 5 | ||||
-rw-r--r-- | source/creator/CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/creator/creator_signals.c | 2 |
10 files changed, 69 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f59a849cbf8..9f4c5e80b17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,6 +106,12 @@ blender_project_hack_post() enable_testing() #----------------------------------------------------------------------------- +# Test compiler/library features. + +include(build_files/cmake/have_features.cmake) + + +#----------------------------------------------------------------------------- # Redirect output files set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "" FORCE) diff --git a/build_files/cmake/have_features.cmake b/build_files/cmake/have_features.cmake new file mode 100644 index 00000000000..dc3b61849ea --- /dev/null +++ b/build_files/cmake/have_features.cmake @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright 2022 Blender Foundation. All rights reserved. + +# This file is used to test the system for headers & symbols. +# Variables should use the `HAVE_` prefix. +# Defines should use the same name as the CMAKE variable. + +include(CheckSymbolExists) + +# Used for: `intern/guardedalloc/intern/mallocn_intern.h`. +# Function `malloc_stats` is only available on GLIBC, +# so check that before defining `HAVE_MALLOC_STATS`. +check_symbol_exists(malloc_stats "malloc.h" HAVE_MALLOC_STATS_H) + +# Used for: `source/creator/creator_signals.c`. +# The function `feenableexcept` is not present non-GLIBC systems, +# hence we need to check if it's available in the `fenv.h` file. +set(HAVE_FEENABLEEXCEPT OFF) +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + check_symbol_exists(feenableexcept "fenv.h" HAVE_FEENABLEEXCEPT) +endif() + +# Used for: `source/blender/blenlib/intern/system.c`. +# `execinfo` is not available on non-GLIBC systems (at least not on MUSL-LIBC), +# so check the presence of the header before including it and using the it for back-trace. +set(HAVE_EXECINFO_H OFF) +if(NOT MSVC) + include(CheckIncludeFiles) + check_include_files("execinfo.h" HAVE_EXECINFO_H) + if(HAVE_EXECINFO_H) + add_definitions(-DHAVE_EXECINFO_H) + endif() +endif() diff --git a/intern/guardedalloc/CMakeLists.txt b/intern/guardedalloc/CMakeLists.txt index 3329e4bf10e..89fdf367037 100644 --- a/intern/guardedalloc/CMakeLists.txt +++ b/intern/guardedalloc/CMakeLists.txt @@ -1,6 +1,10 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright 2006 Blender Foundation. All rights reserved. +if(HAVE_MALLOC_STATS_H) + add_definitions(-DHAVE_MALLOC_STATS_H) +endif() + set(INC . ../atomic diff --git a/intern/guardedalloc/intern/mallocn_intern.h b/intern/guardedalloc/intern/mallocn_intern.h index ce5683a04ae..1e9883f42c8 100644 --- a/intern/guardedalloc/intern/mallocn_intern.h +++ b/intern/guardedalloc/intern/mallocn_intern.h @@ -17,8 +17,7 @@ #undef HAVE_MALLOC_STATS #define USE_MALLOC_USABLE_SIZE /* internal, when we have malloc_usable_size() */ -#if defined(__linux__) || (defined(__FreeBSD_kernel__) && !defined(__FreeBSD__)) || \ - defined(__GLIBC__) +#if defined(HAVE_MALLOC_STATS_H) # include <malloc.h> # define HAVE_MALLOC_STATS #elif defined(__FreeBSD__) diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index d39a586206f..78455c44fe1 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -1,6 +1,10 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright 2006 Blender Foundation. All rights reserved. +if(HAVE_EXECINFO_H) + add_definitions(-DHAVE_EXECINFO_H) +endif() + set(INC . # ../blenkernel # don't add this back! diff --git a/source/blender/blenlib/intern/system.c b/source/blender/blenlib/intern/system.c index 35e26e0cb33..781b38f713a 100644 --- a/source/blender/blenlib/intern/system.c +++ b/source/blender/blenlib/intern/system.c @@ -21,7 +21,9 @@ # include "BLI_winstuff.h" #else -# include <execinfo.h> +# if defined(HAVE_EXECINFO_H) +# include <execinfo.h> +# endif # include <unistd.h> #endif @@ -61,9 +63,9 @@ int BLI_cpu_support_sse2(void) #if !defined(_MSC_VER) void BLI_system_backtrace(FILE *fp) { - /* ------------- */ - /* Linux / Apple */ -# if defined(__linux__) || defined(__APPLE__) + /* ----------------------- */ + /* If system as execinfo.h */ +# if defined(HAVE_EXECINFO_H) # define SIZE 100 void *buffer[SIZE]; diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt index c26696b4572..97198117a83 100644 --- a/source/blender/makesdna/intern/CMakeLists.txt +++ b/source/blender/makesdna/intern/CMakeLists.txt @@ -5,6 +5,11 @@ add_definitions(-DWITH_DNA_GHASH) +# Needed for `mallocn.c`. +if(HAVE_MALLOC_STATS_H) + add_definitions(-DHAVE_MALLOC_STATS_H) +endif() + blender_include_dirs( ../../../../intern/atomic ../../../../intern/guardedalloc diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index b0fb86c8bc3..7e6e3bcf90e 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -6,6 +6,11 @@ if(CMAKE_COMPILER_IS_GNUCC) string(APPEND CMAKE_C_FLAGS " -Werror=implicit-function-declaration") endif() +# Needed for `mallocn.c`. +if(HAVE_MALLOC_STATS_H) + add_definitions(-DHAVE_MALLOC_STATS_H) +endif() + # files rna_access.c rna_define.c makesrna.c intentionally excluded. set(DEFSRC rna_ID.c diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index becba393a36..5b01280c1c2 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -21,6 +21,10 @@ set(LIB bf_windowmanager ) +if(HAVE_FEENABLEEXCEPT) + add_definitions(-DHAVE_FEENABLEEXCEPT) +endif() + if(WITH_TBB) # Force TBB libraries to be in front of MKL (part of OpenImageDenoise), so # that it is initialized before MKL and static library initialization order diff --git a/source/creator/creator_signals.c b/source/creator/creator_signals.c index 226277da363..65352f047f1 100644 --- a/source/creator/creator_signals.c +++ b/source/creator/creator_signals.c @@ -256,7 +256,7 @@ void main_signal_setup_fpe(void) * set breakpoints on sig_handle_fpe */ signal(SIGFPE, sig_handle_fpe); -# if defined(__linux__) && defined(__GNUC__) +# if defined(__linux__) && defined(__GNUC__) && defined(HAVE_FEENABLEEXCEPT) feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); # endif /* defined(__linux__) && defined(__GNUC__) */ # if defined(OSX_SSE_FPE) |