summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAhmad Fatoum <[email protected]>2018-02-24 15:26:13 +0100
committerAhmad Fatoum <[email protected]>2018-02-24 15:37:38 +0100
commitc9043b5a872015bab4dc1b0606504341e9ce5b2b (patch)
tree26a5741019a2e505ea7fc337d41bca13403a2e60
parent6ffc8cb7990fb4ff40f205cb53bec797b10e48a2 (diff)
downloadraylib-c9043b5a872015bab4dc1b0606504341e9ce5b2b.tar.gz
raylib-c9043b5a872015bab4dc1b0606504341e9ce5b2b.zip
CMake: Add options to use -fsanitize={address,undefined}
To make bugs like #485, #486, #487 and #488 easier to find in future.
-rwxr-xr-xCMakeLists.txt31
-rw-r--r--src/CMakeLists.txt8
2 files changed, 27 insertions, 12 deletions
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...")