speed-dreams-code/cmake/options.cmake
Xavier Del Campo Romero 8af4015db8
Revamp Debian and NSIS packaging
The existing scripts for Debian and NSIS packaging were too complex and
dealt unnecessarily with lower level details that should be already
handled by CMake and CPack.

- Packaging-related scripts have been moved to the new cpack/ directory.
There, CPack variables common to all generators are defined in
cpack/common.cmake, and then generator-specific variables are defined
independently (e.g.: cpack/debian.cmake and cpack/nsis.cmake).

- Packaging is now optionally done at a second stage, by running
`cpack -G <generator>` on the build directory. This removes the
requirement to branch based on the system name, and instead all CPack
variables are assigned unconditionally.

- Since now only one version of the game is packaged, there is no need
to maintain the complex scripts in packaging/ and packaging/windows that
used to deal with all variants (e.g.: "wip-cars-and-tracks",
"hq-cars-and-tracks", etc.).

- The use of CPACK_NSIS_EXTRA_INSTALL_COMMANDS,
CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS and CPACK_NSIS_CREATE_ICONS_EXTRA
should not be required, let alone modifying the HKLM registry manually,
since CPack already provides everything required to set up the
installer, the uninstaller and shortcuts.

- $INSTDIR is not required, since NSIS would already prepend the
target installation directory.

- PROJECT_VERSION_METADATA is not a standard CMake variable.
CMAKE_PROJECT_VERSION_TWEAK is instead meant for this purpose. [1]

- OPTION_PACKAGING and OPTION_ALL_IN_ONE_PACKAGING were removed since
packaging will always be available, yet optional. Packagers must then
run CPack on a second stage, as described above.

- Outdated comments were removed to avoid confusion.

TODO:

- Add shortcut to track editor on NSIS.

- dmg packaging was not revamped because of lacking compatible
hardware, but still it has been moved to cpack/dmg.cmake.

- Windows portable packaging (OPTION_PORTABLE_PACKAGING) has been left
out since it required 7z and relied on several hacks to work.
Furthermore, portable versions of the game were already not released on
the latest release, either. [2]

[1]: https://cmake.org/cmake/help/latest/variable/CMAKE_PROJECT_VERSION_TWEAK.html
[2]: https://sourceforge.net/projects/speed-dreams/files/2.3.0/
2025-01-13 00:07:01 +01:00

259 lines
9.9 KiB
CMake

