Skip to content

Commit

Permalink
Apply patch from Adolfo Rodriguez to fix Boost/Xerces detection and a…
Browse files Browse the repository at this point in the history
…dd LibFindMacros
  • Loading branch information
Peter Soetens committed Jun 3, 2009
1 parent ba60963 commit aa071ef
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 41 deletions.
49 changes: 49 additions & 0 deletions config/FindXerces.cmake
Original file line number Diff line number Diff line change
@@ -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)
101 changes: 101 additions & 0 deletions config/LibFindMacros.cmake
Original file line number Diff line number Diff line change
@@ -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)

62 changes: 26 additions & 36 deletions config/check_depend.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
Expand Down
6 changes: 3 additions & 3 deletions src/marsh/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit aa071ef

Please sign in to comment.