CMake: Generate/install exported target sets

This commit is contained in:
Sam Edwards 2018-12-27 17:28:13 -07:00
parent b20c6e801c
commit bddd7c1b4b
12 changed files with 232 additions and 0 deletions

View File

@ -166,3 +166,13 @@ if(INTERROGATE_PYTHON_INTERFACE)
add_test(pytest "${PYTHON_EXECUTABLE}" -m pytest "${PROJECT_SOURCE_DIR}/tests")
endif()
# Generate the Panda3DConfig.cmake file so find_package(Panda3D) works, and
# also register the build directory with CMake's package registry.
file(COPY "${PROJECT_SOURCE_DIR}/cmake/install/Panda3DConfig.cmake"
DESTINATION "${PROJECT_BINARY_DIR}")
install(FILES "${PROJECT_SOURCE_DIR}/cmake/install/Panda3DConfig.cmake"
DESTINATION "lib/cmake/Panda3D")
export(PACKAGE Panda3D)

View File

@ -0,0 +1,141 @@
# PANDA 3D SOFTWARE
# Copyright (c) Carnegie Mellon University. All rights reserved.
#
# All use of this software is subject to the terms of the revised BSD
# license. You should have received a copy of this license along
# with this source code in a file named "LICENSE."
#
# Author: CFSworks (Dec. 11, 2018)
# This file is installed to CMake's package search path, and is invoked for
# find_package(Panda3D [COMPONENTS ...])
#
# The following components are available for importing:
#
# Core - The core Panda3D libraries; this component is always included.
#
# Panda3D::Core::panda
# Panda3D::Core::pandaexpress
# etc.
#
#
# Python - Python targets, which can be used for linking against the Python
# extension modules directly. Note that this also imports the
# Python bindings for other requested components that have them.
#
# Panda3D::Python::panda3d.core
# Panda3D::Python::panda3d.physics
# etc.
#
#
# Tools - Various tools used in asset manipulation and debugging.
#
# Panda3D::Tools::egg2bam
# Panda3D::Tools::egg-optchar
# Panda3D::Tools::pview
# etc.
#
#
# Direct - Panda's "direct" Python framework; C++ support library.
#
# Panda3D::Direct::p3direct
#
#
# Egg - Support for the Egg file format.
#
# Panda3D::Egg::pandaegg
#
#
# Bullet - Support for Bullet physics.
#
# Panda3D::Bullet::p3bullet
#
#
# ODE - Support for the ODE physics engine.
#
# Panda3D::ODE::p3ode
#
#
# FFmpeg - Support for FFmpeg media format loading.
#
# Panda3D::FFmpeg::p3ffmpeg
#
#
# OpenAL - Support for OpenAL audio output.
#
# Panda3D::OpenAL::p3openal_audio
#
#
# FMOD - Support for FMOD audio output.
#
# Panda3D::OpenAL::p3fmod_audio
#
#
# OpenGL - Support for OpenGL rendering.
#
# Panda3D::OpenGL::pandagl
#
#
# DX9 - Support for Direct3D 9 rendering.
#
# Panda3D::DX9::pandadx9
#
#
# GLES - Support for OpenGL ES rendering.
#
# Panda3D::GLES::pandagles
# Panda3D::GLES::pandagles2
#
#
# Vision - Support for vision processing.
#
# Panda3D::Vision::p3vision
#
#
# VRPN - Support for connecting to a VRPN virtual reality server.
#
# Panda3D::VRPN::p3vrpn
if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 3.0)
message(FATAL_ERROR "CMake >= 3.0.2 required")
endif()
get_filename_component(_panda_config_prefix "${CMAKE_CURRENT_LIST_FILE}" PATH)
include("${_panda_config_prefix}/Panda3DPackages.cmake")
set(_panda_components
Core Python Tools
Direct Egg
Bullet ODE
FFmpeg
OpenAL FMOD
OpenGL DX9 GLES
Vision VRPN
)
set(Panda3D_FIND_REQUIRED_Core ON)
foreach(_comp Core ${Panda3D_FIND_COMPONENTS})
if(";${_panda_components};" MATCHES ";${_comp};" AND
EXISTS "${_panda_config_prefix}/Panda3D${_comp}Targets.cmake")
include("${_panda_config_prefix}/Panda3D${_comp}Targets.cmake")
if(";${Panda3D_FIND_COMPONENTS};" MATCHES ";Python;" AND
EXISTS "${_panda_config_prefix}/Panda3D${_comp}PythonTargets.cmake")
include("${_panda_config_prefix}/Panda3D${_comp}PythonTargets.cmake")
endif()
elseif(Panda3D_FIND_REQUIRED_${_comp})
message(FATAL_ERROR "Panda3D REQUIRED component ${_comp} not found")
endif()
endforeach(_comp)
unset(_comp)
unset(_panda_components)

