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:
parent
6ffc8cb799
commit
c9043b5a87
2 changed files with 27 additions and 12 deletions
|
@ -1,8 +1,10 @@
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
|
||||||
# Config options
|
# Config options
|
||||||
set(BUILD_EXAMPLES ON CACHE BOOL "Build the examples.")
|
option(BUILD_EXAMPLES "Build the examples." ON)
|
||||||
set(BUILD_GAMES ON CACHE BOOL "Build the example games.")
|
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_VERSION VERSION_LESS "3.1")
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
|
@ -11,17 +13,31 @@ if(CMAKE_VERSION VERSION_LESS "3.1")
|
||||||
else()
|
else()
|
||||||
set (CMAKE_C_STANDARD 99)
|
set (CMAKE_C_STANDARD 99)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
include(CheckCCompilerFlag)
|
||||||
foreach(option -Werror=pointer-arith;-Werror=implicit-function-declaration)
|
function(add_if_flag_works flag)
|
||||||
CHECK_C_COMPILER_FLAG("${option}" COMPILER_HAS_THOSE_TOGGLES)
|
CHECK_C_COMPILER_FLAG("${flag}" COMPILER_HAS_THOSE_TOGGLES)
|
||||||
set(outcome "Failed")
|
set(outcome "Failed")
|
||||||
if(COMPILER_HAS_THOSE_TOGGLES)
|
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")
|
set(outcome "works")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "Testing if ${option} can be used -- ${outcome}")
|
message(STATUS "Testing if ${flag} can be used -- ${outcome}")
|
||||||
endforeach()
|
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)
|
add_subdirectory(src release)
|
||||||
|
|
||||||
|
@ -32,4 +48,3 @@ endif()
|
||||||
if (${BUILD_GAMES})
|
if (${BUILD_GAMES})
|
||||||
add_subdirectory(games)
|
add_subdirectory(games)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,11 @@ set(RAYLIB raylib) # Name of the generated library
|
||||||
|
|
||||||
### Config options ###
|
### Config options ###
|
||||||
# Shared library is always PIC. Static library should be PIC too if linked into a shared library
|
# 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?
|
# Build a static and/or shared raylib?
|
||||||
set(SHARED OFF CACHE BOOL "Build raylib as a dynamic library")
|
option(SHARED "Build raylib as a dynamic library" OFF)
|
||||||
set(STATIC ON CACHE BOOL "Build raylib as a static library")
|
option(STATIC "Build raylib as a static library" ON)
|
||||||
set(MACOS_FATLIB ON CACHE BOOL "Build fat library for both i386 and x86_64 on macOS")
|
option(MACOS_FATLIB "Build fat library for both i386 and x86_64 on macOS" ON)
|
||||||
|
|
||||||
if(NOT (STATIC OR SHARED))
|
if(NOT (STATIC OR SHARED))
|
||||||
message(FATAL_ERROR "Nothing to do if both -DSHARED=OFF and -DSTATIC=OFF...")
|
message(FATAL_ERROR "Nothing to do if both -DSHARED=OFF and -DSTATIC=OFF...")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue