From 1b8652a789212d87f9f4aa062a1408fec47f961e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 20 Nov 2025 16:48:48 +0500 Subject: [PATCH] FindOpenCOLLADA.cmake --- cmake/CMakeLists.txt | 102 +------------------------------ cmake/FindOpenCOLLADA.cmake | 118 ++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 100 deletions(-) create mode 100644 cmake/FindOpenCOLLADA.cmake diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 1227d3c3f0..a0af8835ce 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -203,9 +203,6 @@ UNIFY_ENVVARS_AND_CACHE(BOOST_LIBRARYDIR) UNIFY_ENVVARS_AND_CACHE(EIGEN_DIR) if(NOT MINIMAL_BUILD) - UNIFY_ENVVARS_AND_CACHE(OPENCOLLADA_INCLUDE_DIR) - UNIFY_ENVVARS_AND_CACHE(OPENCOLLADA_LIBRARY_DIR) - UNIFY_ENVVARS_AND_CACHE(PCRE_LIBRARY_DIR) UNIFY_ENVVARS_AND_CACHE(PYTHON_INCLUDE_DIR) UNIFY_ENVVARS_AND_CACHE(PYTHON_LIBRARY) UNIFY_ENVVARS_AND_CACHE(PYTHON_EXECUTABLE) @@ -390,104 +387,9 @@ if(BUILD_IFCGEOM) endif(WITH_OPENCASCADE) endif(BUILD_IFCGEOM) -if(COLLADA_SUPPORT AND (NOT OPENCOLLADA_INCLUDE_DIR AND NOT OPENCOLLADA_LIBRARY_DIR)) - # If package is found, automatically sets - # OPENCOLLADA_INCLUDE_DIRS and OPENCOLLADA_LIBRARIES (list of targets, not paths). - find_package(OpenCOLLADA CONFIG) - if(OpenCOLLADA_DIR) - message(STATUS "Found OpenCOLLADA: '${OpenCOLLADA_DIR}'.") - set(OPENCOLLADA_FOUND TRUE) - else() - message(STATUS "OpenCOLLADA package not found, falling back to manual search.") - endif() +if(COLLADA_SUPPORT) + find_package(OpenCOLLADA REQUIRED) endif() -if(COLLADA_SUPPORT AND NOT OpenCOLLADA_DIR) - # Find OpenCOLLADA - if("${OPENCOLLADA_INCLUDE_DIR}" STREQUAL "") - message(STATUS "No OpenCOLLADA include directory specified") - set(OPENCOLLADA_INCLUDE_DIR "/usr/include/opencollada" CACHE FILEPATH "OpenCOLLADA header files") - else() - set(OPENCOLLADA_INCLUDE_DIR "${OPENCOLLADA_INCLUDE_DIR}" CACHE FILEPATH "OpenCOLLADA header files") - endif() - - if("${OPENCOLLADA_LIBRARY_DIR}" STREQUAL "") - message(STATUS "No OpenCOLLADA library directory specified") - find_library(OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework - PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib) - get_filename_component(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_FRAMEWORK_LIB} PATH) - endif() - - find_library(OpenCOLLADAFramework NAMES OpenCOLLADAFramework OpenCOLLADAFrameworkd PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH) - - if(OpenCOLLADAFramework) - message(STATUS "OpenCOLLADA library files found") - else() - message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA libraries. " - "Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.") - endif() - - set(OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files") - - set(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter") - - find_file(COLLADASWStreamWriter_h "COLLADASWStreamWriter.h" ${OPENCOLLADA_INCLUDE_DIRS}) - - if(COLLADASWStreamWriter_h) - message(STATUS "OpenCOLLADA header files found") - set(OPENCOLLADA_FOUND TRUE) - - set(OPENCOLLADA_LIBRARY_NAMES - GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader - OpenCOLLADAStreamWriter UTF buffer ftoa - ) - - # Use the found OpenCOLLADAFramework as a template for all other OpenCOLLADA libraries - foreach(lib ${OPENCOLLADA_LIBRARY_NAMES}) - # Make sure we'll handle the Windows/MSVC debug postfix convention too. - string(REPLACE OpenCOLLADAFrameworkd "${lib}" lib_path "${OpenCOLLADAFramework}") - string(REPLACE OpenCOLLADAFramework "${lib}" lib_path "${lib_path}") - list(APPEND OPENCOLLADA_LIBRARIES "${lib_path}") - endforeach() - - if("${PCRE_LIBRARY_DIR}" STREQUAL "") - if(WIN32) - find_library(pcre_library NAMES pcre pcred PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH) - else() - find_library(pcre_library NAMES pcre PATHS ${OPENCOLLADA_LIBRARY_DIR}) - endif() - - get_filename_component(PCRE_LIBRARY_DIR ${pcre_library} PATH) - else() - find_library(pcre_library NAMES pcre pcred PATHS ${PCRE_LIBRARY_DIR} NO_DEFAULT_PATH) - endif() - - if(pcre_library) - set(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_LIBRARY_DIR} ${PCRE_LIBRARY_DIR}) - - if(MSVC) - # Add release lib regardless whether release or debug found. Debug version will be appended below. - list(APPEND OPENCOLLADA_LIBRARIES "${PCRE_LIBRARY_DIR}/pcre.lib") - else() - list(APPEND OPENCOLLADA_LIBRARIES "${pcre_library}") - endif() - else() - message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find PCRE. " - "Disable COLLADA_SUPPORT or fix PCRE_LIBRARY_DIR path to proceed.") - endif() - - if(MSVC) - add_debug_variants(OPENCOLLADA_LIBRARIES "${OPENCOLLADA_LIBRARIES}" d) - endif() - else() - message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA headers. " - "Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.") - endif() -endif(COLLADA_SUPPORT AND NOT OpenCOLLADA_DIR) -if(COLLADA_SUPPORT AND OPENCOLLADA_FOUND) - add_definitions(-DWITH_OPENCOLLADA) - set(SWIG_DEFINES ${SWIG_DEFINES} -DWITH_OPENCOLLADA) -endif() - if(HDF5_SUPPORT) find_package(HDF5 REQUIRED COMPONENTS C CXX) diff --git a/cmake/FindOpenCOLLADA.cmake b/cmake/FindOpenCOLLADA.cmake new file mode 100644 index 0000000000..141ef98d82 --- /dev/null +++ b/cmake/FindOpenCOLLADA.cmake @@ -0,0 +1,118 @@ + +# +# Input variables: +# - `OPENCOLLADA_INCLUDE_DIR` +# - `OPENCOLLADA_LIBRARY_DIR` +# - `PCRE_LIBRARY_DIR` +# If input variables are not specified, try to find OpenCOLLADA config. +# Input variables could also be provided as environment variables. +# +# Output variables: +# - `OPENCOLLADA_INCLUDE_DIR` +# - `OPENCOLLADA_LIBRARY_DIR` +# - `OPENCOLLADA_LIBRARIES` +# + +UNIFY_ENVVARS_AND_CACHE(OPENCOLLADA_INCLUDE_DIR) +UNIFY_ENVVARS_AND_CACHE(OPENCOLLADA_LIBRARY_DIR) +UNIFY_ENVVARS_AND_CACHE(PCRE_LIBRARY_DIR) + +if(NOT OPENCOLLADA_INCLUDE_DIR AND NOT OPENCOLLADA_LIBRARY_DIR) + # If package is found, automatically sets + # OPENCOLLADA_INCLUDE_DIRS and OPENCOLLADA_LIBRARIES (list of targets, not paths). + find_package(OpenCOLLADA CONFIG) + if(OpenCOLLADA_DIR) + message(STATUS "Found OpenCOLLADA: '${OpenCOLLADA_DIR}'.") + set(OPENCOLLADA_FOUND TRUE) + else() + message(STATUS "OpenCOLLADA package not found, falling back to manual search.") + endif() +endif() + +if(NOT OpenCOLLADA_DIR) + # Find OpenCOLLADA + if("${OPENCOLLADA_INCLUDE_DIR}" STREQUAL "") + message(STATUS "No OpenCOLLADA include directory specified") + set(OPENCOLLADA_INCLUDE_DIR "/usr/include/opencollada" CACHE FILEPATH "OpenCOLLADA header files") + else() + set(OPENCOLLADA_INCLUDE_DIR "${OPENCOLLADA_INCLUDE_DIR}" CACHE FILEPATH "OpenCOLLADA header files") + endif() + + if("${OPENCOLLADA_LIBRARY_DIR}" STREQUAL "") + message(STATUS "No OpenCOLLADA library directory specified") + find_library(OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework + PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib) + get_filename_component(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_FRAMEWORK_LIB} PATH) + endif() + + find_library(OpenCOLLADAFramework NAMES OpenCOLLADAFramework OpenCOLLADAFrameworkd PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH) + + if(OpenCOLLADAFramework) + message(STATUS "OpenCOLLADA library files found") + else() + message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA libraries. " + "Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.") + endif() + + set(OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files") + + set(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter") + + find_file(COLLADASWStreamWriter_h "COLLADASWStreamWriter.h" ${OPENCOLLADA_INCLUDE_DIRS}) + + if(COLLADASWStreamWriter_h) + message(STATUS "OpenCOLLADA header files found") + set(OPENCOLLADA_FOUND TRUE) + + set(OPENCOLLADA_LIBRARY_NAMES + GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader + OpenCOLLADAStreamWriter UTF buffer ftoa + ) + + # Use the found OpenCOLLADAFramework as a template for all other OpenCOLLADA libraries + foreach(lib ${OPENCOLLADA_LIBRARY_NAMES}) + # Make sure we'll handle the Windows/MSVC debug postfix convention too. + string(REPLACE OpenCOLLADAFrameworkd "${lib}" lib_path "${OpenCOLLADAFramework}") + string(REPLACE OpenCOLLADAFramework "${lib}" lib_path "${lib_path}") + list(APPEND OPENCOLLADA_LIBRARIES "${lib_path}") + endforeach() + + if("${PCRE_LIBRARY_DIR}" STREQUAL "") + if(WIN32) + find_library(pcre_library NAMES pcre pcred PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH) + else() + find_library(pcre_library NAMES pcre PATHS ${OPENCOLLADA_LIBRARY_DIR}) + endif() + + get_filename_component(PCRE_LIBRARY_DIR ${pcre_library} PATH) + else() + find_library(pcre_library NAMES pcre pcred PATHS ${PCRE_LIBRARY_DIR} NO_DEFAULT_PATH) + endif() + + if(pcre_library) + set(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_LIBRARY_DIR} ${PCRE_LIBRARY_DIR}) + + if(MSVC) + # Add release lib regardless whether release or debug found. Debug version will be appended below. + list(APPEND OPENCOLLADA_LIBRARIES "${PCRE_LIBRARY_DIR}/pcre.lib") + else() + list(APPEND OPENCOLLADA_LIBRARIES "${pcre_library}") + endif() + else() + message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find PCRE. " + "Disable COLLADA_SUPPORT or fix PCRE_LIBRARY_DIR path to proceed.") + endif() + + if(MSVC) + add_debug_variants(OPENCOLLADA_LIBRARIES "${OPENCOLLADA_LIBRARIES}" d) + endif() + else() + message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA headers. " + "Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.") + endif() +endif(NOT OpenCOLLADA_DIR) + +if(OPENCOLLADA_FOUND) + add_definitions(-DWITH_OPENCOLLADA) + set(SWIG_DEFINES ${SWIG_DEFINES} -DWITH_OPENCOLLADA) +endif()