From 8dd46eb736060887bc24a93df6b15a7217d92698 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Thu, 18 Oct 2018 15:28:40 -0600 Subject: [PATCH] CMake: Redo ODE find module This defines an ODE::ODE target; it also automatically selects the correct `dIDESINGLE`/`dIDEDOUBLE` compile-time definition. --- cmake/modules/FindODE.cmake | 158 +++++++++++++++++++++++++---------- dtool/Package.cmake | 3 +- panda/src/ode/CMakeLists.txt | 141 ++++++++++++++++--------------- 3 files changed, 186 insertions(+), 116 deletions(-) diff --git a/cmake/modules/FindODE.cmake b/cmake/modules/FindODE.cmake index 6c70f69de7..363b87db8f 100644 --- a/cmake/modules/FindODE.cmake +++ b/cmake/modules/FindODE.cmake @@ -7,74 +7,144 @@ # Once done this will define: # ODE_FOUND - system has ode # ODE_INCLUDE_DIR - the ode include directory -# ODE_LIBRARY_DIR - the ode library directory -# ODE_LIBRARY - the path to the library binary # # ODE_RELEASE_LIBRARY - the filepath of the ode release library # ODE_DEBUG_LIBRARY - the filepath of the ode debug library # +# ODE_SINGLE_DEBUG_LIBRARY - the filepath of the single-precision ode debug library +# ODE_SINGLE_RELEASE_LIBRARY - the filepath of the single-precision ode release library +# ODE_DOUBLE_DEBUG_LIBRARY - the filepath of the double-precision ode debug library +# ODE_DOUBLE_RELEASE_LIBRARY - the filepath of the double-precision ode release library +# +# ODE::ODE - The recommended ODE library to link against +# ODE::ODE_single - If available, this links against single-precision ODE +# ODE::ODE_double - If available, this links against double-precision ODE +# if(NOT ODE_INCLUDE_DIR OR NOT ODE_LIBRARY_DIR) # Find the libode include files find_path(ODE_INCLUDE_DIR NAMES "ode.h" - PATHS "/usr/include" - "/usr/local/include" - "/sw/include" - "/opt/include" - "/opt/local/include" - "/opt/csw/include" - PATH_SUFFIXES "" "ode" - ) + PATH_SUFFIXES "ode") # Find the libode library built for release find_library(ODE_RELEASE_LIBRARY - NAMES "ode" "libode" - PATHS "/usr" - "/usr/local" - "/usr/freeware" - "/sw" - "/opt" - "/opt/csw" - PATH_SUFFIXES "lib" "lib32" "lib64" - ) + NAMES "ode" "libode") # Find the libode library built for debug find_library(ODE_DEBUG_LIBRARY - NAMES "oded" "liboded" - PATHS "/usr" - "/usr/local" - "/usr/freeware" - "/sw" - "/opt" - "/opt/csw" - PATH_SUFFIXES "lib" "lib32" "lib64" - ) + NAMES "oded" "liboded") + # Find the single-precision library built for release + find_library(ODE_SINGLE_RELEASE_LIBRARY + NAMES "ode_single" "libode_single") + + # Find the single-precision library built for debug + find_library(ODE_SINGLE_DEBUG_LIBRARY + NAMES "ode_singled" "libode_singled") + + # Find the double-precision library built for release + find_library(ODE_DOUBLE_RELEASE_LIBRARY + NAMES "ode_double" "libode_double" ) + + # Find the double-precision library built for debug + find_library(ODE_DOUBLE_DEBUG_LIBRARY + NAMES "ode_doubled" "libode_doubled") + + unset(_ODE_LIB_PATHS) mark_as_advanced(ODE_INCLUDE_DIR) mark_as_advanced(ODE_RELEASE_LIBRARY) mark_as_advanced(ODE_DEBUG_LIBRARY) + mark_as_advanced(ODE_SINGLE_RELEASE_LIBRARY) + mark_as_advanced(ODE_SINGLE_DEBUG_LIBRARY) + mark_as_advanced(ODE_DOUBLE_RELEASE_LIBRARY) + mark_as_advanced(ODE_DOUBLE_DEBUG_LIBRARY) endif() -# Choose library -if(CMAKE_BUILD_TYPE MATCHES "Debug" AND ODE_DEBUG_LIBRARY) - set(ODE_LIBRARY ${ODE_DEBUG_LIBRARY} CACHE FILEPATH "The filepath to libode's library binary.") -elseif(ODE_RELEASE_LIBRARY) - set(ODE_LIBRARY ${ODE_RELEASE_LIBRARY} CACHE FILEPATH "The filepath to libode's library binary.") -elseif(ODE_DEBUG_LIBRARY) - set(ODE_LIBRARY ${ODE_DEBUG_LIBRARY} CACHE FILEPATH "The filepath to libode's library binary.") +# Define targets for both precisions (and unspecified) +foreach(_precision _single _double "") + string(TOUPPER "${_precision}" _PRECISION) + + if(EXISTS "${ODE${_PRECISION}_RELEASE_LIBRARY}" OR + EXISTS "${ODE${_PRECISION}_DEBUG_LIBRARY}") + if(NOT TARGET ODE::ODE${_precision}) + add_library(ODE::ODE${_precision} UNKNOWN IMPORTED GLOBAL) + + set_target_properties(ODE::ODE${_precision} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${ODE_INCLUDE_DIR}") + + if(EXISTS "${ODE${_PRECISION}_RELEASE_LIBRARY}") + set_property(TARGET ODE::ODE${_precision} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(ODE::ODE${_precision} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_LOCATION_RELEASE "${ODE${_PRECISION}_RELEASE_LIBRARY}") + endif() + + if(EXISTS "${ODE${_PRECISION}_DEBUG_LIBRARY}") + set_property(TARGET ODE::ODE${_precision} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(ODE::ODE${_precision} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" + IMPORTED_LOCATION_DEBUG "${ODE${_PRECISION}_DEBUG_LIBRARY}") + endif() + + # If this has a precision, we should be sure to define + # dIDESINGLE/dIDEDOUBLE to keep it consistent + if(_precision) + string(REPLACE "_" "dIDE" _precision_symbol "${_PRECISION}") + + set_target_properties(ODE::ODE${_precision} PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "${_precision_symbol}") + + unset(_precision_symbol) + endif() + + endif() + endif() +endforeach(_precision) +unset(_precision) +unset(_PRECISION) + +# OKAY. If everything went well, we have ODE::ODE_single and/or +# ODE::ODE_double. We might even have an ODE::ODE, but if not, we need to +# alias one of the other two to it. +if(NOT TARGET ODE::ODE) + if(TARGET ODE::ODE_single) + set(_copy_from "ODE::ODE_single") + elseif(TARGET ODE::ODE_double) + set(_copy_from "ODE::ODE_double") + endif() + + if(DEFINED _copy_from) + add_library(ODE::ODE UNKNOWN IMPORTED GLOBAL) + + foreach(_prop + INTERFACE_INCLUDE_DIRECTORIES + INTERFACE_COMPILE_DEFINITIONS + IMPORTED_CONFIGURATIONS + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE + IMPORTED_LOCATION_RELEASE + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG + IMPORTED_LOCATION_DEBUG) + + get_target_property(_value "${_copy_from}" "${_prop}") + if(DEFINED _value) + set_target_properties(ODE::ODE PROPERTIES "${_prop}" "${_value}") + endif() + unset(_value) + endforeach(_prop) + endif() + + unset(_copy_from) endif() -# Translate library into library directory -if(ODE_LIBRARY) - unset(ODE_LIBRARY_DIR CACHE) - get_filename_component(ODE_LIBRARY_DIR "${ODE_LIBRARY}" PATH) - set(ODE_LIBRARY_DIR "${ODE_LIBRARY_DIR}" CACHE PATH "The path to libode's library directory.") # Library path +if(TARGET ODE::ODE) + set(_HAS_ODE_LIBRARY ON) endif() -mark_as_advanced(ODE_LIBRARY) -mark_as_advanced(ODE_LIBRARY_DIR) - include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(ODE DEFAULT_MSG ODE_LIBRARY ODE_INCLUDE_DIR ODE_LIBRARY_DIR) +find_package_handle_standard_args(ODE DEFAULT_MSG ODE_INCLUDE_DIR _HAS_ODE_LIBRARY) + +unset(_HAS_ODE_LIBRARY) diff --git a/dtool/Package.cmake b/dtool/Package.cmake index 7b2e4c4dc7..79dbeae29f 100644 --- a/dtool/Package.cmake +++ b/dtool/Package.cmake @@ -336,7 +336,8 @@ find_package(ODE QUIET) package_option(ODE "Enable this option to support game dynamics with the Open Dynamics Engine (ODE)." - LICENSE "BSD-3") + LICENSE "BSD-3" + IMPORTED_AS ODE::ODE) config_package(ODE "Open Dynamics Engine") diff --git a/panda/src/ode/CMakeLists.txt b/panda/src/ode/CMakeLists.txt index 934fdbc04f..b80183aa7c 100644 --- a/panda/src/ode/CMakeLists.txt +++ b/panda/src/ode/CMakeLists.txt @@ -3,80 +3,80 @@ if(NOT HAVE_ODE) endif() set(P3ODE_HEADERS - ode_includes.h config_ode.h - odeWorld.I odeWorld.h - odeMass.I odeMass.h - odeBody.I odeBody.h - odeJointGroup.I odeJointGroup.h - odeJoint.I odeJoint.h - odeUtil.h - odeSpace.I odeSpace.h - odeGeom.I odeGeom.h - odeSurfaceParameters.I odeSurfaceParameters.h - odeContactGeom.I odeContactGeom.h - odeContact.I odeContact.h - odeAMotorJoint.I odeAMotorJoint.h - odeBallJoint.I odeBallJoint.h - odeContactJoint.I odeContactJoint.h - odeFixedJoint.I odeFixedJoint.h - odeHingeJoint.I odeHingeJoint.h - odeHinge2Joint.I odeHinge2Joint.h - odeLMotorJoint.I odeLMotorJoint.h - odeNullJoint.I odeNullJoint.h - odePlane2dJoint.I odePlane2dJoint.h - odeSliderJoint.I odeSliderJoint.h - odeUniversalJoint.I odeUniversalJoint.h - odeJointCollection.I odeJointCollection.h - odeSimpleSpace.I odeSimpleSpace.h - odeHashSpace.I odeHashSpace.h - odeQuadTreeSpace.I odeQuadTreeSpace.h - odeSphereGeom.I odeSphereGeom.h - odeBoxGeom.I odeBoxGeom.h - odePlaneGeom.I odePlaneGeom.h - odeCappedCylinderGeom.I odeCappedCylinderGeom.h - odeCylinderGeom.I odeCylinderGeom.h - odeRayGeom.I odeRayGeom.h - odeTriMeshData.I odeTriMeshData.h - odeTriMeshGeom.I odeTriMeshGeom.h - odeCollisionEntry.I odeCollisionEntry.h - odeHelperStructs.h) + ode_includes.h config_ode.h + odeWorld.I odeWorld.h + odeMass.I odeMass.h + odeBody.I odeBody.h + odeJointGroup.I odeJointGroup.h + odeJoint.I odeJoint.h + odeUtil.h + odeSpace.I odeSpace.h + odeGeom.I odeGeom.h + odeSurfaceParameters.I odeSurfaceParameters.h + odeContactGeom.I odeContactGeom.h + odeContact.I odeContact.h + odeAMotorJoint.I odeAMotorJoint.h + odeBallJoint.I odeBallJoint.h + odeContactJoint.I odeContactJoint.h + odeFixedJoint.I odeFixedJoint.h + odeHingeJoint.I odeHingeJoint.h + odeHinge2Joint.I odeHinge2Joint.h + odeLMotorJoint.I odeLMotorJoint.h + odeNullJoint.I odeNullJoint.h + odePlane2dJoint.I odePlane2dJoint.h + odeSliderJoint.I odeSliderJoint.h + odeUniversalJoint.I odeUniversalJoint.h + odeJointCollection.I odeJointCollection.h + odeSimpleSpace.I odeSimpleSpace.h + odeHashSpace.I odeHashSpace.h + odeQuadTreeSpace.I odeQuadTreeSpace.h + odeSphereGeom.I odeSphereGeom.h + odeBoxGeom.I odeBoxGeom.h + odePlaneGeom.I odePlaneGeom.h + odeCappedCylinderGeom.I odeCappedCylinderGeom.h + odeCylinderGeom.I odeCylinderGeom.h + odeRayGeom.I odeRayGeom.h + odeTriMeshData.I odeTriMeshData.h + odeTriMeshGeom.I odeTriMeshGeom.h + odeCollisionEntry.I odeCollisionEntry.h + odeHelperStructs.h) set(P3ODE_SOURCES - config_ode.cxx - odeWorld.cxx odeMass.cxx odeBody.cxx - odeJointGroup.cxx odeJoint.cxx - odeUtil.cxx - odeSpace.cxx - odeGeom.cxx - odeSurfaceParameters.cxx - odeContactGeom.cxx odeContact.cxx - odeAMotorJoint.cxx odeBallJoint.cxx - odeContactJoint.cxx odeFixedJoint.cxx - odeHingeJoint.cxx odeHinge2Joint.cxx - odeLMotorJoint.cxx odeNullJoint.cxx - odePlane2dJoint.cxx odeSliderJoint.cxx - odeUniversalJoint.cxx odeJointCollection.cxx - odeSimpleSpace.cxx - odeHashSpace.cxx odeQuadTreeSpace.cxx - odeSphereGeom.cxx odeBoxGeom.cxx - odePlaneGeom.cxx odeCappedCylinderGeom.cxx - odeCylinderGeom.cxx odeRayGeom.cxx - odeTriMeshData.cxx odeTriMeshGeom.cxx - odeCollisionEntry.cxx) + config_ode.cxx + odeWorld.cxx odeMass.cxx odeBody.cxx + odeJointGroup.cxx odeJoint.cxx + odeUtil.cxx + odeSpace.cxx + odeGeom.cxx + odeSurfaceParameters.cxx + odeContactGeom.cxx odeContact.cxx + odeAMotorJoint.cxx odeBallJoint.cxx + odeContactJoint.cxx odeFixedJoint.cxx + odeHingeJoint.cxx odeHinge2Joint.cxx + odeLMotorJoint.cxx odeNullJoint.cxx + odePlane2dJoint.cxx odeSliderJoint.cxx + odeUniversalJoint.cxx odeJointCollection.cxx + odeSimpleSpace.cxx + odeHashSpace.cxx odeQuadTreeSpace.cxx + odeSphereGeom.cxx odeBoxGeom.cxx + odePlaneGeom.cxx odeCappedCylinderGeom.cxx + odeCylinderGeom.cxx odeRayGeom.cxx + odeTriMeshData.cxx odeTriMeshGeom.cxx + odeCollisionEntry.cxx) set(P3ODE_IGATEEXT - odeBody_ext.h - odeBody_ext.I - odeGeom_ext.cxx - odeGeom_ext.h - odeGeom_ext.I - odeJoint_ext.cxx - odeJoint_ext.h - odeSpace_ext.cxx - odeSpace_ext.h - odeSpace_ext.I - odeUtil_ext.cxx - odeUtil_ext.h) + odeBody_ext.h + odeBody_ext.I + odeGeom_ext.cxx + odeGeom_ext.h + odeGeom_ext.I + odeJoint_ext.cxx + odeJoint_ext.h + odeSpace_ext.cxx + odeSpace_ext.h + odeSpace_ext.I + odeUtil_ext.cxx + odeUtil_ext.h) set(P3ODE_IGATE_SOURCES "${P3ODE_HEADERS};${P3ODE_SOURCES}") list(REMOVE_ITEM P3ODE_IGATE_SOURCES "odeConvexGeom.h") @@ -86,7 +86,6 @@ list(REMOVE_ITEM P3ODE_IGATE_SOURCES "odeHelperStructs.h") composite_sources(p3ode P3ODE_SOURCES) add_library(p3ode ${P3ODE_SOURCES} ${P3ODE_HEADERS}) set_target_properties(p3ode PROPERTIES DEFINE_SYMBOL BUILDING_PANDAODE) -target_compile_definitions(p3ode PUBLIC dSINGLE) target_link_libraries(p3ode p3igateruntime panda PKG::ODE) target_interrogate(p3ode ${P3ODE_IGATE_SOURCES} EXTENSIONS ${P3ODE_IGATEEXT})