View File

@ -370,6 +370,47 @@ function(export_packages filename)
file(GENERATE OUTPUT "${filename}" CONTENT "${exports}")
endfunction(export_packages)
#
# export_targets(set [NAMESPACE namespace] [COMPONENT component])
#
# Export targets in the export set named by "set"
#
# NAMESPACE overrides the namespace prefixed to the exported targets; it
# defaults to "Panda3D::[set]::" if no explicit override is given.
#
# COMPONENT overrides the install component for the generated .cmake file; it
# defaults to "[set]" if no explicit override is given.
#
function(export_targets set)
set(namespace "Panda3D::${set}::")
set(component "${set}")
set(keyword)
foreach(arg ${ARGN})
if(arg STREQUAL "NAMESPACE" OR
arg STREQUAL "COMPONENT")
set(keyword "${arg}")
elseif(keyword STREQUAL "NAMESPACE")
set(namespace "${arg}")
elseif(keyword STREQUAL "COMPONENT")
set(component "${arg}")
else()
message(FATAL_ERROR "export_targets() given unexpected arg: ${arg}")
endif()
endforeach(arg)
export(EXPORT "${set}" NAMESPACE "${namespace}"
FILE "${PROJECT_BINARY_DIR}/Panda3D${set}Targets.cmake")
install(EXPORT "${set}" NAMESPACE "${namespace}"
FILE "Panda3D${set}Targets.cmake"
COMPONENT "${component}" DESTINATION lib/cmake/Panda3D)
endfunction(export_targets)
#
# find_package
#

View File

@ -80,3 +80,7 @@ except ImportError as err:
# Now install ourselves:
install_python_package("${PROJECT_BINARY_DIR}/pandac" LIB COMPONENT Direct)
endif()
# "Direct" component contains both the Python stuff and the non-Python stuff,
# because direct has a pretty solid dependency on Python.
export_targets(Direct NAMESPACE "Panda3D::Direct::" COMPONENT DirectDevel)

View File

