diff --git a/CMakeLists.txt b/CMakeLists.txt index 11db057e..0e70eab4 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,10 @@ cmake_minimum_required(VERSION 3.0) # Config options -set(BUILD_EXAMPLES ON CACHE BOOL "Build the examples.") -set(BUILD_GAMES ON CACHE BOOL "Build the example games.") +option(BUILD_EXAMPLES "Build the examples." ON) +option(BUILD_GAMES "Build the example games." ON) +option(ENABLE_ASAN "Enable AddressSanitizer (ASAN) for debugging (degrades performance)" OFF) +option(ENABLE_UBSAN "Enable UndefinedBehaviorSanitizer (UBSan) for debugging" OFF) if(CMAKE_VERSION VERSION_LESS "3.1") if(CMAKE_C_COMPILER_ID STREQUAL "GNU") @@ -11,17 +13,31 @@ if(CMAKE_VERSION VERSION_LESS "3.1") else() set (CMAKE_C_STANDARD 99) endif() + include(CheckCCompilerFlag) -foreach(option -Werror=pointer-arith;-Werror=implicit-function-declaration) - CHECK_C_COMPILER_FLAG("${option}" COMPILER_HAS_THOSE_TOGGLES) +function(add_if_flag_works flag) + CHECK_C_COMPILER_FLAG("${flag}" COMPILER_HAS_THOSE_TOGGLES) set(outcome "Failed") if(COMPILER_HAS_THOSE_TOGGLES) - set(CMAKE_C_FLAGS "${option} ${CMAKE_C_FLAGS}") + foreach(var ${ARGN}) + set(${var} "${flag} ${${var}}" PARENT_SCOPE) + endforeach() set(outcome "works") endif() - message(STATUS "Testing if ${option} can be used -- ${outcome}") -endforeach() + message(STATUS "Testing if ${flag} can be used -- ${outcome}") +endfunction() +add_if_flag_works(-Werror=pointer-arith CMAKE_C_FLAGS) +add_if_flag_works(-Werror=implicit-function-declaration CMAKE_C_FLAGS) + +if (ENABLE_ASAN) + add_if_flag_works(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS) + add_if_flag_works(-fsanitize=address CMAKE_C_FLAGS CMAKE_LINKER_FLAGS) +endif() +if (ENABLE_UBSAN) + add_if_flag_works(-fno-omit-frame-pointer CMAKE_C_FLAGS CMAKE_LINKER_FLAGS) + add_if_flag_works(-fsanitize=undefined CMAKE_C_FLAGS CMAKE_LINKER_FLAGS) +endif() add_subdirectory(src release) @@ -32,4 +48,3 @@ endif() if (${BUILD_GAMES}) add_subdirectory(games) endif() - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6f759324..db5d55c3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,11 +8,11 @@ set(RAYLIB raylib) # Name of the generated library ### Config options ### # Shared library is always PIC. Static library should be PIC too if linked into a shared library -set(WITH_PIC OFF CACHE BOOL "Compile static library as position-independent code" OFF) +option(WITH_PIC "Compile static library as position-independent code" OFF) # Build a static and/or shared raylib? -set(SHARED OFF CACHE BOOL "Build raylib as a dynamic library") -set(STATIC ON CACHE BOOL "Build raylib as a static library") -set(MACOS_FATLIB ON CACHE BOOL "Build fat library for both i386 and x86_64 on macOS") +option(SHARED "Build raylib as a dynamic library" OFF) +option(STATIC "Build raylib as a static library" ON) +option(MACOS_FATLIB "Build fat library for both i386 and x86_64 on macOS" ON) if(NOT (STATIC OR SHARED)) message(FATAL_ERROR "Nothing to do if both -DSHARED=OFF and -DSTATIC=OFF...")