CMake: Add options to use -fsanitize={address,undefined}

To make bugs like #485, #486, #487 and #488 easier to find in future.
This commit is contained in:
Ahmad Fatoum 2018-02-24 15:26:13 +01:00
parent 6ffc8cb799
commit c9043b5a87
No known key found for this signature in database
GPG Key ID: C3EAC3DE9321D59B
2 changed files with 27 additions and 12 deletions

View File

@ -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()

View File

@ -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...")