123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- project (dmmlib C)
- cmake_minimum_required (VERSION 2.6)
- set(APPLICATION_NAME ${PROJECT_NAME})
- set(APPLICATION_VERSION_MAJOR 0)
- set(APPLICATION_VERSION_MINOR 5)
- set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
- set(DMM_DATA_ALIGNMENT "${CMAKE_SIZEOF_VOID_P}")
- include(DefineInstallationPaths)
- include(DefineOptions.cmake)
- include(MacroEnsureOutOfSourceBuild)
- macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
- if(CMAKE_COMPILER_IS_GNUCC)
- add_definitions(-std=c99 -Wall -Wextra -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion -Wstrict-prototypes)
- endif(CMAKE_COMPILER_IS_GNUCC)
- # Set to debug build if no such choice was made
- if(NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE Debug)
- endif(NOT CMAKE_BUILD_TYPE)
- if(CMAKE_BUILD_TYPE STREQUAL "Debug")
- set(WITH_DEBUG ON)
- endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
- if(WITH_SYSTEM_CALLS STREQUAL "mmap")
- set(PAGESIZE_ALIGN ON)
- if(NOT DEFINED SYS_ALLOC_SIZE)
- message(FATAL_ERROR "You have to set SYS_ALLOC_SIZE by using -DSYS_ALLOC_SIZE={int}.")
- endif(NOT DEFINED SYS_ALLOC_SIZE)
- endif(WITH_SYSTEM_CALLS STREQUAL "mmap")
- # Checking locks
- if(NOT HAVE_LOCKS AND TRYLOCK_ON_MALLOC)
- message(FATAL_ERROR "You have to set HAVE_LOCKS to use TRYLOCK_ON_MALLOC.")
- endif(NOT HAVE_LOCKS AND TRYLOCK_ON_MALLOC)
- if(HAVE_LOCKS)
- find_package(Threads)
- endif(HAVE_LOCKS)
- # Checking free-list setups
- if(RAW_BLOCKS_TYPE STREQUAL "freelist")
- set(FL_RB_ONLY ON)
- if(FITTING_POLICY STREQUAL "best")
- set(BEST_FIT ON)
- elseif(FITTING_POLICY STREQUAL "exact")
- set(EXACT_FIT ON)
- elseif(FITTING_POLICY STREQUAL "first")
- set(FIRST_FIT ON)
- elseif(FITTING_POLICY STREQUAL "good")
- if(NOT DEFINED GOOD_FIT_PERCENTAGE)
- message(FATAL_ERROR "You have to set GOOD_FIT_PERCENTAGE by using -DGOOD_FIT_PERCENTAGE={0.f}.")
- endif(NOT DEFINED GOOD_FIT_PERCENTAGE)
- set(GOOD_FIT ON)
- else(FITTING_POLICY STREQUAL "best")
- message(FATAL_ERROR "Could not identify the fitting policy of the freelist organization.")
- endif(FITTING_POLICY STREQUAL "best")
-
- if(ORDERING_POLICY STREQUAL "address")
- set(ADDRESS_ORDERED ON)
- elseif(ORDERING_POLICY STREQUAL "fifo")
- set(FIFO_ORDERED ON)
- elseif(ORDERING_POLICY STREQUAL "lifo")
- set(LIFO_ORDERED ON)
- elseif(ORDERING_POLICY STREQUAL "size")
- set(SIZE_ORDERED ON)
- endif(ORDERING_POLICY STREQUAL "address")
-
- if(WITH_COALESCING STREQUAL "fixed")
- if(NOT DEFINED MAX_COAL_SIZE)
- message(FATAL_ERROR "You have to set MAX_COAL_SIZE by using -DMAX_COAL_SIZE={int}.")
- endif(NOT DEFINED MAX_COAL_SIZE)
- set(COALESCING_FIXED ON)
- elseif(WITH_COALESCING STREQUAL "variable")
- if(NOT DEFINED MAX_COAL_SIZE)
- message(FATAL_ERROR "You have to set MAX_COAL_SIZE by using -DMAX_COAL_SIZE={int}.")
- endif(NOT DEFINED MAX_COAL_SIZE)
- set(COALESCING_VARIABLE ON)
- endif(WITH_COALESCING STREQUAL "fixed")
-
- if(WITH_SPLITTING STREQUAL "fixed")
- if(NOT DEFINED MIN_SPLIT_SIZE)
- message(FATAL_ERROR "You have to set MIN_SPLIT_SIZE by using -DMIN_SPLIT_SIZE={int}.")
- endif(NOT DEFINED MIN_SPLIT_SIZE)
- set(SPLITTING_FIXED ON)
- elseif(WITH_SPLITTING STREQUAL "variable")
- if(NOT DEFINED MIN_SPLIT_SIZE)
- message(FATAL_ERROR "You have to set MIN_SPLIT_SIZE by using -DMIN_SPLIT_SIZE={int}.")
- endif(NOT DEFINED MIN_SPLIT_SIZE)
- set(WITH_KNOBS ON)
- set(SPLITTING_VARIABLE ON)
- endif(WITH_SPLITTING STREQUAL "fixed")
- if(COALESCE_AFTER_SPLIT)
- if(WITH_SPLITTING STREQUAL "never")
- message(FATAL_ERROR "You have to set WITH_SPLITTING to fixed or variable if you want to coalesce after split.")
- endif(WITH_SPLITTING STREQUAL "never")
- if(WITH_COALESCING STREQUAL "never")
- message(FATAL_ERROR "You have to set WITH_COALESCING to fixed or variable if you want to coalesce after split.")
- endif(WITH_COALESCING STREQUAL "never")
- endif(COALESCE_AFTER_SPLIT)
- # Checking bitmap setups
- elseif(RAW_BLOCKS_TYPE STREQUAL "bitmap")
- set(BITMAP_RB_ONLY ON)
- endif(RAW_BLOCKS_TYPE STREQUAL "freelist")
- if(STATS STREQUAL "global")
- set(WITH_ALLOCATOR_STATS ON)
- endif(STATS STREQUAL "global")
- if(PAGESIZE_ALIGN)
- execute_process(COMMAND getconf PAGESIZE OUTPUT_VARIABLE SYS_PAGESIZE)
- string(STRIP ${SYS_PAGESIZE} SYS_PAGESIZE)
- MATH( EXPR PS_NOT_POW_2 "${SYS_PAGESIZE} & (${SYS_PAGESIZE} - 1)" )
- if(NOT SYS_PAGESIZE OR PS_NOT_POW_2)
- message(FATAL_ERROR "System page size (" ${SYS_PAGESIZE}
- ") is reported not to be a power of two.")
- endif(NOT SYS_PAGESIZE OR PS_NOT_POW_2)
- MATH( EXPR SAS_MOD_PG "${SYS_ALLOC_SIZE} % ${SYS_PAGESIZE}" )
- if(SAS_MOD_PG)
- message(FATAL_ERROR "System allocation size (" ${SYS_ALLOC_SIZE}
- ") is not a multiple of the system page size (" ${SYS_PAGESIZE}
- "). Please set it so that it is.")
- endif(SAS_MOD_PG)
- endif(PAGESIZE_ALIGN)
- MATH( EXPR SAS_NOT_POW_2 "${SYS_ALLOC_SIZE} & (${SYS_ALLOC_SIZE} - 1)" )
- if(NOT SYS_ALLOC_SIZE OR SAS_NOT_POW_2)
- message(FATAL_ERROR "You have to set SYS_ALLOC_SIZE (" ${SYS_ALLOC_SIZE}
- ") to a power of two.")
- endif(NOT SYS_ALLOC_SIZE OR SAS_NOT_POW_2)
- configure_file (
- "${PROJECT_SOURCE_DIR}/config.h.cmake"
- "${PROJECT_BINARY_DIR}/dmmlib/config.h"
- )
- install(
- FILES
- ${PROJECT_BINARY_DIR}/dmmlib/config.h
- DESTINATION
- ${INCLUDE_INSTALL_DIR}/dmmlib
- COMPONENT
- headers
- )
- include_directories("${PROJECT_BINARY_DIR}")
- add_subdirectory(include)
- add_subdirectory(src)
- if(WITH_EXAMPLES)
- add_subdirectory(examples)
- endif (WITH_EXAMPLES)
- if(WITH_DOC)
- add_subdirectory(doc)
- endif (WITH_DOC)
- message(STATUS "********************************************")
- message(STATUS "********** ${PROJECT_NAME} v${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR} build options : **********")
- message(STATUS "OS call for memory requests: " ${WITH_SYSTEM_CALLS})
- if(NOT WITH_SYSTEM_CALLS STREQUAL "none")
- message(STATUS "Default allocation size for OS calls: " ${SYS_ALLOC_SIZE} " bytes")
- endif(NOT WITH_SYSTEM_CALLS STREQUAL "none")
- message(STATUS "POSIX locking mechanisms: " ${HAVE_LOCKS})
- if(HAVE_LOCKS)
- message(STATUS "Use a trylock on malloc(): " ${TRYLOCK_ON_MALLOC})
- endif(HAVE_LOCKS)
- message(STATUS "Raw blocks type: " ${RAW_BLOCKS_TYPE})
- if(RAW_BLOCKS_TYPE STREQUAL "freelist")
- if(BLOCKS_ORGANIZATION STREQUAL "dll")
- message(STATUS "Block organization: Doubly-Linked Lists")
- else(BLOCKS_ORGANIZATION STREQUAL "dll")
- message(STATUS "Block organization: Singly-Linked Lists")
- endif(BLOCKS_ORGANIZATION STREQUAL "dll")
- message(STATUS "Fitting policy: " ${FITTING_POLICY})
- if(GOOD_FIT)
- message(STATUS "Acceptable fit percentage: " ${GOOD_FIT_PERCENTAGE})
- endif(GOOD_FIT)
- message(STATUS "Ordering policy: " ${ORDERING_POLICY})
- message(STATUS "Coalescing: " ${WITH_COALESCING})
- if(MAX_COAL_SIZE)
- if(WITH_COALESCING STREQUAL "fixed")
- message(STATUS " with max. coalescing size: " ${MAX_COAL_SIZE} " bytes")
- elseif(WITH_COALESCING STREQUAL "variable")
- message(STATUS " with initial max. coalescing size: " ${MAX_COAL_SIZE}
- " bytes")
- endif(WITH_COALESCING STREQUAL "fixed")
- endif(MAX_COAL_SIZE)
- message(STATUS "Splitting: " ${WITH_SPLITTING})
- if(MIN_SPLIT_SIZE)
- if(WITH_SPLITTING STREQUAL "fixed")
- message(STATUS " with min. splitting size: " ${MIN_SPLIT_SIZE} " bytes")
- elseif(WITH_SPLITTING STREQUAL "variable")
- message(STATUS " with initial min. splitting size: "
- ${MIN_SPLIT_SIZE} " bytes")
- endif(WITH_SPLITTING STREQUAL "fixed")
- message(STATUS "Coalesce after split: " ${FREELIST_COALESCE_AFTER_SPLIT})
- endif(MIN_SPLIT_SIZE)
- elseif(RAW_BLOCKS_TYPE STREQUAL "bitmap")
- message(STATUS "Bitmap cell resolution: " ${BITMAP_RESOLUTION} " bytes")
- endif(RAW_BLOCKS_TYPE STREQUAL "freelist")
- message(STATUS "Have knobs: " ${WITH_KNOBS})
- message(STATUS "Have statistics: " ${STATS})
- message(STATUS "Requested Size per Block: " ${REQUEST_SIZE_INFO})
- message(STATUS "Support for debug functions: " ${WITH_DEBUG})
- message(STATUS "Support for memory traces: " ${WITH_MEM_TRACE})
- message(STATUS "Support for statistics traces: " ${WITH_STATS_TRACE})
- message(STATUS "Support for realloc(): " ${WITH_REALLOC})
- message(STATUS "Support for calloc(): " ${WITH_CALLOC})
- message(STATUS "Support for memalign(): " ${WITH_MEMALIGN})
- message(STATUS "Support for GLIBC hooks: " ${WITH_GLIBC_HOOKS})
- message(STATUS "Support to parse dmmlib environment variables: " ${PARSE_ENV})
- message(STATUS "********************************************")
|