cmake: config: Move new package macros to cmake/macros, use new package macros in Package.cmake, begin removing redundant package/config options from Package.cmake (theses are being moved to Config.cmake).

This commit is contained in:
kestred 2013-12-21 19:30:53 -07:00
parent 693159b1c7
commit 8cdc819344
6 changed files with 128 additions and 276 deletions

View File

@ -12,7 +12,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/macros/")
include(AutoInclude) # Implements automatic include_directories finding
include(AddBisonTarget) # Defines add_bison_target function
include(CompositeSources) # Defines composite_sources function
include(ConfigPackage) # Defines config_package function
include(PackageConfig) # Defines package_option AND target_use_packages
include(Interrogate) # Defines target_interrogate AND add_python_module
# Add the include path for source and header files generated by CMake
@ -21,7 +21,6 @@ include_directories("${CMAKE_BINARY_DIR}")
# Configure Panda3D
include(dtool/PandaVersion.cmake)
include(dtool/Package.cmake)
include(dtool/PackageMacros.cmake)
include(dtool/Config.cmake)
# Determine which trees to build.

View File

@ -1,81 +0,0 @@
# Filename: ConfigPackage.cmake
# Author: kestred (30 Nov, 2013)
#
# This modules defines a function which finds and configures libraries
# and packages for Panda3Ds configuration file headers (.h files).
#
# Assumes the file has already been found with find_package().
#
# Usage:
# config_package(package_name)
#
# The following variables can be set to override the cached values of USE_XYZZY
# CONFIG_DISABLE_EVERYTHING - always set USE_XYZZY to false
# CONFIG_DISABLE_MISSING - set USE_XYZZY to false if it was not found
# CONFIG_ENABLE_FOUND - set USE_XYZZY to true if the package was found
# CONFIG_ENABLE_EVERYTHING - always set USE_XYZZY to true (even if the package is missing)
#
# Usage:
# config_package(PACKAGE_NAME [<display-name>])
function(config_package PKG_NAME)
# Get package display name
foreach(arg ${ARGN})
set(DISPLAY_NAME "${DISPLAY_NAME}${arg}")
endforeach()
# Set function vars to defaults
if(NOT DISPLAY_NAME)
set(DISPLAY_NAME ${PKG_NAME})
endif()
if(${PKG_NAME}_FOUND)
# Output success after finding the package for the first time
if(NOT DEFINED USE_${PKG_NAME} AND NOT CONFIG_DISABLE_EVERYTHING)
message(STATUS "+ ${DISPLAY_NAME}")
endif()
### Add a USE_XYZZY config variable to the cache ###
if(CONFIG_ENABLE_EVERYTHING OR CONFIG_DISABLE_EVERYTHING OR CONFIG_ENABLE_FOUND)
unset(USE_${PKG_NAME} CACHE)
endif()
if(CONFIG_DISABLE_EVERYTHING)
option(USE_${PKG_NAME} "If on, compile Panda3D with ${DISPLAY_NAME}" OFF)
else()
option(USE_${PKG_NAME} "If on, compile Panda3D with ${DISPLAY_NAME}" ON)
endif()
# Update HAVE_XYZZY
if(USE_${PKG_NAME})
set(HAVE_${PKG_NAME} TRUE PARENT_SCOPE)
endif()
elseif(DEFINED USE_${PKG_NAME})
# If we were compiling with a particular package, but we can't find it;
# then inform the user the package was lost.
if(USE_${PKG_NAME})
message(STATUS "- Can no longer find ${DISPLAY_NAME}")
# Only unset if USE_XYZZY is true;
# This allows us to set USE_XYZZY to false to silence the output
unset(USE_${PKG_NAME} CACHE)
# If using Discovery, we want to silently disable missing packages
if(CONFIG_DISABLE_MISSING)
option(USE_${PKG_NAME} "If on, compile Panda3D with ${DISPLAY_NAME}" OFF)
endif()
endif()
else()
# If using DISCOVERED <OR> NOTHING, we want to silently disable missing packages
if(CONFIG_DISABLE_MISSING OR CONFIG_DISABLE_EVERYTHING)
option(USE_${PKG_NAME} "If on, compile Panda3D with ${DISPLAY_NAME}" OFF)
else()
# Otherwise, output failure to find package
message(STATUS "- Did not find ${DISPLAY_NAME}")
endif()
endif()
endfunction()

