mirror of
https://github.com/Heretek-AI/GDevelop.git
synced 2026-08-24 22:31:30 -04:00
12867be225
And add GDCore tests with ASan/UBSan as a new CI job to catch any regression in the future
123 lines
4.3 KiB
CMake
123 lines
4.3 KiB
CMake
# This is the CMake file used to build GDevelop.
|
|
# For more information, see the README.md file.
|
|
|
|
cmake_minimum_required(VERSION 3.5)
|
|
|
|
# Add utility functions
|
|
include(scripts/CMakeClangUtils.txt) # To add clang-format and clang-tidy support to a target
|
|
|
|
# Macro for defining an option
|
|
macro(gd_set_option var default type docstring)
|
|
if(NOT DEFINED ${var})
|
|
set(${var} ${default})
|
|
endif()
|
|
set(${var} ${${var}} CACHE ${type} ${docstring} FORCE)
|
|
endmacro()
|
|
|
|
# Set options
|
|
gd_set_option(BUILD_CORE TRUE BOOL "TRUE to build GDevelop Core library")
|
|
gd_set_option(BUILD_GDJS TRUE BOOL "TRUE to build GDevelop JS Platform")
|
|
gd_set_option(BUILD_EXTENSIONS TRUE BOOL "TRUE to build the extensions")
|
|
gd_set_option(BUILD_TESTS TRUE BOOL "TRUE to build the tests")
|
|
gd_set_option(USE_SANITIZERS "" STRING "Comma-separated sanitizers to enable for native builds (e.g. \"address,undefined\"). Empty to disable. Ignored when building with Emscripten.")
|
|
|
|
# Disable deprecated code
|
|
set(NO_GUI TRUE CACHE BOOL "" FORCE) # Force disable old GUI related code.
|
|
|
|
# Setting up installation directory, for Linux (has to be done before "project" command).
|
|
if(NOT WIN32)
|
|
if(NOT APPLE)
|
|
gd_set_option(GD_INSTALL_PREFIX "/opt/gdevelop/" STRING "The directory where GDevelop should be installed")
|
|
else()
|
|
gd_set_option(GD_INSTALL_PREFIX "." STRING "The directory where GDevelop should be installed")
|
|
endif()
|
|
|
|
# As we embed SFML, prevent it to be installed system-wide
|
|
set(CMAKE_INSTALL_PREFIX "${GD_INSTALL_PREFIX}/useless")
|
|
endif()
|
|
|
|
project(GDevelop)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
if(NOT WIN32 AND NOT APPLE AND NOT BUILD_TESTS)
|
|
set(CMAKE_SKIP_BUILD_RPATH TRUE) # Avoid errors when packaging for linux.
|
|
endif()
|
|
if(APPLE)
|
|
set(CMAKE_MACOSX_RPATH 1)
|
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
|
|
set(CMAKE_INSTALL_RPATH ".")
|
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
|
add_compile_options(
|
|
-D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_
|
|
-Wno-potentially-evaluated-expression)
|
|
endif()
|
|
# Sanity checks
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
|
message(STATUS "CMAKE_BUILD_TYPE is empty, assuming build type is Release")
|
|
set(CMAKE_BUILD_TYPE Release)
|
|
endif()
|
|
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-s") # Force stripping to avoid errors when packaging for linux.
|
|
endif()
|
|
|
|
#Activate C++11
|
|
set(CMAKE_CXX_STANDARD 11) # Upgrading to C++17 should be tried.
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# Mark some warnings as errors
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
# Activate as much warnings as possible to avoid errors like
|
|
# uninitialized variables or other hard to debug bugs.
|
|
add_compile_options(
|
|
-Wall
|
|
-Wextra
|
|
-Wuninitialized
|
|
-Wconditional-uninitialized
|
|
-Wno-unknown-warning-option
|
|
-Wno-reorder-ctor
|
|
-Wno-reorder
|
|
-Wno-unused-parameter
|
|
-Wno-pessimizing-move
|
|
-Wno-unused-variable # Not a good style, but not a risk
|
|
-Wno-unused-private-field
|
|
-Wno-ignored-qualifiers # Not a risk
|
|
-Wno-sign-compare # Not a big risk
|
|
|
|
# Make as much warnings considered as errors as possible (only one for now).
|
|
-Werror=return-stack-address
|
|
-Werror=return-type)
|
|
endif()
|
|
|
|
# Sanitizers (ASan/UBSan) for native builds. Use e.g.:
|
|
# cmake -DUSE_SANITIZERS="address,undefined" -DCMAKE_BUILD_TYPE=Debug ..
|
|
# Then run with:
|
|
# ASAN_OPTIONS=detect_leaks=0:abort_on_error=1 ./GDCore_tests
|
|
# Some checks (use-after-scope) need at least -O1; the Debug build type's -O0
|
|
# still catches use-after-free, heap-buffer-overflow and the UBSan checks.
|
|
if(USE_SANITIZERS AND NOT EMSCRIPTEN)
|
|
message(STATUS "Enabling sanitizers: ${USE_SANITIZERS}")
|
|
add_compile_options(-fsanitize=${USE_SANITIZERS} -fno-omit-frame-pointer -fno-sanitize-recover=all)
|
|
# add_link_options requires CMake >= 3.13; append to linker flag vars for wider compatibility.
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${USE_SANITIZERS}")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=${USE_SANITIZERS}")
|
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fsanitize=${USE_SANITIZERS}")
|
|
endif()
|
|
|
|
# Define common directories:
|
|
set(GD_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
|
|
|
|
# Add all the CMakeLists:
|
|
add_subdirectory(ExtLibs)
|
|
if(BUILD_CORE)
|
|
add_subdirectory(Core)
|
|
endif()
|
|
if(BUILD_GDJS)
|
|
add_subdirectory(GDJS)
|
|
endif()
|
|
if(EMSCRIPTEN)
|
|
add_subdirectory(GDevelop.js)
|
|
endif()
|
|
if(BUILD_EXTENSIONS)
|
|
add_subdirectory(Extensions)
|
|
endif()
|