@ -192,3 +192,9 @@ configure_file(dtool_config.h.in "${PROJECT_BINARY_DIR}/include/${intdir}/dtool_
install(FILES "${PROJECT_BINARY_DIR}/include/${intdir}/dtool_config.h"
COMPONENT CoreDevel
DESTINATION include/panda3d)
# Generate the package configuration file
export_packages("${PROJECT_BINARY_DIR}/Panda3DPackages.cmake")
install(FILES "${PROJECT_BINARY_DIR}/Panda3DPackages.cmake"
COMPONENT CoreDevel
DESTINATION "lib/cmake/Panda3D")

View File

@ -99,23 +99,37 @@ if(HAVE_PYTHON)
if(HAVE_BULLET)
add_python_module(bullet p3bullet IMPORT panda3d.core COMPONENT BulletPython)
export_targets(BulletPython NAMESPACE "Panda3D::Python::" COMPONENT BulletDevel)
endif()
if(HAVE_EGG)
add_python_module(egg p3egg p3egg2pg LINK pandaegg IMPORT panda3d.core COMPONENT EggPython)
export_targets(EggPython NAMESPACE "Panda3D::Python::" COMPONENT EggDevel)
endif()
add_python_module(physics p3physics p3particlesystem LINK pandaphysics IMPORT panda3d.core)
if(HAVE_ODE)
add_python_module(ode p3ode IMPORT panda3d.core COMPONENT ODEPython)
export_targets(ODEPython NAMESPACE "Panda3D::Python::" COMPONENT ODEDevel)
endif()
if(HAVE_OPENCV OR HAVE_ARTOOLKIT)
add_python_module(vision p3vision IMPORT panda3d.core COMPONENT VisionPython)
export_targets(VisionPython NAMESPACE "Panda3D::Python::" COMPONENT VisionDevel)
endif()
if(HAVE_VRPN)
add_python_module(vrpn p3vrpn IMPORT panda3d.core COMPONENT VRPNPython)
export_targets(VRPNPython NAMESPACE "Panda3D::Python::" COMPONENT VRPNDevel)
endif()
export_targets(Python NAMESPACE "Panda3D::Python::" COMPONENT CoreDevel)
endif()
export_targets(Core COMPONENT CoreDevel)

View File

@ -14,3 +14,5 @@ install(TARGETS pandaegg
DESTINATION lib
RUNTIME DESTINATION bin
ARCHIVE COMPONENT EggDevel)
export_targets(Egg COMPONENT EggDevel)

View File

@ -40,3 +40,5 @@ install(TARGETS pandagl
EXPORT OpenGL COMPONENT OpenGL
DESTINATION ${MODULE_DESTINATION}
ARCHIVE COMPONENT OpenGLDevel)
export_targets(OpenGL NAMESPACE "Panda3D::OpenGL::" COMPONENT OpenGLDevel)

View File

@ -30,6 +30,8 @@ if(HAVE_RAD_MSS)
DESTINATION lib
RUNTIME DESTINATION bin
ARCHIVE COMPONENT MilesDevel)
export_targets(Miles NAMESPACE "Panda3D::Miles::" COMPONENT MilesDevel)
endif()
if(HAVE_FMODEX)
@ -51,6 +53,8 @@ if(HAVE_FMODEX)
DESTINATION lib
RUNTIME DESTINATION bin
ARCHIVE COMPONENT FMODDevel)
export_targets(FMOD NAMESPACE "Panda3D::FMOD::" COMPONENT FMODDevel)
endif()
if(HAVE_OPENAL)
@ -73,4 +77,6 @@ if(HAVE_OPENAL)
DESTINATION lib
RUNTIME DESTINATION bin
ARCHIVE COMPONENT OpenALDevel)
export_targets(OpenAL NAMESPACE "Panda3D::OpenAL::" COMPONENT OpenALDevel)
endif()

View File

@ -118,3 +118,5 @@ install(TARGETS p3bullet
RUNTIME DESTINATION bin
ARCHIVE COMPONENT BulletDevel)
install(FILES ${P3BULLET_HEADERS} COMPONENT BulletDevel DESTINATION include/panda3d)
export_targets(Bullet COMPONENT BulletDevel)

View File

@ -98,3 +98,5 @@ install(TARGETS p3ode
RUNTIME DESTINATION bin
ARCHIVE COMPONENT ODEDevel)
install(FILES ${P3ODE_HEADERS} COMPONENT ODEDevel DESTINATION include/panda3d)
export_targets(ODE COMPONENT ODEDevel)

View File

@ -39,3 +39,5 @@ install(TARGETS p3vision
RUNTIME DESTINATION bin
ARCHIVE COMPONENT VisionDevel)
install(FILES ${P3VISION_HEADERS} COMPONENT VisionDevel DESTINATION include/panda3d)
export_targets(Vision COMPONENT VisionDevel)