View File

@ -0,0 +1,98 @@
# Filename: PackageConfig.cmake
#
# This modules defines functions which find and configures libraries
# and packages for Panda3Ds configuration file headers (.h files).
#
# Assumes the file has already been found with find_package().
#
# Function: package_option
# Usage:
# package_option(package_name DOCSTRING [DEFAULT ON | OFF])
# Examples:
# add_library(mylib ${SOURCES})
#
# If no default is given, the default is whether the package was found.
#
#
# Function: target_use_packages
# Usage:
# target_use_packages(target [PACKAGES ...])
# Examples:
# target_use_packages(mylib PYTHON PNG)
#
#
# package_option
#
function(package_option name)
# Parse the arguments.
set(command)
set(default)
set(cache_string)
foreach(arg ${ARGN})
if(command STREQUAL "DEFAULT")
set(default "${arg}")
set(command)
elseif(arg STREQUAL "DEFAULT")
set(command "DEFAULT")
else()
# Yes, a list, because semicolons can be in there, and
# that gets split up into multiple args, so we have to
# join it back together here.
list(APPEND cache_string "${arg}")
endif()
endforeach()
if(command STREQUAL "DEFAULT")
message(SEND_ERROR "DEFAULT in package_option takes an argument")
endif()
# If the default is not set, we set it.
if(NOT DEFINED default)
set(default "${${name}_FOUND}")
endif()
# If it was set by the user but not found, display an error.
if(HAVE_${name} AND NOT ${name}_FOUND)
message(SEND_ERROR "NOT FOUND: ${name}. Disable HAVE_${name} to continue.")
endif()
# Prevent the function from being called twice.
# This would indicate a cmake error.
if(PANDA_DID_SET_OPTION_${name})
message(SEND_ERROR "package_option(${name}) was called twice.
This is a bug in the cmake build scripts.")
else()
set(PANDA_DID_SET_OPTION_${name} TRUE PARENT_SCOPE)
endif()
# Create the option.
option("HAVE_${name}" "${cache_string}" "${default}")
endfunction()
#
# target_use_packages
#
# Useful macro that picks up a package located using find_package
# as dependencies of a target that is going to be built.
#
macro(target_use_packages target)
set(libs ${ARGV})
list(REMOVE_AT libs 0)
foreach(lib ${libs})
if(HAVE_${lib})
target_include_directories("${target}" PUBLIC "${${lib}_INCLUDE_DIRS};${${lib}_INCLUDE_DIR}")
if(${lib}_LIBRARIES)
target_link_libraries("${target}" ${${lib}_LIBRARIES})
else()
target_link_libraries("${target}" ${${lib}_LIBRARY})
endif()
endif()
endforeach(lib)
endmacro(target_use_packages)

View File

@ -422,7 +422,7 @@ avoid building this, unless you really want to make a low-footprint
build (such as, for instance, for the iPhone)." ON)
# Is OpenSSL installed, and where?
find_package(OpenSSL)
find_package(OpenSSL COMPONENTS ssl crypto)
package_option(OPENSSL DEFAULT ON
"Enable OpenSSL support")

View File

@ -1,142 +1,52 @@
message(STATUS "")
message(STATUS "Configuring support for the following optional third-party packages:")
# Settings to change USE_PACKAGE behavior (these options override cached values)
set(CONFIG_ENABLE_EVERYTHING Off)
set(CONFIG_DISABLE_EVERYTHING Off)
set(CONFIG_ENABLE_FOUND Off)
set(CONFIG_DISABLE_MISSING Off)
# Update USE_PACKAGE settings based on CLI arguments
if(EVERYTHING)
message("Re-enabling all disabled third-party libraries.")
set(CONFIG_ENABLE_EVERYTHING On)
elseif(DISCOVERED)
message("Enabling found and disabling not-found third-party libraries.")
set(CONFIG_ENABLE_FOUND On)
set(CONFIG_DISABLE_MISSING On)
elseif(NOTHING)
message("Disabling all third-party libraries.")
set(CONFIG_DISABLE_EVERYTHING On)
endif()
# Find and configure Eigen library
find_package(Eigen3 QUIET)
config_package(EIGEN "Eigen")
if(HAVE_EIGEN)
if(WIN32)
set(EIGEN_CFLAGS "/arch:SSE2")
else()
set(EIGEN_CFLAGS "-msse2")
endif()
if(CONFIG_ENABLE_EVERYTHING OR CONFIG_ENABLE_FOUND)
unset(BUILD_EIGEN_VECTORIZATION)
elseif(CONFIG_DISABLE_EVERYTHING)
option(BUILD_EIGEN_VECTORIZATION "If on, vectorization is enabled in build." OFF)
endif()
if(NOT DEFINED BUILD_EIGEN_VECTORIZATION)
message(STATUS "+ (vectorization enabled in build)")
endif()
option(BUILD_EIGEN_VECTORIZATION "If on, vectorization is enabled in build." ON)
if(BUILD_EIGEN_VECTORIZATION)
set(LINMATH_ALIGN TRUE)
endif()
else()
unset(BUILD_EIGEN_VECTORIZATION CACHE)
endif()
# Find and configure OpenSSL library
find_package(OpenSSL QUIET COMPONENTS ssl crypto)
config_package(OPENSSL "OpenSSL")
if(HAVE_OPENSSL)
if(CONFIG_ENABLE_EVERYTHING OR CONFIG_ENABLE_FOUND)
unset(BUILD_OPENSSL_ERROR_REPORTS)
endif()
if(CMAKE_BUILD_TYPE MATCHES "Debug" OR CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
option(BUILD_OPENSSL_ERROR_REPORTS "If on, OpenSSL reports verbose error messages when they occur." ON)
else()
set(BUILD_OPENSSL_ERROR_REPORTS "If on, OpenSSL reports verbose error messages when they occur." OFF)
endif()
if(BUILD_OPENSSL_ERROR_REPORTS)
set(REPORT_OPENSSL_ERRORS TRUE)
endif()
else()
unset(BUILD_OPENSSL_ERROR_REPORTS CACHE)
endif()
# Find and configure JPEG library
find_package(JPEG QUIET)
config_package(JPEG "libjpeg")
# Find and configure PNG library
find_package(PNG QUIET)
config_package(PNG "libpng")
# Find and configure TIFF library
find_package(TIFF QUIET COMPONENTS tiff z)
config_package(TIFF "libtiff")
# Find and configure Tar library
find_package(Tar QUIET)
config_package(TAR "libtar")
# Find and configure FFTW library
find_package(FFTW QUIET)
config_package(FFTW "fftw")
# Find and configure Squish library
find_package(Squish QUIET)
config_package(SQUISH "squish")
# Find and configure Cg library
find_package(Cg QUIET)
config_package(CG "Nvidia Cg Shading Langauge")
config_package(CGGL "Cg OpenGL API")
config_package(CGDX8 "Cg DX8 API")
config_package(CGDX9 "Cg DX9 API")
config_package(CGDX10 "Cg DX10 API")
# Find and configure VRPN library
find_package(VRPN QUIET)
config_package(VRPN)
# Find and configure zlib
find_package(ZLIB QUIET)
config_package(ZLIB "zlib")
#config_package(CG "Nvidia Cg Shading Langauge")
#config_package(CGGL "Cg OpenGL API")
#config_package(CGDX8 "Cg DX8 API")
#config_package(CGDX9 "Cg DX9 API")
#config_package(CGDX10 "Cg DX10 API")
package_option(CG)
package_option(CGGL)
package_option(CGDX8)
package_option(CGDX9)
package_option(CGDX10)
# Find and configure Miles Sound System
find_package(Miles QUIET)
config_package(RAD_MSS "Miles Sound System")
#config_package(RAD_MSS "Miles Sound System")
package_option(RAD_MSS)
# Find and configure FMOD Ex
find_package(FMODEx QUIET)
config_package(FMODEX "FMOD Ex sound library")
#config_package(FMODEX "FMOD Ex sound library")
package_option(FMODEX)
# Find and configure OpenAL
find_package(OpenAL QUIET)
config_package(OPENAL "OpenAL sound library")
#config_package(OPENAL "OpenAL sound library")
package_option(OPENAL)
# Find and configure OpenGL
find_package(OpenGL QUIET)
set(GL_FOUND ${OPENGL_FOUND})
config_package(GL "OpenGL")
#config_package(GL "OpenGL")
package_option(GL)
# Find and configure Freetype
find_package(Freetype QUIET)
config_package(FREETYPE "Freetype")
#config_package(FREETYPE "Freetype")
package_option(FREETYPE)
# Find and configure GTK
set(Freetype_FIND_QUIETLY TRUE) # Fix for builtin FindGTK2
set(GTK2_GTK_FIND_QUIETLY TRUE) # Fix for builtin FindGTK2
find_package(GTK2 QUIET COMPONENTS gtk)
set(GTK_FOUND ${GTK2_FOUND}) # Mangle for convenience
config_package(GTK "gtk+-2")
#config_package(GTK "gtk+-2")
package_option(GTK)
# Find and configure WxWidgets
find_package(wxWidgets QUIET)
@ -147,12 +57,14 @@ if(WXWIDGETS_FOUND)
mark_as_advanced(wxWidgets_CONFIG_EXECUTABLE)
mark_as_advanced(wxWidgets_wxrc_EXECUTABLE)
endif()
config_package(WX "WxWidgets")
#config_package(WX "WxWidgets")
package_option(WX)
# Find and configure FLTK
set(OpenGL_FIND_QUIETLY TRUE) # Fix for builtin FindFLTK
find_package(FLTK QUIET)
config_package(FLTK)
#config_package(FLTK)
package_option(FLTK)
# Cleanup after builtin FindFLTK
mark_as_advanced(FLTK_DIR)
@ -164,7 +76,8 @@ set(Eigen3_FIND_QUIETLY TRUE) # Fix for builtin FindSDL
set(PythonLibs_FIND_QUIETLY TRUE) # Fix for builtin FindSDL
set(PythonInterp_FIND_QUIETLY TRUE) # Fix for builtin FindSDL
find_package(SDL QUIET)
config_package(SDL)
#config_package(SDL)
package_option(SDL)
# Cleanup after builtin FindSDL
mark_as_advanced(SDLMAIN_LIBRARY)

View File

@ -1,77 +0,0 @@
# Filename: ConfigurePackage.cmake
# Author: kestred (30 Nov, 2013)
#
# This modules defines a function which finds and configures libraries
# and packages for Panda3Ds configuration file headers (.h files).
#
# Assumes the file has already been found with find_package().
#
#
# Usage:
# package_option(PYTHON "Enables support for Python" [DEFAULT ON | OFF])
# If no default is given, it is initialized to whether it was found on the system.
#
function(package_option name)
# Parse the arguments.
set(command)
set(default)
set(cache_string)
foreach(arg ${ARGN})
if(command STREQUAL "DEFAULT")
set(default "${arg}")
set(command)
elseif(arg STREQUAL "DEFAULT")
set(command "DEFAULT")
else()
# Yes, a list, ecause semicolons can be in there, and
# that gets split up into multiple args, so we have to
# join it back together here.
list(APPEND cache_string "${arg}")
endif()
endforeach()
if(command STREQUAL "DEFAULT")
message(SEND_ERROR "DEFAULT in package_option takes an argument")
endif()
# If the default is not set, we set it.
if(NOT DEFINED default)
set(default "${${name}_FOUND}")
endif()
# If it was set by the user but not found, display an error.
if(HAVE_${name} AND NOT ${name}_FOUND)
message(SEND_ERROR "NOT FOUND: ${name}. Disable HAVE_${name} to continue.")
endif()
# Create the option.
option("HAVE_${name}" "${cache_string}" "${default}")
endfunction()
#
# Useful macro that picks up a package located using find_package
# as dependencies of a target that is going to be built.
# Example use:
# add_library(mylib ${SOURCES})
# target_use_packages(mylib PYTHON PNG)
#
macro(target_use_packages target)
set(libs ${ARGV})
list(REMOVE_AT libs 0)
foreach(lib ${libs})
if(HAVE_${lib})
target_include_directories("${target}" PUBLIC "${${lib}_INCLUDE_DIRS};${${lib}_INCLUDE_DIR}")
if(${lib}_LIBRARIES)
target_link_libraries("${target}" ${${lib}_LIBRARIES})
else()
target_link_libraries("${target}" ${${lib}_LIBRARY})
endif()
endif()
endforeach(lib)
endmacro(target_use_packages)