From aa0a0d6ab428f80d029c947a5b13f48d4b89163b Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 1 May 2020 19:23:00 +0200 Subject: [PATCH] CMake: better handling of per-config options, esp. in single-config --- CMakeLists.txt | 1 + cmake/macros/PerConfigOption.cmake | 50 ++++++++++++ dtool/Config.cmake | 120 ++++++++++++++--------------- dtool/LocalSetup.cmake | 11 ++- 4 files changed, 115 insertions(+), 67 deletions(-) create mode 100644 cmake/macros/PerConfigOption.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a31aea48cc..9870660adc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,7 @@ include(GNUInstallDirs) # Defines CMAKE_INSTALL_ variables # Include global modules needed for configure scripts include(PackageConfig) # Defines package_option +include(PerConfigOption) # Defines per_config_option # Configure Panda3D include(dtool/CompilerFlags.cmake) diff --git a/cmake/macros/PerConfigOption.cmake b/cmake/macros/PerConfigOption.cmake new file mode 100644 index 0000000000..44be908384 --- /dev/null +++ b/cmake/macros/PerConfigOption.cmake @@ -0,0 +1,50 @@ +# Filename: PerConfigOption.cmake +# +# This contains a convenience function for defining per-config options. +# In single-config generators, it will set the option based on the defined +# CMAKE_BUILD_TYPE. In multi-config generators, it will create separate +# options, one per config. +# +# Function: per_config_option +# Usage: +# option(name "help string" [Config1] [Config2] [...ConfigN]) +# +# Example: +# per_config_option(DO_DEBUGGING "Enables debugging." Debug Standard) + +set(_PER_CONFIG_OPTIONS CACHE INTERNAL "Internal variable") + +function(per_config_option name help) + set(_configs ${ARGN}) + + # In single-config generatotrs, we simply create one config. + if(NOT IS_MULTICONFIG) + list(FIND _configs "${CMAKE_BUILD_TYPE}" _index) + if(${_index} GREATER -1) + option("${name}" "${help}" ON) + else() + option("${name}" "${help}" OFF) + endif() + + elseif(DEFINED "${name}") + # It's been explicitly defined, so that makes it not a multi-configuration + # variable anymore. + option("${name}" "${help}") + return() + + else() + foreach(_config ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER "${_config}" _config_upper) + list(FIND _configs "${_config}" _index) + if(${_index} GREATER -1) + option("${name}_${_config_upper}" "${help}" ON) + else() + option("${name}_${_config_upper}" "${help}" OFF) + endif() + endforeach() + + endif() + + list(APPEND _PER_CONFIG_OPTIONS "${name}") + set(_PER_CONFIG_OPTIONS "${_PER_CONFIG_OPTIONS}" CACHE INTERNAL "Internal variable") +endfunction(per_config_option) diff --git a/dtool/Config.cmake b/dtool/Config.cmake index 1835ba6fd5..95c8b844d4 100644 --- a/dtool/Config.cmake +++ b/dtool/Config.cmake @@ -33,8 +33,6 @@ if(IS_MULTICONFIG) set(CMAKE_CONFIGURATION_TYPES ${_configs}) endif() -set(PER_CONFIG_OPTIONS) - # Are we building with static or dynamic linking? option(BUILD_SHARED_LIBS "Causes subpackages to be built separately -- setup for dynamic linking. @@ -145,7 +143,7 @@ identified by PRC_ENCRYPTED_PATTERNS.") # that case, config will execute the file if it appears to be # executable; otherwise, it will simply read it. -set(PRC_EXECUTABLE_PATTERNS "" CACHE STRING +set(PRC_EXECUTABLE_PATTERNS "" CACHE STRING "The filename(s) to search for, and execute, in the above paths. Normally this is empty.") @@ -204,10 +202,9 @@ set(PRC_INC_TRUST_LEVEL "0" CACHE STRING # Similarly, the descriptions are normally saved only in a # development build, not in a release build. Set this value true to # explicitly save them anyway. -#XXX only for release-release builds -option(PRC_SAVE_DESCRIPTIONS +per_config_option(PRC_SAVE_DESCRIPTIONS "Define if you want to save the descriptions for ConfigVariables." - ON) + Debug Standard) mark_as_advanced(DEFAULT_PRC_DIR PRC_DIR_ENVVARS PRC_PATH_ENVVARS PRC_PATTERNS PRC_ENCRYPTED_PATTERNS PRC_ENCRYPTION_KEY @@ -254,49 +251,46 @@ debugging information." OFF) mark_as_advanced(INTERROGATE_OPTIONS) # -# The following options have to do with the memory allocation system -# that will be used by Panda3D. +# The following options have to do with optional debugging features. # -option(DO_MEMORY_USAGE +per_config_option(DO_MEMORY_USAGE "Do you want to compile in support for tracking memory usage? This enables you to define the variable 'track-memory-usage' at runtime to help track memory leaks, and also report total memory usage on PStats. There is some small overhead for having this ability -available, even if it is unused." OFF) -list(APPEND PER_CONFIG_OPTIONS DO_MEMORY_USAGE) -set(DO_MEMORY_USAGE_Debug ON CACHE BOOL "") +available, even if it is unused." Debug Standard) -option(SIMULATE_NETWORK_DELAY +per_config_option(DO_COLLISION_RECORDING + "Do you want to enable debugging features for the collision system?" + Debug Standard) + +per_config_option(DO_PSTATS + "Enable support for performance profiling using PStats?" + Debug Standard) + +per_config_option(DO_DCAST + "Add safe typecast checking? This adds significant overhead." + Debug Standard) + +per_config_option(SIMULATE_NETWORK_DELAY "This option compiles in support for simulating network delay via the min-lag and max-lag prc variables. It adds a tiny bit of overhead even when it is not activated, so it is typically enabled -only in a development build." OFF) -list(APPEND PER_CONFIG_OPTIONS SIMULATE_NETWORK_DELAY) -set(SIMULATE_NETWORK_DELAY_Debug ON CACHE BOOL "") +only in a development build." + Debug) -option(SUPPORT_IMMEDIATE_MODE - "This option compiles in support for immediate-mode OpenGL -rendering. Since this is normally useful only for researching -buggy drivers, and since there is a tiny bit of per-primitive -overhead to have this option available even if it is unused, it is -by default enabled only in a development build. This has no effect -on DirectX rendering." OFF) -list(APPEND PER_CONFIG_OPTIONS SUPPORT_IMMEDIATE_MODE) -set(SUPPORT_IMMEDIATE_MODE_Debug ON CACHE BOOL "") - -option(NOTIFY_DEBUG +per_config_option(NOTIFY_DEBUG "Do you want to include the 'debug' and 'spam' Notify messages? Normally, these are stripped out when we build for release, but sometimes it's -useful to keep them around. Turn this setting on to achieve that." OFF) -list(APPEND PER_CONFIG_OPTIONS NOTIFY_DEBUG) -set(NOTIFY_DEBUG_Debug ON CACHE BOOL "") -set(NOTIFY_DEBUG_Standard ON CACHE BOOL "") +useful to keep them around. Turn this setting on to achieve that." + Debug Standard) -option(SUPPORT_FIXED_FUNCTION - "This option compiles in support for the fixed-function OpenGL -pipeline. It is only really useful to turn this off if you are targeting -an OpenGL ES 2 system." ON) +mark_as_advanced(SIMULATE_NETWORK_DELAY DO_MEMORY_USAGE DO_DCAST) + +# +# The following options have to do with the memory allocation system. +# option(USE_MEMORY_DLMALLOC "This is an optional alternative memory-allocation scheme @@ -324,8 +318,7 @@ calls to malloc() and free() for frequently-created and -deleted objects. There's usually no reason to set this false, unless you suspect a bug in Panda's memory management code." ON) -mark_as_advanced(DO_MEMORY_USAGE SIMULATE_NETWORK_DELAY - SUPPORT_IMMEDIATE_MODE USE_MEMORY_DLMALLOC USE_MEMORY_PTMALLOC2 +mark_as_advanced(USE_MEMORY_DLMALLOC USE_MEMORY_PTMALLOC2 MEMORY_HOOK_DO_ALIGN USE_DELETED_CHAIN) @@ -379,11 +372,11 @@ mark_as_advanced(ANDROID_NDK_HOME ANDROID_ABI ANDROID_STL # By default, we'll assume the user only wants to run with Debug # python if he has to--that is, on Windows when building a debug build. -set(USE_DEBUG_PYTHON OFF) if(WIN32) - set(USE_DEBUG_PYTHON_Debug ON) + per_config_option(USE_DEBUG_PYTHON "" Debug) +else() + option(USE_DEBUG_PYTHON "" OFF) endif() -list(APPEND PER_CONFIG_OPTIONS USE_DEBUG_PYTHON) cmake_dependent_option(HAVE_VIDEO4LINUX "Set this to enable webcam support on Linux." ON @@ -405,15 +398,27 @@ version and below, which may reduce runtime portability to other systems, but it will avoid issues with getting extension function pointers.") +option(SUPPORT_FIXED_FUNCTION + "This option compiles in support for the fixed-function OpenGL pipeline. +It is only really useful to turn this off to save space if you are building +an application that only needs to use an OpenGL 3.2+ context and only uses +custom GLSL shaders." ON) + +option(SUPPORT_IMMEDIATE_MODE + "This option compiles in support for immediate-mode OpenGL +rendering. Since this is normally useful only for researching +buggy drivers, and since there is a tiny bit of per-primitive +overhead to have this option available even if it is unused, it is +by default enabled only in a development build. This has no effect +on DirectX rendering." OFF) + +mark_as_advanced(SUPPORT_FIXED_FUNCTION) # Should build tinydisplay? #option(HAVE_TINYDISPLAY # "Builds TinyDisplay, a light software renderer based on TinyGL, #that is built into Panda. TinyDisplay is not as full-featured as Mesa #but is many times faster." ON) -#option(HAVE_TINYDISPLAY_MinSizeRel "" OFF) -#list(APPEND PER_CONFIG_OPTIONS HAVE_TINYDISPLAY) - # Is SDL installed, and where? set(Threads_FIND_QUIETLY TRUE) # Fix for builtin FindSDL @@ -477,9 +482,6 @@ build (such as, for instance, for the iPhone)." ON) option(HAVE_AUDIO "Do you want to build the audio interface?" ON) -option(DO_PSTATS - "Enable the pstats client?" ON) - option(USE_PANDAFILESTREAM "Enable the PandaFileStream implementation of pfstream etc.?" ON) @@ -492,16 +494,12 @@ option(HAVE_IMG "Enable support for loading IMG images." ON) option(HAVE_SOFTIMAGE_PIC "Enable support for loading SOFTIMAGE PIC images." ON) option(HAVE_BMP "Enable support for loading BMP images." ON) option(HAVE_PNM "Enable support for loading PNM images." ON) - -foreach(adv_image_format - HAVE_SGI_RGB HAVE_TGA HAVE_IMG HAVE_SOFTIMAGE_PIC HAVE_BMP HAVE_PNM) - - option(${adv_image_format}_MinSizeRel "" OFF) - list(APPEND PER_CONFIG_OPTIONS ${adv_image_format}) - - mark_as_advanced(${adv_image_format} ${adv_image_format}_MinSizeRel) - -endforeach(adv_image_format) +option(HAVE_SGI_RGB "" ON) +option(HAVE_TGA "" ON) +option(HAVE_IMG "" ON) +option(HAVE_SOFTIMAGE_PIC "" ON) +option(HAVE_BMP "" ON) +option(HAVE_PNM "" ON) # How to invoke bison and flex. Panda takes advantage of some # bison/flex features, and therefore specifically requires bison and @@ -539,9 +537,9 @@ slightly slow down Panda for the single CPU case." IMPORTED_AS Threads::Threads) # Configure debug threads -option(DEBUG_THREADS "If on, enables debugging of thread and sync operations (i.e. mutexes, deadlocks)" OFF) -list(APPEND PER_CONFIG_OPTIONS DEBUG_THREADS) -set(DEBUG_THREADS_Debug ON CACHE BOOL "") +option(DEBUG_THREADS + "If on, enables debugging of thread and sync operations (i.e. mutexes, +deadlocks). Very slow, disabled by default." OFF) option(SIMPLE_THREADS "If on, compile with simulated threads. Threads, by default, use @@ -551,7 +549,6 @@ On the other hand, compiling in this full OS-provided support can impose some substantial runtime overhead, making the application run slower on a single-CPU machine. This settings avoid the overhead, but still gain some of the basic functionality of threads." OFF) -list(APPEND PER_CONFIG_OPTIONS SIMPLE_THREADS) option(OS_SIMPLE_THREADS "If on, OS threading constructs will be used to perform context switches. @@ -560,7 +557,6 @@ normal SIMPLE_THREADS optimizations still apply, and the normal SIMPLE_THREADS scheduler is used to switch between threads (instead of the OS scheduler). This may be more portable and more reliable, but it is a hybrid between user-space threads and os-provided threads." ON) -list(APPEND PER_CONFIG_OPTIONS OS_SIMPLE_THREADS) ### Configure pipelining ### option(DO_PIPELINING "If on, compile with pipelined rendering." ON) @@ -570,8 +566,6 @@ option(COMPILE_IN_DEFAULT_FONT "If on, compiles in a default font, so that every TextNode will always have a font available without requiring the user to specify one. When turned off, the generated library will save a few kilobytes." ON) -list(APPEND PER_CONFIG_OPTIONS COMPILE_IN_DEFAULT_FONT) -set(COMPILE_IN_DEFAULT_FONT_MinSizeRel OFF CACHE BOOL "") option(STDFLOAT_DOUBLE "Define this true to compile a special version of Panda to use a diff --git a/dtool/LocalSetup.cmake b/dtool/LocalSetup.cmake index eed31b0e84..627fe4c3c9 100644 --- a/dtool/LocalSetup.cmake +++ b/dtool/LocalSetup.cmake @@ -186,11 +186,14 @@ message("") # Generate dtool_config.h if(IS_MULTICONFIG) foreach(config ${CMAKE_CONFIGURATION_TYPES}) - foreach(option ${PER_CONFIG_OPTIONS}) + string(TOUPPER "${config}" config_upper) + foreach(option ${_PER_CONFIG_OPTIONS}) # Check for the presence of a config-specific option, and override what's # in the cache if there is. - if(DEFINED ${option}_${config}) - set(${option} ${${option}_${config}}) + if(DEFINED "${option}_${config_upper}") + set(${option} ${${option}_${config_upper}}) + else() + message(FATAL_ERROR "${option}_${config_upper} is not defined") endif() endforeach(option) @@ -199,7 +202,7 @@ if(IS_MULTICONFIG) # unset() does not unset CACHE variables by default, just normal variables. # By doing this we're reverting back to what was in the cache. - foreach(option ${PER_CONFIG_OPTIONS}) + foreach(option ${_PER_CONFIG_OPTIONS}) unset(${option}) endforeach(option) endforeach(config)