1430d01906
jar_xm.h does some shady pointer casts leading to unaligned accesses and breaking strict aliasing. x86 has special circuitry for doing unaligned accesses, but on other architectures, it may trap and require kernel fix-up or crash outright. With this patch, one obstacle in porting raylib to the GameBoy Advance has been removed. Go for it ;-) To avoid having to rewrite that `mempool' code, insert padding before structs and instruct the compiler (GCC, most importantly), to be gentle when optimizing. This fixes #490 (Unless we got ourselves 256-bit pointers, if so, hello future!)
53 lines
1.6 KiB
CMake
Executable File
53 lines
1.6 KiB
CMake
Executable File
cmake_minimum_required(VERSION 3.0)
|
|
|
|
# Config options
|
|
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")
|
|
set(CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
|
|
endif()
|
|
else()
|
|
set (CMAKE_C_STANDARD 99)
|
|
endif()
|
|
|
|
include(CheckCCompilerFlag)
|
|
function(add_if_flag_works flag)
|
|
CHECK_C_COMPILER_FLAG("${flag}" COMPILER_HAS_THOSE_TOGGLES)
|
|
set(outcome "Failed")
|
|
if(COMPILER_HAS_THOSE_TOGGLES)
|
|
foreach(var ${ARGN})
|
|
set(${var} "${flag} ${${var}}" PARENT_SCOPE)
|
|
endforeach()
|
|
set(outcome "works")
|
|
endif()
|
|
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)
|
|
# src/external/jar_xm.h does shady stuff
|
|
add_if_flag_works(-fno-strict-aliasing 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)
|
|
|
|
if (${BUILD_EXAMPLES})
|
|
add_subdirectory(examples)
|
|
endif()
|
|
|
|
if (${BUILD_GAMES})
|
|
add_subdirectory(games)
|
|
endif()
|