############################################################################
#
# file : options.cmake
# copyright : (C) 2008 by Mart Kelder, 2010 by J.-P. Meuret
# web : www.speed-dreams.org
#
############################################################################
############################################################################
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
############################################################################
# @file CMake configuration options
# @author Mart Kelder, J.-P. Meuret
INCLUDE(CMakeDependentOption)
MACRO(ADD_SD_COMPILE_OPTIONS)
# This has to be done more than once, because HAVE_CONFIG_H may change.
IF(HAVE_CONFIG_H)
ADD_DEFINITIONS(-DHAVE_CONFIG_H)
IF(IN_SOURCETREE)
SET(INCLUDE_CANDIDATE ${SOURCE_DIR})
ELSE(IN_SOURCETREE)
SET(INCLUDE_CANDIDATE "")
ENDIF(IN_SOURCETREE)
FIND_PATH(CONFIGH_INCLUDE_DIR config.h ${INCLUDE_CANDIDATE} /usr/include /usr/local/include NO_DEFAULT_PATH)
FIND_PATH(CONFIGH_INCLUDE_DIR config.h ${INCLUDE_CANDIDATE} /usr/include /usr/local/include)
MARK_AS_ADVANCED(CONFIGH_INCLUDE_DIR)
IF(CONFIGH_INCLUDE_DIR)
INCLUDE_DIRECTORIES(${CONFIGH_INCLUDE_DIR})
ELSE(CONFIGH_INCLUDE_DIR)
MESSAGE(FATAL_ERROR "Cannot find config.h header file")
ENDIF(CONFIGH_INCLUDE_DIR)
ENDIF(HAVE_CONFIG_H)
# Build options (do it only once).
IF(NOT _ALREADY_DONE)
# Default build configuration.
IF(NOT MSVC)
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
FORCE)
ENDIF()
MESSAGE(STATUS "Build configuration : ${CMAKE_BUILD_TYPE}")
ENDIF(NOT MSVC)
# CMake options.
SET(OPTION_CHECK_CONTENTS false CACHE BOOL "Set to off if you don't want the build to be stopped by missing optional contents folders")
MARK_AS_ADVANCED(OPTION_CHECK_CONTENTS)
SET(OPTION_OFFICIAL_ONLY false CACHE BOOL "Build / install only officially released contents")
SET(OPTION_FORCE_DEBUG false CACHE BOOL "Force debug symbols even in Release build (Automatic in Debug builds)")
SET(OPTION_TRACE true CACHE BOOL "Enable traces into the console or log file")
SET(OPTION_TRACE_LEVEL "5" CACHE STRING "Trace level integer threshold, only if OPTION_TRACE (traces with higher level are not logged ; 0=Fatal, 1=Error, 2=Warning, 3=Info, 4=Trace, 5=Debug, ...)")
SET(OPTION_PROFILER false CACHE BOOL "Enable profiler")
SET(OPTION_SCHEDULE_SPY false CACHE BOOL "Enable fine grained scheduling spy")
SET(OPTION_3RDPARTY_EXPAT true CACHE BOOL "Use 3rd party Expat library rather than bundled TXML")
SET(OPTION_3RDPARTY_SQLITE3 false CACHE BOOL "Use SQLite3 as database for record/replay")
SET(OPTION_OSGGRAPH true CACHE BOOL "Build OpenScenGraph-based WIP osggraph graphics module")
SET(OPTION_TINYGLTF false CACHE BOOL "Use tinygltf library")
SET(OPTION_WEBSERVER true CACHE BOOL "Build with WebServer functionality")
SET(OPTION_CLIENT_SERVER true CACHE BOOL "Build with Client/Server network architecture")
SET(OPTION_PARAM_OPTIMIZER false CACHE BOOL "Build with Parameter Optimizer for Robot development")
SET(OPTION_TRACKEDITOR true CACHE BOOL "Build the TrackEditor (Requires Java)")
IF(APPLE)
# Automatically set OPTION_USE_MACPORTS (at least until someone fixes the regular APPLE build)
MESSAGE(STATUS "Automatically set OPTION_USE_MACPORTS (at least until someone fixes the regular APPLE build)")
SET(OPTION_USE_MACPORTS true CACHE BOOL "Use the MacPorts dependencies")
ENDIF(APPLE)
# Enable building with 3rd party SOLID library under Windows, as we ship the binary package,
# but not under Linux, where FreeSolid seems not to be available by default on most distros.
IF(WIN32)
SET(_OPTION_3RDPARTY_SOLID true)
ELSE(WIN32)
SET(_OPTION_3RDPARTY_SOLID false)
ENDIF(WIN32)
SET(OPTION_3RDPARTY_SOLID ${_OPTION_3RDPARTY_SOLID} CACHE BOOL "Use 3rd party SOLID library rather than simu-bundled one")
IF(UNIX)
SET(OPTION_XRANDR true CACHE BOOL "XrandR")
SET(OPTION_GLEXTPROTOTYPES true CACHE BOOL "Enable prototypes in glext.h")
#SET(OPTION_UNLOAD_SSGGRAPH true CACHE BOOL "If false, never unload ssggraph module (useful on some Linuxes to avoid XOrg crashes)")
ENDIF(UNIX)
SET(OPTION_UNLOAD_SSGGRAPH true CACHE BOOL "If false, never unload ssggraph module (useful on some Linuxes to avoid XOrg crashes)")
IF(OPTION_USE_MACPORTS)
SET(CMAKE_MACOSX_RPATH TRUE)
#SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_PREFIX_PATH "/opt/local" CACHE PATH "Prepended to search path")
#SET(CMAKE_FIND_ROOT_PATH "/opt/local" CACHE PATH "Prepended to search path")
SET(CMAKE_FIND_FRAMEWORK LAST)
MESSAGE(STATUS "Remove the line below to true when OSG works on MacPorts")
SET(OPTION_OSGGRAPH false CACHE BOOL "Build OpenScenGraph-based WIP osggraph graphics module")
ENDIF(OPTION_USE_MACPORTS)
# Custom 3rdParty location for some Windows builds (standard CMake Find<package> macros
# can't find it, so we needed another solution : see FindCustom3rdParty.cmake).
IF(MSVC)
SET(_OPTION_CUSTOM_3RDPARTY true) # Always needed for MSVC compilers.
ELSEIF(MINGW)
IF(CMAKE_GENERATOR STREQUAL "MSYS Makefiles")
# Not needed with "MSYS Makefiles" generator when using MinGW
# (3rd party libs assumed to be installed in standard location /usr/local).
SET(_OPTION_CUSTOM_3RDPARTY false)
ELSE(CMAKE_GENERATOR STREQUAL "MSYS Makefiles")
# Just as for MSVC builds : special location.
SET(_OPTION_CUSTOM_3RDPARTY true)
ENDIF(CMAKE_GENERATOR STREQUAL "MSYS Makefiles")
ENDIF(MSVC)
SET(OPTION_CUSTOM_3RDPARTY ${_OPTION_CUSTOM_3RDPARTY} CACHE BOOL "Set to ON to use 3rdParty prebuilt API located in <PROJECT_SOURCE_DIR>/../3rdparty")
MARK_AS_ADVANCED(OPTION_CUSTOM_3RDPARTY)
# Compiler definitions (needs more comments. Is it needed under Windows ?).
ADD_DEFINITIONS(-D_DEFAULT_SOURCE -DSHM)
IF(MSVC)
# Inhibit definition of Macros min(a,b) and max(a,b) for Windows MSVC builds,
# as the names conflict with the template functions from standard template library
ADD_DEFINITIONS(-DNOMINMAX)
ENDIF(MSVC)
IF(OPTION_FORCE_DEBUG)
ADD_DEFINITIONS(-DSD_DEBUG)
ENDIF(OPTION_FORCE_DEBUG)
IF(OPTION_TRACE)
ADD_DEFINITIONS(-DTRACE_OUT)
ENDIF(OPTION_TRACE)
IF(OPTION_TRACE_LEVEL)
ADD_DEFINITIONS(-DTRACE_LEVEL=${OPTION_TRACE_LEVEL})
ENDIF(OPTION_TRACE_LEVEL)
IF(OPTION_XRANDR)
ADD_DEFINITIONS(-DUSE_RANDR_EXT)
ENDIF(OPTION_XRANDR)
IF(OPTION_PROFILER)
ADD_DEFINITIONS(-DPROFILER)
ENDIF(OPTION_PROFILER)
IF(OPTION_SCHEDULE_SPY)
ADD_DEFINITIONS(-DSCHEDULE_SPY)
ENDIF(OPTION_SCHEDULE_SPY)
IF(OPTION_3RDPARTY_EXPAT)
ADD_DEFINITIONS(-DTHIRD_PARTY_EXPAT)
ENDIF(OPTION_3RDPARTY_EXPAT)
IF(OPTION_3RDPARTY_SQLITE3)
ADD_DEFINITIONS(-DTHIRD_PARTY_SQLITE3)
ENDIF(OPTION_3RDPARTY_SQLITE3)
IF(OPTION_3RDPARTY_SOLID)
ADD_DEFINITIONS(-DTHIRD_PARTY_SOLID)
ENDIF(OPTION_3RDPARTY_SOLID)
IF(OPTION_GLEXTPROTOTYPES)
ADD_DEFINITIONS(-DGL_GLEXT_PROTOTYPES)
ENDIF(OPTION_GLEXTPROTOTYPES)
IF(OPTION_UNLOAD_SSGGRAPH)
ADD_DEFINITIONS(-DUNLOAD_SSGGRAPH)
ENDIF(OPTION_UNLOAD_SSGGRAPH)
IF(OPTION_TINYGLTF)
ADD_DEFINITIONS(-DTINYGLTF)
ENDIF(OPTION_TINYGLTF)
IF(OPTION_WEBSERVER)
ADD_DEFINITIONS(-DWEBSERVER)
ENDIF(OPTION_WEBSERVER)
IF(OPTION_CLIENT_SERVER)
ADD_DEFINITIONS(-DCLIENT_SERVER)
ENDIF(OPTION_CLIENT_SERVER)
IF(OPTION_USE_MACPORTS)
ADD_DEFINITIONS(-DUSE_MACPORTS)
ENDIF(OPTION_USE_MACPORTS)
# Define for code that needs Torcs backward compatibility
ADD_DEFINITIONS(-DSPEED_DREAMS)
ENDIF(NOT _ALREADY_DONE)
# Compile options
IF(NOT _ALREADY_DONE)
# GCC warnings (at least for the 4.x series, there are none by default).
IF(CMAKE_COMPILER_IS_GNUCXX)
# Add useful warnings / checks.
SET(_SD_WOPTS "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_SD_WOPTS}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_SD_WOPTS}")
# MSVC warnings (default warning level 3 is not exactly what we want).
ELSEIF(MSVC)
# Suppress bothering MSVC warnings and add useful warnings / checks.
SET(_SD_WOPTS "/W4") # Better warning level (default seems to be 3).
# Level 3 useless/boring warnings.
SET(_SD_WOPTS "${_SD_WOPTS} /wd4251") # class XXX needs a DLL interface
SET(_SD_WOPTS "${_SD_WOPTS} /wd4996") # std::_Copy_opt disaproved because unsafe
# Level 4 useless/boring warnings.
SET(_SD_WOPTS "${_SD_WOPTS} /wd4100") # unreferenced formal parameter
SET(_SD_WOPTS "${_SD_WOPTS} /wd4127") # conditional expression is constant
SET(_SD_WOPTS "${_SD_WOPTS} /wd4201") # nonstandard extension used : nameless struct/union
SET(_SD_WOPTS "${_SD_WOPTS} /wd4706") # assignment within conditional expression
# Other useless warnings.
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE
-D_CRT_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS)
# That's all.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_SD_WOPTS}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_SD_WOPTS}")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
ENDIF(NOT _ALREADY_DONE)
ENDMACRO(ADD_SD_COMPILE_OPTIONS)