From 71889acb88f75bed15e2575f9fd78182a7523006 Mon Sep 17 00:00:00 2001 From: kestred Date: Fri, 29 Nov 2013 00:28:43 -0700 Subject: [PATCH] CMake: Begin implementing library detection and configuration. --- cmake/modules/FindEigen2.cmake | 80 +++++++++++++++++++++++++++++++ cmake/modules/FindEigen3.cmake | 80 +++++++++++++++++++++++++++++++ cmake/modules/MangleJPEG.cmake | 24 ++++++++++ cmake/modules/MangleOpenSSL.cmake | 26 ++++++++++ cmake/modules/ManglePNG.cmake | 29 +++++++++++ dtool/Configure.cmake | 37 +++++++++++++- 6 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 cmake/modules/FindEigen2.cmake create mode 100644 cmake/modules/FindEigen3.cmake create mode 100644 cmake/modules/MangleJPEG.cmake create mode 100644 cmake/modules/MangleOpenSSL.cmake create mode 100644 cmake/modules/ManglePNG.cmake diff --git a/cmake/modules/FindEigen2.cmake b/cmake/modules/FindEigen2.cmake new file mode 100644 index 0000000000..ae3fb60a26 --- /dev/null +++ b/cmake/modules/FindEigen2.cmake @@ -0,0 +1,80 @@ +# Filename: FindEigen2.cmake +# Authors: montel@kde.org, g.gael@free.fr +# Redistribution and use is allowed according to the terms of the BSD license. +# +# Module modified to mangle the names for Panda3D. +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(Eigen2 2.0.3) +# to require version 2.0.3 to newer of Eigen2. +# +# Once done this will define +# +# HAVE_EIGEN - system has eigen lib with correct version +# EIGEN_IPATH - the eigen include directory +# EIGEN_VERSION - eigen version +# + +if(NOT Eigen2_FIND_VERSION) + if(NOT Eigen2_FIND_VERSION_MAJOR) + set(Eigen2_FIND_VERSION_MAJOR 2) + endif(NOT Eigen2_FIND_VERSION_MAJOR) + if(NOT Eigen2_FIND_VERSION_MINOR) + set(Eigen2_FIND_VERSION_MINOR 0) + endif(NOT Eigen2_FIND_VERSION_MINOR) + if(NOT Eigen2_FIND_VERSION_PATCH) + set(Eigen2_FIND_VERSION_PATCH 0) + endif(NOT Eigen2_FIND_VERSION_PATCH) + + set(Eigen2_FIND_VERSION "${Eigen2_FIND_VERSION_MAJOR}.${Eigen2_FIND_VERSION_MINOR}.${Eigen2_FIND_VERSION_PATCH}") +endif(NOT Eigen2_FIND_VERSION) + +macro(_eigen2_check_version) + file(READ "${EIGEN_IPATH}/Eigen/src/Core/util/Macros.h" _eigen2_version_header) + + string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen2_world_version_match "${_eigen2_version_header}") + set(EIGEN2_WORLD_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen2_major_version_match "${_eigen2_version_header}") + set(EIGEN2_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen2_minor_version_match "${_eigen2_version_header}") + set(EIGEN2_MINOR_VERSION "${CMAKE_MATCH_1}") + + set(EIGEN_VERSION ${EIGEN2_WORLD_VERSION}.${EIGEN2_MAJOR_VERSION}.${EIGEN2_MINOR_VERSION}) + if((${EIGEN2_WORLD_VERSION} NOTEQUAL 2) OR (${EIGEN2_MAJOR_VERSION} GREATER 10) OR (${EIGEN_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION})) + set(EIGEN_VERSION_OK FALSE) + else() + set(EIGEN_VERSION_OK TRUE) + endif() + + if(NOT EIGEN_VERSION_OK) + + message(STATUS "Eigen2 version ${EIGEN_VERSION} found in ${EIGEN_IPATH}, " + "but at least version ${Eigen2_FIND_VERSION} is required") + endif(NOT EIGEN_VERSION_OK) +endmacro(_eigen2_check_version) + +if (EIGEN_IPATH) + + # in cache already + _eigen2_check_version() + set(EIGEN2_FOUND ${EIGEN_VERSION_OK}) + +else (EIGEN_IPATH) + + find_path(EIGEN_IPATH NAMES Eigen/Core + PATHS + ${INCLUDE_INSTALL_DIR} + ${KDE4_INCLUDE_DIR} + PATH_SUFFIXES eigen2 + ) + + if(EIGEN_IPATH) + _eigen2_check_version() + endif(EIGEN_IPATH) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Eigen2 DEFAULT_MSG EIGEN_IPATH EIGEN_VERSION_OK) + + mark_as_advanced(EIGEN_IPATH) + +endif(EIGEN_IPATH) diff --git a/cmake/modules/FindEigen3.cmake b/cmake/modules/FindEigen3.cmake new file mode 100644 index 0000000000..1992550555 --- /dev/null +++ b/cmake/modules/FindEigen3.cmake @@ -0,0 +1,80 @@ +# Filename: FindEigen3.cmake +# Authors: montel@kde.org, g.gael@free.fr, jacob.benoit.1@gmail.com +# Redistribution and use is allowed according to the terms of the BSD license. +# +# Module modified to mangle the names for Panda3D. +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(Eigen3 3.1.2) +# to require version 3.1.2 or newer of Eigen3. +# +# Once done this will define +# +# HAVE_EIGEN - system has eigen lib with correct version +# EIGEN_IPATH - the eigen include directory +# EIGEN_VERSION - eigen version +# + +if(NOT Eigen3_FIND_VERSION) + if(NOT Eigen3_FIND_VERSION_MAJOR) + set(Eigen3_FIND_VERSION_MAJOR 2) + endif(NOT Eigen3_FIND_VERSION_MAJOR) + if(NOT Eigen3_FIND_VERSION_MINOR) + set(Eigen3_FIND_VERSION_MINOR 91) + endif(NOT Eigen3_FIND_VERSION_MINOR) + if(NOT Eigen3_FIND_VERSION_PATCH) + set(Eigen3_FIND_VERSION_PATCH 0) + endif(NOT Eigen3_FIND_VERSION_PATCH) + + set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") +endif(NOT Eigen3_FIND_VERSION) + +macro(_eigen3_check_version) + file(READ "${EIGEN_IPATH}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) + + string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") + set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") + set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") + set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") + + set(EIGEN_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) + if(${EIGEN_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN_VERSION_OK FALSE) + else(${EIGEN_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN_VERSION_OK TRUE) + endif(${EIGEN_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + + if(NOT EIGEN_VERSION_OK) + + message(STATUS "Eigen3 version ${EIGEN_VERSION} found in ${EIGEN_IPATH}, " + "but at least version ${Eigen3_FIND_VERSION} is required") + endif(NOT EIGEN_VERSION_OK) +endmacro(_eigen3_check_version) + +if (EIGEN_IPATH) + + # in cache already + _eigen3_check_version() + set(HAVE_EIGEN ${EIGEN_VERSION_OK}) + +else (EIGEN_IPATH) + + find_path(EIGEN_IPATH NAMES signature_of_eigen3_matrix_library + PATHS + ${CMAKE_INSTALL_PREFIX}/include + ${KDE4_INCLUDE_DIR} + PATH_SUFFIXES eigen3 eigen + ) + + if(EIGEN_IPATH) + _eigen3_check_version() + endif(EIGEN_IPATH) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN_IPATH EIGEN_VERSION_OK) + + mark_as_advanced(EIGEN_IPATH) + +endif(EIGEN_IPATH) diff --git a/cmake/modules/MangleJPEG.cmake b/cmake/modules/MangleJPEG.cmake new file mode 100644 index 0000000000..9ef75a675d --- /dev/null +++ b/cmake/modules/MangleJPEG.cmake @@ -0,0 +1,24 @@ +# Filename: MangleJPEG.cmake +# Author: kestred (28 Nov, 2013) +# +# MangleJPEG replaces the output variables of the builtin FindJPEG +# with vars matching Panda3D's existing config-var names. +# + +if(JPEG_FOUND) + set(HAVE_JPEG TRUE) + set(JPEG_LIBS jpeg) + + get_filename_component(JPEG_LIBRARY_DIR "${JPEG_LIBRARY}" PATH) + + set(JPEG_IPATH "${JPEG_INCLUDE_DIR}" CACHE PATH "The path to libJPEG's include directory.") # Include path + set(JPEG_LPATH "${JPEG_LIBRARY_DIR}" CACHE PATH "The path to libJPEG's library directory.") # Library path + mark_as_advanced(JPEG_IPATH) + mark_as_advanced(JPEG_LPATH) + + unset(JPEG_FOUND) + unset(JPEG_LIBRARY CACHE) + unset(JPEG_LIBRARIES) + unset(JPEG_INCLUDE_DIR CACHE) + unset(JPEG_LIBRARY_DIR) +endif() \ No newline at end of file diff --git a/cmake/modules/MangleOpenSSL.cmake b/cmake/modules/MangleOpenSSL.cmake new file mode 100644 index 0000000000..5a3bc3b1fb --- /dev/null +++ b/cmake/modules/MangleOpenSSL.cmake @@ -0,0 +1,26 @@ +# Filename: MangleOpenSSL.cmake +# Author: kestred (28 Nov, 2013) +# +# MangleOpenSSL replaces the output variables of the builtin FindOpenSSL +# with vars matching Panda3D's existing config-var names. +# + +if(OPENSSL_FOUND) + set(HAVE_OPENSSL TRUE) + set(OPENSSL_LIBS ssl crypto) + + list(GET OPENSSL_LIBRARIES 0 OPENSSL_LIBRARY) + + get_filename_component(OPENSSL_LIBRARY_DIR "${OPENSSL_LIBRARY}" PATH) + + set(OPENSSL_IPATH "${OPENSSL_INCLUDE_DIR}" CACHE PATH "The path to OpenSSL's include directory.") # Include path + set(OPENSSL_LPATH "${OPENSSL_LIBRARY_DIR}" CACHE PATH "The path to OpenSSL's library directory.") # Library path + mark_as_advanced(OPENSSL_IPATH) + mark_as_advanced(OPENSSL_LPATH) + + unset(OPENSSL_FOUND) + unset(OPENSSL_LIBRARY) + unset(OPENSSL_LIBRARIES) + unset(OPENSSL_INCLUDE_DIR CACHE) + unset(OPENSSL_LIBRARY_DIR) +endif() \ No newline at end of file diff --git a/cmake/modules/ManglePNG.cmake b/cmake/modules/ManglePNG.cmake new file mode 100644 index 0000000000..e1001fb200 --- /dev/null +++ b/cmake/modules/ManglePNG.cmake @@ -0,0 +1,29 @@ +# Filename: ManglePNG.cmake +# Author: kestred (28 Nov, 2013) +# +# ManglePNG replaces the output variables of the builtin FindPNG +# with vars matching Panda3D's existing config-var names. +# + +if(PNG_FOUND) + set(HAVE_PNG TRUE) + set(PNG_LIBS png) + + get_filename_component(PNG_LIBRARY_DIR "${PNG_LIBRARY}" PATH) + + set(PNG_IPATH "${PNG_INCLUDE_DIR}" CACHE PATH "The path to libPNG's include directory.") # Include path + set(PNG_LPATH "${PNG_LIBRARY_DIR}" CACHE PATH "The path to libPNG's library directory.") # Library path + mark_as_advanced(PNG_IPATH) + mark_as_advanced(PNG_LPATH) + + set(PNG_VERSION ${PNG_VERSION_STRING}) + + unset(PNG_FOUND) + unset(PNG_LIBRARY CACHE) + unset(PNG_LIBRARIES) + unset(PNG_DEFINITIONS) + unset(PNG_INCLUDE_DIR CACHE) + unset(PNG_PNG_INCLUDE_DIR CACHE) + unset(PNG_LIBRARY_DIR) + unset(PNG_VERSION_STRING) +endif() \ No newline at end of file diff --git a/dtool/Configure.cmake b/dtool/Configure.cmake index 18734eb91d..9a7d231433 100644 --- a/dtool/Configure.cmake +++ b/dtool/Configure.cmake @@ -1,8 +1,18 @@ message(STATUS "") message("Configuring support for the following optional third-party packages:") + +# Check for and configure Eigen library +find_package(Eigen3 QUIET) if(HAVE_EIGEN) message(STATUS "+ Eigen linear algebra library") + if(WIN32) + set(EIGEN_CFLAGS "/arch:SSE2") + else() + set(EIGEN_CFLAGS "-msse2") + endif() + + set(LINMATH_ALIGN ON CACHE BOOL "If on, vectorization is enabled in build.") if(LINMATH_ALIGN) message(STATUS "+ (vectorization enabled in build)") else() @@ -12,25 +22,50 @@ else() message(STATUS "- Did not find Eigen linear algebra library") endif() -#find_package(OpenSSL ssl crypto) + +# Check for and configure OpenSSL library +# Mangle the builtin FindOpenSSL output to match Panda3D's config-style +find_package(OpenSSL QUIET COMPONENTS ssl crypto) +include(MangleOpenSSL) if(HAVE_OPENSSL) message(STATUS "+ OpenSSL") + + if(NOT DEFINED OPTIMIZE OR OPTIMIZE LESS 4) + set(REPORT_OPENSSL_ERRORS ON CACHE BOOL "If on, OpenSSL reports verbose error messages when they occur.") + else() + set(REPORT_OPENSSL_ERRORS OFF CACHE BOOL "If on, OpenSSL reports verbose error messages when they occur.") + endif() else() message(STATUS "- Did not find OpenSSL") endif() + +# Check for and configure JPEG library +# Mangle the builtin FindJPEG output to match Panda3D's config-style +find_package(JPEG QUIET COMPONENTS jpeg) +include(MangleJPEG) if(HAVE_JPEG) message(STATUS "+ libjpeg") + set(PHAVE_JPEGINT_H TRUE CACHE BOOL "Set to False if missing jpegint.h.") else() message(STATUS "- Did not find libjpeg") + unset(PHAVE_JPEGINT_H CACHE) endif() + +# Check for and configure PNG library +find_package(PNG QUIET COMPONENTS png) +# Mangle the builtin FindPNG output to match Panda3D's config-style +include(ManglePNG) if(HAVE_PNG) message(STATUS "+ libpng") else() message(STATUS "- Did not find libpng") endif() + + + if(HAVE_TIFF) message(STATUS "+ libtiff") else()