2022-12-19 18:39:52 -08:00
cmake_minimum_required ( VERSION 3.13 )
2019-07-07 18:11:21 -07:00
project ( libmimalloc C CXX )
2019-11-01 22:01:52 -07:00
2019-06-19 16:52:36 -07:00
set ( CMAKE_C_STANDARD 11 )
2019-07-07 18:11:21 -07:00
set ( CMAKE_CXX_STANDARD 17 )
2019-06-19 16:52:36 -07:00
2019-11-21 15:21:23 -08:00
option ( MI_SECURE "Use full security mitigations (like guard pages, allocation randomization, double-free mitigation, and free-list corruption detection)" OFF )
2020-05-04 11:01:11 -07:00
option ( MI_DEBUG_FULL "Use full internal heap invariant checking in DEBUG mode (expensive)" OFF )
2023-03-05 11:01:51 -08:00
option ( MI_PADDING "Enable padding to detect heap block overflow (always on in DEBUG or SECURE mode, or with Valgrind/ASAN)" OFF )
2020-05-04 11:01:11 -07:00
option ( MI_OVERRIDE "Override the standard malloc interface (e.g. define entry points for malloc() etc)" ON )
option ( MI_XMALLOC "Enable abort() call on memory allocation failure by default" OFF )
option ( MI_SHOW_ERRORS "Show error and warning messages by default (only enabled by default in DEBUG mode)" OFF )
2022-10-30 12:49:29 -07:00
option ( MI_VALGRIND "Compile with Valgrind support (adds a small overhead)" OFF )
2022-11-28 10:55:19 -08:00
option ( MI_ASAN "Compile with address sanitizer support (adds a small overhead)" OFF )
2020-05-04 11:01:11 -07:00
option ( MI_USE_CXX "Use the C++ compiler to compile the library (instead of the C compiler)" OFF )
2019-11-14 11:01:05 -08:00
option ( MI_SEE_ASM "Generate assembly files" OFF )
2021-11-02 21:54:44 -07:00
option ( MI_OSX_INTERPOSE "Use interpose to override standard malloc on macOS" ON )
2022-12-03 00:23:43 +01:00
option ( MI_OSX_ZONE "Use malloc zone to override standard malloc on macOS" ON )
2022-10-31 15:26:21 -07:00
option ( MI_WIN_REDIRECT "Use redirection module ('mimalloc-redirect') on Windows if compiling mimalloc as a DLL" ON )
2019-09-04 12:02:16 +02:00
option ( MI_LOCAL_DYNAMIC_TLS "Use slightly slower, dlopen-compatible TLS mechanism (Unix)" OFF )
2020-04-28 18:12:43 +03:00
option ( MI_BUILD_SHARED "Build shared library" ON )
option ( MI_BUILD_STATIC "Build static library" ON )
2020-05-04 11:01:11 -07:00
option ( MI_BUILD_OBJECT "Build object library" ON )
option ( MI_BUILD_TESTS "Build test executables" ON )
2020-07-21 09:10:45 -07:00
option ( MI_DEBUG_TSAN "Build with thread sanitizer (needs clang)" OFF )
2020-07-25 19:55:36 -07:00
option ( MI_DEBUG_UBSAN "Build with undefined-behavior sanitizer (needs clang++)" OFF )
2022-02-03 15:56:53 -08:00
option ( MI_SKIP_COLLECT_ON_EXIT, "Skip collecting memory on program exit" OFF )
2023-03-05 11:01:51 -08:00
option ( MI_NO_PADDING "Force no use of padding even in DEBUG mode ets." OFF )
2021-12-15 08:53:55 -08:00
# deprecated options
2020-05-04 11:01:11 -07:00
option ( MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode (deprecated, use MI_DEBUG_FULL instead)" OFF )
2021-12-15 08:53:55 -08:00
option ( MI_INSTALL_TOPLEVEL "Install directly into $CMAKE_INSTALL_PREFIX instead of PREFIX/lib/mimalloc-version (deprecated)" OFF )
option ( MI_USE_LIBATOMIC "Explicitly link with -latomic (on older systems) (deprecated and detected automatically)" OFF )
2019-06-19 16:52:36 -07:00
2022-10-30 12:49:29 -07:00
include ( CheckIncludeFiles )
2021-09-28 20:34:56 +03:00
include ( GNUInstallDirs )
2019-11-03 13:34:54 -08:00
include ( "cmake/mimalloc-config-version.cmake" )
2019-06-19 16:52:36 -07:00
set ( mi_sources
s r c / s t a t s . c
2019-12-22 17:07:01 -08:00
s r c / r a n d o m . c
2019-06-19 16:52:36 -07:00
s r c / o s . c
2020-09-08 10:14:13 -07:00
s r c / b i t m a p . c
2019-11-01 20:19:00 -07:00
s r c / a r e n a . c
2020-01-25 13:28:49 -08:00
s r c / r e g i o n . c
2019-06-19 16:52:36 -07:00
s r c / s e g m e n t . c
s r c / p a g e . c
s r c / a l l o c . c
s r c / a l l o c - a l i g n e d . c
2019-07-07 13:44:33 -07:00
s r c / a l l o c - p o s i x . c
2019-06-19 16:52:36 -07:00
s r c / h e a p . c
s r c / o p t i o n s . c
s r c / i n i t . c )
2023-03-04 09:58:17 -08:00
set ( mi_cflags "" )
set ( mi_libraries "" )
2021-11-04 18:55:12 -07:00
2019-11-14 11:01:05 -08:00
# -----------------------------------------------------------------------------
2021-09-16 03:35:56 +09:00
# Convenience: set default build type depending on the build directory
2019-11-14 11:01:05 -08:00
# -----------------------------------------------------------------------------
2022-12-03 00:23:43 +01:00
message ( STATUS "" )
2019-06-19 16:52:36 -07:00
if ( NOT CMAKE_BUILD_TYPE )
2021-01-22 19:49:15 -03:00
if ( "${CMAKE_BINARY_DIR}" MATCHES ".*(D|d)ebug$" OR MI_DEBUG_FULL )
2019-11-14 11:01:05 -08:00
message ( STATUS "No build type selected, default to: Debug" )
2019-06-19 16:52:36 -07:00
set ( CMAKE_BUILD_TYPE "Debug" )
else ( )
2019-11-14 11:01:05 -08:00
message ( STATUS "No build type selected, default to: Release" )
2019-06-19 16:52:36 -07:00
set ( CMAKE_BUILD_TYPE "Release" )
endif ( )
endif ( )
if ( "${CMAKE_BINARY_DIR}" MATCHES ".*(S|s)ecure$" )
2019-11-14 11:01:05 -08:00
message ( STATUS "Default to secure build" )
2019-06-24 18:54:03 -07:00
set ( MI_SECURE "ON" )
2019-06-19 16:52:36 -07:00
endif ( )
2021-11-04 18:55:12 -07:00
2019-11-14 11:01:05 -08:00
# -----------------------------------------------------------------------------
# Process options
# -----------------------------------------------------------------------------
2022-04-14 16:47:43 -07:00
if ( CMAKE_C_COMPILER_ID MATCHES "MSVC|Intel" )
2019-07-23 09:59:20 -07:00
set ( MI_USE_CXX "ON" )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_OVERRIDE )
2019-06-24 18:54:03 -07:00
message ( STATUS "Override standard malloc (MI_OVERRIDE=ON)" )
2019-06-19 16:52:36 -07:00
if ( APPLE )
2021-01-22 19:49:15 -03:00
if ( MI_OSX_ZONE )
2020-02-08 20:08:52 -08:00
# use zone's on macOS
message ( STATUS " Use malloc zone to override malloc (MI_OSX_ZONE=ON)" )
list ( APPEND mi_sources src/alloc-override-osx.c )
2022-12-03 00:23:43 +01:00
list ( APPEND mi_defines MI_OSX_ZONE=1 )
2021-11-02 21:54:44 -07:00
if ( NOT MI_OSX_INTERPOSE )
message ( STATUS " WARNING: zone overriding usually also needs interpose (use -DMI_OSX_INTERPOSE=ON)" )
endif ( )
2020-02-08 20:08:52 -08:00
endif ( )
2021-10-20 09:35:58 -07:00
if ( MI_OSX_INTERPOSE )
2019-06-23 15:29:41 +08:00
# use interpose on macOS
2021-10-20 09:35:58 -07:00
message ( STATUS " Use interpose to override malloc (MI_OSX_INTERPOSE=ON)" )
2021-11-04 18:55:12 -07:00
list ( APPEND mi_defines MI_OSX_INTERPOSE=1 )
2021-11-02 21:54:44 -07:00
if ( NOT MI_OSX_ZONE )
message ( STATUS " WARNING: interpose usually also needs zone overriding (use -DMI_OSX_INTERPOSE=ON)" )
endif ( )
2019-06-19 16:52:36 -07:00
endif ( )
2022-04-07 16:12:16 -07:00
if ( MI_USE_CXX AND MI_OSX_INTERPOSE )
message ( STATUS " WARNING: if dynamically overriding malloc/free, it is more reliable to build mimalloc as C code (use -DMI_USE_CXX=OFF)" )
2021-11-04 18:55:12 -07:00
endif ( )
2019-06-19 16:52:36 -07:00
endif ( )
endif ( )
2022-10-31 15:26:21 -07:00
if ( WIN32 )
if ( MI_WIN_REDIRECT )
if ( MSVC_C_ARCHITECTURE_ID MATCHES "ARM" )
message ( STATUS "Cannot use redirection on Windows ARM (MI_WIN_REDIRECT=OFF)" )
set ( MI_WIN_REDIRECT OFF )
endif ( )
endif ( )
if ( NOT MI_WIN_REDIRECT )
# use a negative define for backward compatibility
list ( APPEND mi_defines MI_WIN_NOREDIRECT=1 )
endif ( )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_SECURE )
2019-11-21 15:21:23 -08:00
message ( STATUS "Set full secure build (MI_SECURE=ON)" )
2019-11-07 10:26:52 -08:00
list ( APPEND mi_defines MI_SECURE=4 )
2022-10-30 14:20:35 -07:00
#if (MI_VALGRIND)
# message(WARNING "Secure mode is a bit weakened when compiling with Valgrind support as buffer overflow detection is no longer byte-precise (if running without valgrind)")
#endif()
2019-06-19 16:52:36 -07:00
endif ( )
2022-10-30 12:49:29 -07:00
if ( MI_VALGRIND )
CHECK_INCLUDE_FILES ( "valgrind/valgrind.h;valgrind/memcheck.h" MI_HAS_VALGRINDH )
if ( NOT MI_HAS_VALGRINDH )
set ( MI_VALGRIND OFF )
message ( WARNING "Cannot find the 'valgrind/valgrind.h' and 'valgrind/memcheck.h' -- install valgrind first" )
message ( STATUS "Compile **without** Valgrind support (MI_VALGRIND=OFF)" )
else ( )
message ( STATUS "Compile with Valgrind support (MI_VALGRIND=ON)" )
list ( APPEND mi_defines MI_VALGRIND=1 )
endif ( )
endif ( )
2022-11-28 10:55:19 -08:00
if ( MI_ASAN )
2023-03-04 09:58:17 -08:00
if ( APPLE AND MI_OVERRIDE )
set ( MI_ASAN OFF )
message ( WARNING "Cannot enable address sanitizer support on macOS if MI_OVERRIDE is ON (MI_ASAN=OFF)" )
endif ( )
2022-11-28 10:55:19 -08:00
if ( MI_VALGRIND )
set ( MI_ASAN OFF )
message ( WARNING "Cannot enable address sanitizer support with also Valgrind support enabled (MI_ASAN=OFF)" )
2023-03-04 09:58:17 -08:00
endif ( )
if ( MI_ASAN )
2022-11-28 10:55:19 -08:00
CHECK_INCLUDE_FILES ( "sanitizer/asan_interface.h" MI_HAS_ASANH )
if ( NOT MI_HAS_ASANH )
set ( MI_ASAN OFF )
message ( WARNING "Cannot find the 'sanitizer/asan_interface.h' -- install address sanitizer support first" )
message ( STATUS "Compile **without** address sanitizer support (MI_ASAN=OFF)" )
else ( )
message ( STATUS "Compile with address sanitizer support (MI_ASAN=ON)" )
list ( APPEND mi_defines MI_ASAN=1 )
list ( APPEND mi_cflags -fsanitize=address )
2023-03-04 09:58:17 -08:00
list ( APPEND mi_libraries -fsanitize=address )
2022-11-28 10:55:19 -08:00
endif ( )
endif ( )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_SEE_ASM )
2019-06-24 18:54:03 -07:00
message ( STATUS "Generate assembly listings (MI_SEE_ASM=ON)" )
2019-06-19 16:52:36 -07:00
list ( APPEND mi_cflags -save-temps )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_CHECK_FULL )
2019-11-14 11:01:05 -08:00
message ( STATUS "The MI_CHECK_FULL option is deprecated, use MI_DEBUG_FULL instead" )
set ( MI_DEBUG_FULL "ON" )
endif ( )
2022-01-18 21:11:12 -08:00
if ( MI_SKIP_COLLECT_ON_EXIT )
2022-02-03 15:56:53 -08:00
message ( STATUS "Skip collecting memory on program exit (MI_SKIP_COLLECT_ON_EXIT=ON)" )
2022-01-18 21:11:12 -08:00
list ( APPEND mi_defines MI_SKIP_COLLECT_ON_EXIT=1 )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_DEBUG_FULL )
2019-11-21 15:21:23 -08:00
message ( STATUS "Set debug level to full internal invariant checking (MI_DEBUG_FULL=ON)" )
2019-06-19 16:52:36 -07:00
list ( APPEND mi_defines MI_DEBUG=3 ) # full invariant checking
endif ( )
2023-03-05 11:01:51 -08:00
if ( MI_NO_PADDING )
message ( STATUS "Suppress any padding of heap blocks (MI_NO_PADDING=ON)" )
list ( APPEND mi_defines MI_PADDING=0 )
else ( )
if ( MI_PADDING )
message ( STATUS "Enable explicit padding of heap blocks (MI_PADDING=ON)" )
list ( APPEND mi_defines MI_PADDING=1 )
endif ( )
2020-04-07 10:01:18 -07:00
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_XMALLOC )
2020-04-21 11:39:57 +03:00
message ( STATUS "Enable abort() calls on memory allocation failure (MI_XMALLOC=ON)" )
list ( APPEND mi_defines MI_XMALLOC=1 )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_SHOW_ERRORS )
2020-04-21 10:27:42 +03:00
message ( STATUS "Enable printing of error and warning messages by default (MI_SHOW_ERRORS=ON)" )
list ( APPEND mi_defines MI_SHOW_ERRORS=1 )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_DEBUG_TSAN )
2020-07-25 19:55:36 -07:00
if ( CMAKE_C_COMPILER_ID MATCHES "Clang" )
message ( STATUS "Build with thread sanitizer (MI_DEBUG_TSAN=ON)" )
2020-07-25 23:50:22 -07:00
list ( APPEND mi_defines MI_TSAN=1 )
2020-07-25 19:55:36 -07:00
list ( APPEND mi_cflags -fsanitize=thread -g -O1 )
2023-03-04 09:58:17 -08:00
list ( APPEND mi_libraries -fsanitize=thread )
2020-07-25 19:55:36 -07:00
else ( )
2022-12-03 00:23:43 +01:00
message ( WARNING "Can only use thread sanitizer with clang (MI_DEBUG_TSAN=ON but ignored)" )
endif ( )
2020-07-25 19:55:36 -07:00
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_DEBUG_UBSAN )
2022-12-03 00:23:43 +01:00
if ( CMAKE_BUILD_TYPE MATCHES "Debug" )
2020-07-25 19:55:36 -07:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
message ( STATUS "Build with undefined-behavior sanitizer (MI_DEBUG_UBSAN=ON)" )
2022-02-10 11:46:28 -08:00
list ( APPEND mi_cflags -fsanitize=undefined -g -fno-sanitize-recover=undefined )
2023-03-04 09:58:17 -08:00
list ( APPEND mi_libraries -fsanitize=undefined )
2021-01-22 19:49:15 -03:00
if ( NOT MI_USE_CXX )
2020-07-25 19:55:36 -07:00
message ( STATUS "(switch to use C++ due to MI_DEBUG_UBSAN)" )
set ( MI_USE_CXX "ON" )
endif ( )
else ( )
2022-12-03 00:23:43 +01:00
message ( WARNING "Can only use undefined-behavior sanitizer with clang++ (MI_DEBUG_UBSAN=ON but ignored)" )
endif ( )
2020-07-25 19:55:36 -07:00
else ( )
2022-12-03 00:23:43 +01:00
message ( WARNING "Can only use thread sanitizer with a debug build (CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})" )
2020-07-25 19:55:36 -07:00
endif ( )
endif ( )
2021-01-22 19:49:15 -03:00
if ( MI_USE_CXX )
2019-06-24 18:54:03 -07:00
message ( STATUS "Use the C++ compiler to compile (MI_USE_CXX=ON)" )
2019-06-19 16:52:36 -07:00
set_source_files_properties ( ${ mi_sources } PROPERTIES LANGUAGE CXX )
2022-02-10 11:58:25 -08:00
set_source_files_properties ( src/static.c test/test-api.c test/test-api-fill test/test-stress PROPERTIES LANGUAGE CXX )
2020-01-17 15:39:41 -08:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "AppleClang|Clang" )
list ( APPEND mi_cflags -Wno-deprecated )
endif ( )
2022-06-06 16:18:33 +00:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "Intel" AND NOT CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM" )
2020-01-19 18:35:45 -08:00
list ( APPEND mi_cflags -Kc++ )
endif ( )
2019-06-19 16:52:36 -07:00
endif ( )
# Compiler flags
if ( CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang|GNU" )
2021-10-20 09:55:03 -07:00
list ( APPEND mi_cflags -Wall -Wextra -Wno-unknown-pragmas -fvisibility=hidden )
if ( NOT MI_USE_CXX )
list ( APPEND mi_cflags -Wstrict-prototypes )
2022-12-03 00:23:43 +01:00
endif ( )
2021-06-07 17:51:27 -07:00
if ( CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang" )
list ( APPEND mi_cflags -Wpedantic -Wno-static-in-inline )
endif ( )
2020-01-19 18:35:45 -08:00
endif ( )
if ( CMAKE_C_COMPILER_ID MATCHES "Intel" )
list ( APPEND mi_cflags -Wall -fvisibility=hidden )
endif ( )
2020-06-28 13:53:45 +00:00
if ( CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang|GNU|Intel" AND NOT CMAKE_SYSTEM_NAME MATCHES "Haiku" )
2021-01-22 19:49:15 -03:00
if ( MI_LOCAL_DYNAMIC_TLS )
2019-09-04 12:02:16 +02:00
list ( APPEND mi_cflags -ftls-model=local-dynamic )
else ( )
list ( APPEND mi_cflags -ftls-model=initial-exec )
endif ( )
2021-11-02 21:54:44 -07:00
if ( MI_OVERRIDE )
2021-11-13 13:30:03 -08:00
list ( APPEND mi_cflags -fno-builtin-malloc )
2021-11-02 21:54:44 -07:00
endif ( )
2019-06-19 16:52:36 -07:00
endif ( )
2021-01-28 23:58:41 -03:00
if ( MSVC AND MSVC_VERSION GREATER_EQUAL 1914 )
list ( APPEND mi_cflags /Zc:__cplusplus )
endif ( )
2019-06-19 16:52:36 -07:00
# extra needed libraries
if ( WIN32 )
2020-09-06 08:33:27 -07:00
list ( APPEND mi_libraries psapi shell32 user32 advapi32 bcrypt )
2022-06-19 13:20:53 -04:00
set ( pc_libraries "-lpsapi -lshell32 -luser32 -ladvapi32 -lbcrypt" )
2019-06-19 16:52:36 -07:00
else ( )
2022-10-31 15:49:04 -07:00
set ( pc_libraries "" )
2021-12-15 08:41:52 -08:00
find_library ( MI_LIBPTHREAD pthread )
2022-12-03 00:23:43 +01:00
if ( MI_LIBPTHREAD )
2021-12-15 08:41:52 -08:00
list ( APPEND mi_libraries ${ MI_LIBPTHREAD } )
2022-10-31 15:49:04 -07:00
set ( pc_libraries "${pc_libraries} -pthread" )
2019-08-24 21:24:56 +08:00
endif ( )
2021-12-15 08:41:52 -08:00
find_library ( MI_LIBRT rt )
if ( MI_LIBRT )
list ( APPEND mi_libraries ${ MI_LIBRT } )
2022-06-19 13:20:53 -04:00
set ( pc_libraries "${pc_libraries} -lrt" )
endif ( )
2021-12-15 08:42:58 -08:00
find_library ( MI_LIBATOMIC atomic )
2022-12-03 00:23:43 +01:00
if ( NOT MI_LIBATOMIC AND MI_USE_LIBATOMIC )
2022-10-31 15:53:36 -07:00
set ( MI_LIBATOMIC atomic )
endif ( )
2022-12-03 00:23:43 +01:00
if ( MI_LIBATOMIC )
2022-10-31 15:53:36 -07:00
list ( APPEND mi_libraries ${ MI_LIBATOMIC } )
2022-06-19 13:20:53 -04:00
set ( pc_libraries "${pc_libraries} -latomic" )
2021-12-15 08:42:58 -08:00
endif ( )
2021-10-20 09:35:58 -07:00
endif ( )
2019-06-27 13:36:19 -07:00
# -----------------------------------------------------------------------------
2019-11-14 11:01:05 -08:00
# Install and output names
2019-06-27 13:36:19 -07:00
# -----------------------------------------------------------------------------
2021-12-15 08:41:52 -08:00
# dynamic/shared library and symlinks always go to /usr/local/lib equivalent
2022-01-10 16:53:19 -08:00
set ( mi_install_libdir "${CMAKE_INSTALL_LIBDIR}" )
2021-12-14 18:29:14 -08:00
2021-12-15 08:41:52 -08:00
# static libraries and object files, includes, and cmake config files
# are either installed at top level, or use versioned directories for side-by-side installation (default)
2021-01-29 15:49:57 -08:00
if ( MI_INSTALL_TOPLEVEL )
2021-12-14 18:29:14 -08:00
set ( mi_install_objdir "${CMAKE_INSTALL_LIBDIR}" )
2022-12-03 00:23:43 +01:00
set ( mi_install_incdir "${CMAKE_INSTALL_INCLUDEDIR}" )
2021-12-14 18:29:14 -08:00
set ( mi_install_cmakedir "${CMAKE_INSTALL_LIBDIR}/cmake/mimalloc" )
2020-05-30 07:19:57 +02:00
else ( )
2021-12-14 18:29:14 -08:00
set ( mi_install_objdir "${CMAKE_INSTALL_LIBDIR}/mimalloc-${mi_version}" ) # for static library and object files
set ( mi_install_incdir "${CMAKE_INSTALL_INCLUDEDIR}/mimalloc-${mi_version}" ) # for includes
set ( mi_install_cmakedir "${CMAKE_INSTALL_LIBDIR}/cmake/mimalloc-${mi_version}" ) # for cmake package info
2020-05-30 07:19:57 +02:00
endif ( )
2021-01-29 15:49:57 -08:00
2022-10-30 14:20:35 -07:00
set ( mi_basename "mimalloc" )
2021-01-29 15:52:18 -08:00
if ( MI_SECURE )
2022-10-30 14:20:35 -07:00
set ( mi_basename "${mi_basename}-secure" )
endif ( )
if ( MI_VALGRIND )
set ( mi_basename "${mi_basename}-valgrind" )
2022-12-03 00:23:43 +01:00
endif ( )
2022-11-28 10:55:19 -08:00
if ( MI_ASAN )
set ( mi_basename "${mi_basename}-asan" )
2019-11-14 11:01:05 -08:00
endif ( )
string ( TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LC )
2021-10-19 10:56:13 -07:00
if ( NOT(CMAKE_BUILD_TYPE_LC MATCHES "^(release|relwithdebinfo|minsizerel|none)$" ) )
2019-11-14 11:01:05 -08:00
set ( mi_basename "${mi_basename}-${CMAKE_BUILD_TYPE_LC}" ) #append build type (e.g. -debug) if not a release version
endif ( )
2022-10-30 14:20:35 -07:00
2020-05-04 11:01:11 -07:00
if ( MI_BUILD_SHARED )
list ( APPEND mi_build_targets "shared" )
endif ( )
if ( MI_BUILD_STATIC )
list ( APPEND mi_build_targets "static" )
endif ( )
if ( MI_BUILD_OBJECT )
list ( APPEND mi_build_targets "object" )
endif ( )
if ( MI_BUILD_TESTS )
list ( APPEND mi_build_targets "tests" )
endif ( )
2021-01-29 15:49:57 -08:00
2019-11-14 11:01:05 -08:00
message ( STATUS "" )
message ( STATUS "Library base name: ${mi_basename}" )
2021-11-13 13:30:03 -08:00
message ( STATUS "Version : ${mi_version}" )
2019-11-14 11:01:05 -08:00
message ( STATUS "Build type : ${CMAKE_BUILD_TYPE_LC}" )
2021-01-22 19:49:15 -03:00
if ( MI_USE_CXX )
2021-11-04 18:55:12 -07:00
message ( STATUS "C++ Compiler : ${CMAKE_CXX_COMPILER}" )
2020-07-26 00:21:10 -07:00
else ( )
2021-11-04 18:55:12 -07:00
message ( STATUS "C Compiler : ${CMAKE_C_COMPILER}" )
2020-07-26 00:21:10 -07:00
endif ( )
2021-11-13 13:30:03 -08:00
message ( STATUS "Compiler flags : ${mi_cflags}" )
2021-12-13 13:10:33 -08:00
message ( STATUS "Compiler defines : ${mi_defines}" )
message ( STATUS "Link libraries : ${mi_libraries}" )
2020-05-04 11:01:11 -07:00
message ( STATUS "Build targets : ${mi_build_targets}" )
2019-11-14 11:01:05 -08:00
message ( STATUS "" )
# -----------------------------------------------------------------------------
# Main targets
# -----------------------------------------------------------------------------
2019-06-19 16:52:36 -07:00
# shared library
2020-04-28 18:12:43 +03:00
if ( MI_BUILD_SHARED )
add_library ( mimalloc SHARED ${ mi_sources } )
2021-11-28 19:14:31 +02:00
set_target_properties ( mimalloc PROPERTIES VERSION ${ mi_version } SOVERSION ${ mi_version_major } OUTPUT_NAME ${ mi_basename } )
2020-04-28 18:12:43 +03:00
target_compile_definitions ( mimalloc PRIVATE ${ mi_defines } MI_SHARED_LIB MI_SHARED_LIB_EXPORT )
target_compile_options ( mimalloc PRIVATE ${ mi_cflags } )
2023-03-04 16:03:14 -08:00
target_link_libraries ( mimalloc PRIVATE ${ mi_libraries } )
2021-06-07 16:47:57 -07:00
target_include_directories ( mimalloc PUBLIC
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / i n c l u d e >
$ < I N S T A L L _ I N T E R F A C E : $ { m i _ i n s t a l l _ i n c d i r } >
)
2022-10-31 15:26:21 -07:00
if ( WIN32 AND MI_WIN_REDIRECT )
# On windows, link and copy the mimalloc redirection dll too.
2021-05-04 11:26:07 +02:00
if ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
set ( MIMALLOC_REDIRECT_SUFFIX "32" )
else ( )
set ( MIMALLOC_REDIRECT_SUFFIX "" )
endif ( )
target_link_libraries ( mimalloc PRIVATE ${ CMAKE_CURRENT_SOURCE_DIR } /bin/mimalloc-redirect ${ MIMALLOC_REDIRECT_SUFFIX } .lib )
2020-04-28 18:12:43 +03:00
add_custom_command ( TARGET mimalloc POST_BUILD
2021-05-04 11:26:07 +02:00
C O M M A N D " $ { C M A K E _ C O M M A N D } " - E c o p y " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / b i n / m i m a l l o c - r e d i r e c t $ { M I M A L L O C _ R E D I R E C T _ S U F F I X } . d l l " $ < T A R G E T _ F I L E _ D I R : m i m a l l o c >
C O M M E N T " C o p y m i m a l l o c - r e d i r e c t $ { M I M A L L O C _ R E D I R E C T _ S U F F I X } . d l l t o o u t p u t d i r e c t o r y " )
2022-01-26 17:39:58 -06:00
install ( FILES "$<TARGET_FILE_DIR:mimalloc>/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" DESTINATION ${ mi_install_libdir } )
2020-04-28 18:12:43 +03:00
endif ( )
2022-12-03 00:23:43 +01:00
install ( TARGETS mimalloc EXPORT mimalloc DESTINATION ${ mi_install_libdir } LIBRARY )
2021-05-21 15:15:50 -07:00
install ( EXPORT mimalloc DESTINATION ${ mi_install_cmakedir } )
2019-07-23 09:36:58 -07:00
endif ( )
2019-06-19 16:52:36 -07:00
# static library
2020-04-28 18:12:43 +03:00
if ( MI_BUILD_STATIC )
add_library ( mimalloc-static STATIC ${ mi_sources } )
2020-05-04 09:51:09 -07:00
set_property ( TARGET mimalloc-static PROPERTY POSITION_INDEPENDENT_CODE ON )
2020-04-28 18:12:43 +03:00
target_compile_definitions ( mimalloc-static PRIVATE ${ mi_defines } MI_STATIC_LIB )
target_compile_options ( mimalloc-static PRIVATE ${ mi_cflags } )
2022-11-22 10:54:40 -08:00
target_link_libraries ( mimalloc-static PRIVATE ${ mi_libraries } )
2021-06-07 16:47:57 -07:00
target_include_directories ( mimalloc-static PUBLIC
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / i n c l u d e >
$ < I N S T A L L _ I N T E R F A C E : $ { m i _ i n s t a l l _ i n c d i r } >
)
2020-05-04 09:51:09 -07:00
if ( WIN32 )
2020-04-28 18:12:43 +03:00
# When building both static and shared libraries on Windows, a static library should use a
# different output name to avoid the conflict with the import library of a shared one.
string ( REPLACE "mimalloc" "mimalloc-static" mi_output_name ${ mi_basename } )
set_target_properties ( mimalloc-static PROPERTIES OUTPUT_NAME ${ mi_output_name } )
else ( )
set_target_properties ( mimalloc-static PROPERTIES OUTPUT_NAME ${ mi_basename } )
endif ( )
2021-12-14 18:29:14 -08:00
install ( TARGETS mimalloc-static EXPORT mimalloc DESTINATION ${ mi_install_objdir } LIBRARY )
2021-12-26 18:17:53 +09:00
install ( EXPORT mimalloc DESTINATION ${ mi_install_cmakedir } )
2019-06-23 17:26:40 +08:00
endif ( )
2019-06-19 16:52:36 -07:00
2020-04-28 18:12:43 +03:00
# install include files
2021-05-21 15:15:50 -07:00
install ( FILES include/mimalloc.h DESTINATION ${ mi_install_incdir } )
install ( FILES include/mimalloc-override.h DESTINATION ${ mi_install_incdir } )
install ( FILES include/mimalloc-new-delete.h DESTINATION ${ mi_install_incdir } )
install ( FILES cmake/mimalloc-config.cmake DESTINATION ${ mi_install_cmakedir } )
install ( FILES cmake/mimalloc-config-version.cmake DESTINATION ${ mi_install_cmakedir } )
2019-09-15 20:26:30 -07:00
2019-06-19 16:52:36 -07:00
# single object file for more predictable static overriding
2020-04-28 18:12:43 +03:00
if ( MI_BUILD_OBJECT )
add_library ( mimalloc-obj OBJECT src/static.c )
2020-05-04 09:51:09 -07:00
set_property ( TARGET mimalloc-obj PROPERTY POSITION_INDEPENDENT_CODE ON )
2020-04-28 18:12:43 +03:00
target_compile_definitions ( mimalloc-obj PRIVATE ${ mi_defines } )
target_compile_options ( mimalloc-obj PRIVATE ${ mi_cflags } )
2021-06-07 16:47:57 -07:00
target_include_directories ( mimalloc-obj PUBLIC
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / i n c l u d e >
$ < I N S T A L L _ I N T E R F A C E : $ { m i _ i n s t a l l _ i n c d i r } >
)
2020-04-28 18:12:43 +03:00
# the following seems to lead to cmake warnings/errors on some systems, disable for now :-(
2022-01-10 16:53:19 -08:00
# install(TARGETS mimalloc-obj EXPORT mimalloc DESTINATION ${mi_install_objdir})
2020-04-28 18:12:43 +03:00
# the FILES expression can also be: $<TARGET_OBJECTS:mimalloc-obj>
# but that fails cmake versions less than 3.10 so we leave it as is for now
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /CMakeFiles/mimalloc-obj.dir/src/static.c ${ CMAKE_C_OUTPUT_EXTENSION }
2021-12-14 18:29:14 -08:00
D E S T I N A T I O N $ { m i _ i n s t a l l _ o b j d i r }
2020-04-28 18:12:43 +03:00
R E N A M E $ { m i _ b a s e n a m e } $ { C M A K E _ C _ O U T P U T _ E X T E N S I O N } )
endif ( )
2019-06-27 13:36:19 -07:00
2022-06-19 13:20:53 -04:00
# pkg-config file support
include ( "cmake/JoinPaths.cmake" )
join_paths ( includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}" )
join_paths ( libdir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_LIBDIR}" )
configure_file ( mimalloc.pc.in mimalloc.pc @ONLY )
install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/mimalloc.pc"
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ L I B D I R } / p k g c o n f i g / " )
2019-06-27 13:36:19 -07:00
# -----------------------------------------------------------------------------
# API surface testing
# -----------------------------------------------------------------------------
2019-08-28 17:26:56 +02:00
2021-01-22 19:49:15 -03:00
if ( MI_BUILD_TESTS )
2019-08-28 17:26:56 +02:00
enable_testing ( )
2021-12-21 12:54:15 +01:00
2021-12-19 19:45:39 +01:00
foreach ( TEST_NAME api api-fill stress )
2021-12-21 12:54:15 +01:00
add_executable ( mimalloc-test- ${ TEST_NAME } test/test- ${ TEST_NAME } .c )
target_compile_definitions ( mimalloc-test- ${ TEST_NAME } PRIVATE ${ mi_defines } )
target_compile_options ( mimalloc-test- ${ TEST_NAME } PRIVATE ${ mi_cflags } )
target_include_directories ( mimalloc-test- ${ TEST_NAME } PRIVATE include )
target_link_libraries ( mimalloc-test- ${ TEST_NAME } PRIVATE mimalloc ${ mi_libraries } )
add_test ( NAME test- ${ TEST_NAME } COMMAND mimalloc-test- ${ TEST_NAME } )
endforeach ( )
2019-08-28 17:26:56 +02:00
endif ( )
2019-06-27 13:36:19 -07:00
# -----------------------------------------------------------------------------
# Set override properties
# -----------------------------------------------------------------------------
2021-01-22 19:49:15 -03:00
if ( MI_OVERRIDE )
2020-04-28 18:12:43 +03:00
if ( MI_BUILD_SHARED )
target_compile_definitions ( mimalloc PRIVATE MI_MALLOC_OVERRIDE )
endif ( )
2019-06-27 13:36:19 -07:00
if ( NOT WIN32 )
2019-11-14 11:01:05 -08:00
# It is only possible to override malloc on Windows when building as a DLL.
2020-04-28 18:12:43 +03:00
if ( MI_BUILD_STATIC )
target_compile_definitions ( mimalloc-static PRIVATE MI_MALLOC_OVERRIDE )
endif ( )
if ( MI_BUILD_OBJECT )
target_compile_definitions ( mimalloc-obj PRIVATE MI_MALLOC_OVERRIDE )
endif ( )
2019-06-27 13:36:19 -07:00
endif ( )
endif ( )