From aa071ef2b1d743ceaafbcdd67faa117cbc5ce8c0 Mon Sep 17 00:00:00 2001 From: Peter Soetens Date: Wed, 3 Jun 2009 12:01:23 +0200 Subject: [PATCH] Apply patch from Adolfo Rodriguez to fix Boost/Xerces detection and add LibFindMacros --- config/FindXerces.cmake | 49 ++++++++++++++++++ config/LibFindMacros.cmake | 101 +++++++++++++++++++++++++++++++++++++ config/check_depend.cmake | 62 ++++++++++------------- src/CMakeLists.txt | 4 +- src/marsh/CMakeLists.txt | 6 +-- 5 files changed, 181 insertions(+), 41 deletions(-) create mode 100644 config/FindXerces.cmake create mode 100644 config/LibFindMacros.cmake diff --git a/config/FindXerces.cmake b/config/FindXerces.cmake new file mode 100644 index 000000000..a6db0e721 --- /dev/null +++ b/config/FindXerces.cmake @@ -0,0 +1,49 @@ +################################################################################ +# +# CMake script for finding Xerces. +# If the optional Xerces_ROOT_DIR environment variable exists, header files and +# libraries will be searched in the Xerces_ROOT_DIR/include and Xerces_ROOT_DIR/libs +# directories, respectively. Otherwise the default CMake search process will be +# used. +# +# This script creates the following variables: +# Xerces_FOUND: Boolean that indicates if the package was found +# Xerces_INCLUDE_DIRS: Paths to the necessary header files +# Xerces_LIBRARIES: Package libraries +# +################################################################################ + +include(LibFindMacros) + +# Get hint from environment variable (if any) +if(NOT $ENV{Xerces_ROOT_DIR} STREQUAL "") + set(Xerces_ROOT_DIR $ENV{Xerces_ROOT_DIR} CACHE PATH "Xerces base directory location (optional, used for nonstandard installation paths)" FORCE) + mark_as_advanced(Xerces_ROOT_DIR) +endif() + +# Header files to find +set(header_NAME xercesc/dom/DOM.hpp) + +# Libraries to find +set(xerces_c_NAME xerces-c) +set(xerces_depdom_NAME xerces-depdom) + +# Find headers and libraries +if(Xerces_ROOT_DIR) + # Use location specified by environment variable + find_path(Xerces_INCLUDE_DIR NAMES ${header_NAME} PATHS ${Xerces_ROOT_DIR}/include NO_DEFAULT_PATH) + find_library(Xerces_c_LIBRARY NAMES ${xerces_c_NAME} PATHS ${Xerces_ROOT_DIR}/lib NO_DEFAULT_PATH) + find_library(Xerces_depdom_LIBRARY NAMES ${xerces_depdom_NAME} PATHS ${Xerces_ROOT_DIR}/lib NO_DEFAULT_PATH) +else() + # Use default CMake search process + find_path(Xerces_INCLUDE_DIR NAMES ${header_NAME}) + find_library(Xerces_c_LIBRARY NAMES ${xerces_c_NAME}) + find_library(Xerces_depdom_LIBRARY NAMES ${xerces_depdom_NAME}) +endif() + +# Set the include dir variables and the libraries and let libfind_process do the rest. +# NOTE: Singular variables for this library, plural for libraries this this lib depends on. +set(Xerces_PROCESS_INCLUDES Xerces_INCLUDE_DIR) +set(Xerces_PROCESS_LIBS Xerces_c_LIBRARY + Xerces_depdom_LIBRARY) +libfind_process(Xerces) diff --git a/config/LibFindMacros.cmake b/config/LibFindMacros.cmake new file mode 100644 index 000000000..db880c19b --- /dev/null +++ b/config/LibFindMacros.cmake @@ -0,0 +1,101 @@ +# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments +# used for the current package. For this to work, the first parameter must be the +# prefix of the current package, then the prefix of the new package etc, which are +# passed to find_package. +macro (libfind_package PREFIX) + set (LIBFIND_PACKAGE_ARGS ${ARGN}) + if (${PREFIX}_FIND_QUIETLY) + set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) + endif (${PREFIX}_FIND_QUIETLY) + if (${PREFIX}_FIND_REQUIRED) + set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) + endif (${PREFIX}_FIND_REQUIRED) + find_package(${LIBFIND_PACKAGE_ARGS}) +endmacro (libfind_package) + +# Damn CMake developers made the UsePkgConfig system deprecated in the same release (2.6) +# where they added pkg_check_modules. Consequently I need to support both in my scripts +# to avoid those deprecated warnings. Here's a helper that does just that. +# Works identically to pkg_check_modules, except that no checks are needed prior to use. +macro (libfind_pkg_check_modules PREFIX PKGNAME) + if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + include(UsePkgConfig) + pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) + else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(${PREFIX} ${PKGNAME}) + endif (PKG_CONFIG_FOUND) + endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) +endmacro (libfind_pkg_check_modules) + +# Do the final processing once the paths have been detected. +# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain +# all the variables, each of which contain one include directory. +# Ditto for ${PREFIX}_PROCESS_LIBS and library files. +# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. +# Also handles errors in case library detection was required, etc. +macro (libfind_process PREFIX) + # Skip processing if already processed during this run + if (NOT ${PREFIX}_FOUND) + # Start with the assumption that the library was found + set (${PREFIX}_FOUND TRUE) + + # Process all includes and set _FOUND to false if any are missing + foreach (i ${${PREFIX}_PROCESS_INCLUDES}) + if (${i}) + set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) + mark_as_advanced(${i}) + else (${i}) + set (${PREFIX}_FOUND FALSE) + endif (${i}) + endforeach (i) + + # Process all libraries and set _FOUND to false if any are missing + foreach (i ${${PREFIX}_PROCESS_LIBS}) + if (${i}) + set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) + mark_as_advanced(${i}) + else (${i}) + set (${PREFIX}_FOUND FALSE) + endif (${i}) + endforeach (i) + + # Print message and/or exit on fatal error + if (${PREFIX}_FOUND) + if (NOT ${PREFIX}_FIND_QUIETLY) + message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") + endif (NOT ${PREFIX}_FIND_QUIETLY) + else (${PREFIX}_FOUND) + if (${PREFIX}_FIND_REQUIRED) + foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) + message("${i}=${${i}}") + endforeach (i) + message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use the ${PREFIX}_ROOT_DIR environment variable or ccmake to set the missing variables manually.") + else (${PREFIX}_FIND_REQUIRED) # NOTE: else case not included in original file + message (STATUS "Optional library ${PREFIX} NOT FOUND. If the library is already installed, use the ${PREFIX}_ROOT_DIR environment variable or ccmake to set the missing variables manually.") + endif (${PREFIX}_FIND_REQUIRED) + endif (${PREFIX}_FOUND) + endif (NOT ${PREFIX}_FOUND) +endmacro (libfind_process) + +macro(libfind_library PREFIX basename) + set(TMP "") + if(MSVC80) + set(TMP -vc80) + endif(MSVC80) + if(MSVC90) + set(TMP -vc90) + endif(MSVC90) + set(${PREFIX}_LIBNAMES ${basename}${TMP}) + if(${ARGC} GREATER 2) + set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) + string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) + set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) + endif(${ARGC} GREATER 2) + find_library(${PREFIX}_LIBRARY + NAMES ${${PREFIX}_LIBNAMES} + PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} + ) +endmacro(libfind_library) + diff --git a/config/check_depend.cmake b/config/check_depend.cmake index 6297f4873..92848ef4d 100644 --- a/config/check_depend.cmake +++ b/config/check_depend.cmake @@ -4,56 +4,46 @@ # # ########################################################### +# Modules path (for searching FindXXX.cmake files) +LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/config") + # Look for boost -IF (NOT CMAKE_CROSS_COMPILE) -MESSAGE("-- Looking for Boost/C++ headers --") -FIND_PATH( BOOST_DIR boost/shared_ptr.hpp ) -FIND_PATH( HAS_BOOST_SPIRIT boost/spirit.hpp ) -FIND_PATH( HAS_BOOST_GRAPH boost/graph/adjacency_list.hpp ) -IF(BOOST_DIR AND HAS_BOOST_GRAPH AND HAS_BOOST_SPIRIT) - MESSAGE("-- Looking for Boost headers - found") - IF (NOT BOOST_DIR STREQUAL "/usr/include") +IF (NOT CMAKE_CROSS_COMPILE) # NOTE: What happens if CMAKE_CROSS_COMPILE is TRUE? + FIND_PACKAGE(Boost 1.32 REQUIRED) + IF(Boost_FOUND) + IF (NOT Boost_INCLUDE_DIRS STREQUAL "/usr/include") SET( RTT_CFLAGS "${RTT_CFLAGS} -I${BOOST_DIR}" ) - ENDIF (NOT BOOST_DIR STREQUAL "/usr/include") - SET(ORO_SUPPORT_BOOST TRUE CACHE INTERNAL "" FORCE) -ELSE(BOOST_DIR AND HAS_BOOST_GRAPH AND HAS_BOOST_SPIRIT) - MESSAGE("-- Looking for Boost headers - not found") - SET(ORO_SUPPORT_BOOST FALSE CACHE INTERNAL "" FORCE) - MESSAGE( FATAL_ERROR "Install Boost C++ (libboost-dev, libboost-graph-dev) version 0.32.0 or newer.") -ENDIF(BOOST_DIR AND HAS_BOOST_GRAPH AND HAS_BOOST_SPIRIT) + ENDIF (NOT Boost_INCLUDE_DIRS STREQUAL "/usr/include") + SET(ORO_SUPPORT_BOOST TRUE CACHE INTERNAL "" FORCE) + ELSE(Boost_FOUND) + SET(ORO_SUPPORT_BOOST FALSE CACHE INTERNAL "" FORCE) + ENDIF(Boost_FOUND) ENDIF (NOT CMAKE_CROSS_COMPILE) -# Look for Xerces (Do not change these SET statements !) -IF (NOT CMAKE_CROSS_COMPILE ) - FIND_LIBRARY(XERCES NAMES xerces-c - PATHS /usr/local/lib /usr/lib ) - FIND_PATH( XERCES_HEADERS xercesc/util/PlatformUtils.hpp) -ELSE (NOT CMAKE_CROSS_COMPILE ) - FIND_LIBRARY(XERCES NAMES xerces-c NO_DEFAULT_PATH ) -ENDIF (NOT CMAKE_CROSS_COMPILE ) -IF ( XERCES AND XERCES_HEADERS) - MESSAGE("-- Looking for Xerces - found") - SET( RTT_CFLAGS "${RTT_CFLAGS} -I${XERCES_HEADERS}" ) - GET_FILENAME_COMPONENT(XERCES_LIB_PATH ${XERCES} PATH) - LINK_DIRECTORIES(${XERCES_LIB_PATH}) +# Look for Xerces + +# If a nonstandard path is used when crosscompiling, uncomment the following lines +# IF(NOT CMAKE_CROSS_COMPILE) # NOTE: There now exists a standard CMake variable named CMAKE_CROSSCOMPILING +# set(Xerces_ROOT_DIR /path/to/xerces CACHE INTERNAL "" FORCE) # you can also use set(ENV{Xerces_ROOT_DIR} /path/to/xerces) +# ENDIF(NOT CMAKE_CROSS_COMPILE) + +FIND_PACKAGE(Xerces) + +IF(Xerces_FOUND) SET(OROPKG_SUPPORT_XERCES_C TRUE CACHE INTERNAL "" FORCE) - LINK_LIBRARIES(xerces-c) + INCLUDE_DIRECTORIES(${Xerces_INCLUDE_DIRS}) + LINK_LIBRARIES(${Xerces_LIBRARIES}) # NOTE: Deprecated command SET(ORODAT_CORELIB_PROPERTIES_MARSHALLING_INCLUDE "\"marsh/CPFMarshaller.hpp\"") SET(OROCLS_CORELIB_PROPERTIES_MARSHALLING_DRIVER "CPFMarshaller") SET(ORODAT_CORELIB_PROPERTIES_DEMARSHALLING_INCLUDE "\"marsh/CPFDemarshaller.hpp\"") SET(OROCLS_CORELIB_PROPERTIES_DEMARSHALLING_DRIVER "CPFDemarshaller") -ELSE ( XERCES AND XERCES_HEADERS ) - IF (NOT XERCES_HEADERS) - MESSAGE("-- Looking for Xerces - headers not found") - ENDIF (NOT XERCES_HEADERS) - +ELSE(Xerces_FOUND) SET(OROPKG_SUPPORT_XERCES_C FALSE CACHE INTERNAL "" FORCE) - SET(ORODAT_CORELIB_PROPERTIES_MARSHALLING_INCLUDE "\"marsh/CPFMarshaller.hpp\"") SET(OROCLS_CORELIB_PROPERTIES_MARSHALLING_DRIVER "CPFMarshaller") SET(ORODAT_CORELIB_PROPERTIES_DEMARSHALLING_INCLUDE "\"marsh/TinyDemarshaller.hpp\"") SET(OROCLS_CORELIB_PROPERTIES_DEMARSHALLING_DRIVER "TinyDemarshaller") -ENDIF ( XERCES AND XERCES_HEADERS ) +ENDIF(Xerces_FOUND) SET( OROCOS_TARGET gnulinux CACHE STRING "The Operating System target. One of [lxrt gnulinux xenomai macosx]") STRING(TOUPPER ${OROCOS_TARGET} OROCOS_TARGET_CAP) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ecec4cf33..758d0eebb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -75,9 +75,9 @@ GLOBAL_ADD_INCLUDE( rtt rtt-config.h) GLOBAL_ADD_SRC( ${CPPS}) IF (ENABLE_MARSHALLING) - IF (XERCES AND NOT OS_NOEXCEPTIONS) + IF (Xerces_FOUND AND NOT OS_NOEXCEPTIONS) SET(RTT_LINKFLAGS "${RTT_LINKFLAGS} -lxerces-c" CACHE INTERNAL "") - ENDIF(XERCES AND NOT OS_NOEXCEPTIONS) + ENDIF(Xerces_FOUND AND NOT OS_NOEXCEPTIONS) ENDIF (ENABLE_MARSHALLING) ADD_SUBDIRECTORY( marsh ) diff --git a/src/marsh/CMakeLists.txt b/src/marsh/CMakeLists.txt index e22fa80e9..a59c41820 100644 --- a/src/marsh/CMakeLists.txt +++ b/src/marsh/CMakeLists.txt @@ -10,13 +10,13 @@ IF (ENABLE_MARSHALLING) ) GLOBAL_ADD_SRC( marsh/CPFDTD.cpp marsh/CPFMarshaller.cpp) - IF (XERCES AND NOT OS_NOEXCEPTIONS) + IF (Xerces_FOUND AND NOT OS_NOEXCEPTIONS) GLOBAL_ADD_INCLUDE( rtt/marsh CPFDemarshaller.hpp) GLOBAL_ADD_SRC( marsh/CPFDemarshaller.cpp ) # This doesn't help anything: SET(RTT_LINKFLAGS "${RTT_LINKFLAGS} -lxerces-c" CACHE INTERNAL "") - ELSE (XERCES AND NOT OS_NOEXCEPTIONS) + ELSE (Xerces_FOUND AND NOT OS_NOEXCEPTIONS) GLOBAL_ADD_INCLUDE( rtt/marsh TinyDemarshaller.hpp ) GLOBAL_ADD_SRC( marsh/TinyDemarshaller.cpp marsh/tinyxml.cpp marsh/tinyxmlparser.cpp marsh/tinyxmlerror.cpp marsh/tinystr.cpp ) - ENDIF (XERCES AND NOT OS_NOEXCEPTIONS) + ENDIF (Xerces_FOUND AND NOT OS_NOEXCEPTIONS) ENDIF(ENABLE_MARSHALLING)