From 5dcc833b28eecc95486852f032a54edc64f76eec Mon Sep 17 00:00:00 2001 From: Roger Leigh Date: Wed, 18 Nov 2015 16:45:54 +0000 Subject: [PATCH] FindXercesC: Add imported targets and unit test --- .../dev/FindXercesC-imported-targets.rst | 4 ++ Modules/FindXercesC.cmake | 67 ++++++++++++++++--- Tests/CMakeLists.txt | 4 ++ Tests/FindXercesC/CMakeLists.txt | 10 +++ Tests/FindXercesC/Test/CMakeLists.txt | 17 +++++ Tests/FindXercesC/Test/main.cxx | 7 ++ 6 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 Help/release/dev/FindXercesC-imported-targets.rst create mode 100644 Tests/FindXercesC/CMakeLists.txt create mode 100644 Tests/FindXercesC/Test/CMakeLists.txt create mode 100644 Tests/FindXercesC/Test/main.cxx diff --git a/Help/release/dev/FindXercesC-imported-targets.rst b/Help/release/dev/FindXercesC-imported-targets.rst new file mode 100644 index 000000000..69cec5c4d --- /dev/null +++ b/Help/release/dev/FindXercesC-imported-targets.rst @@ -0,0 +1,4 @@ +FindXercesC-imported-targets +---------------------------- + +* The :module:`FindXercesC` module now provides imported targets. diff --git a/Modules/FindXercesC.cmake b/Modules/FindXercesC.cmake index cf84826a7..a4b80e512 100644 --- a/Modules/FindXercesC.cmake +++ b/Modules/FindXercesC.cmake @@ -4,23 +4,42 @@ # # Find the Apache Xerces-C++ validating XML parser headers and libraries. # -# This module reports information about the Xerces installation in -# several variables. General variables:: +# Imported targets +# ^^^^^^^^^^^^^^^^ # -# XercesC_FOUND - true if the Xerces headers and libraries were found -# XercesC_VERSION - Xerces release version -# XercesC_INCLUDE_DIRS - the directory containing the Xerces headers -# XercesC_LIBRARIES - Xerces libraries to be linked +# This module defines the following :prop_tgt:`IMPORTED` targets: # -# The following cache variables may also be set:: +# ``XercesC::XercesC`` +# The Xerces-C++ ``xerces-c`` library, if found. # -# XercesC_INCLUDE_DIR - the directory containing the Xerces headers -# XercesC_LIBRARY - the Xerces library +# Result variables +# ^^^^^^^^^^^^^^^^ +# +# This module will set the following variables in your project: +# +# ``XercesC_FOUND`` +# true if the Xerces headers and libraries were found +# ``XercesC_VERSION`` +# Xerces release version +# ``XercesC_INCLUDE_DIRS`` +# the directory containing the Xerces headers +# ``XercesC_LIBRARIES`` +# Xerces libraries to be linked +# +# Cache variables +# ^^^^^^^^^^^^^^^ +# +# The following cache variables may also be set: +# +# ``XercesC_INCLUDE_DIR`` +# the directory containing the Xerces headers +# ``XercesC_LIBRARY`` +# the Xerces library # Written by Roger Leigh #============================================================================= -# Copyright 2014 University of Dundee +# Copyright 2014-2015 University of Dundee # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. @@ -90,4 +109,32 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(XercesC if(XercesC_FOUND) set(XercesC_INCLUDE_DIRS "${XercesC_INCLUDE_DIR}") set(XercesC_LIBRARIES "${XercesC_LIBRARY}") + + # For header-only libraries + if(NOT TARGET XercesC::XercesC) + add_library(XercesC::XercesC UNKNOWN IMPORTED) + if(XercesC_INCLUDE_DIRS) + set_target_properties(XercesC::XercesC PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${XercesC_INCLUDE_DIRS}") + endif() + if(EXISTS "${XercesC_LIBRARY}") + set_target_properties(XercesC::XercesC PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${XercesC_LIBRARY}") + endif() + if(EXISTS "${XercesC_LIBRARY_DEBUG}") + set_property(TARGET XercesC::XercesC APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(XercesC::XercesC PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX" + IMPORTED_LOCATION_DEBUG "${XercesC_LIBRARY_DEBUG}") + endif() + if(EXISTS "${XercesC_LIBRARY_RELEASE}") + set_property(TARGET XercesC::XercesC APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(XercesC::XercesC PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" + IMPORTED_LOCATION_RELEASE "${XercesC_LIBRARY_RELEASE}") + endif() + endif() endif() diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index f381758c2..442f23f90 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1367,6 +1367,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release add_subdirectory(FindOpenSSL) endif() + if(CMake_TEST_FindXercesC) + add_subdirectory(FindXercesC) + endif() + add_subdirectory(FindThreads) # Matlab module diff --git a/Tests/FindXercesC/CMakeLists.txt b/Tests/FindXercesC/CMakeLists.txt new file mode 100644 index 000000000..633f613e8 --- /dev/null +++ b/Tests/FindXercesC/CMakeLists.txt @@ -0,0 +1,10 @@ +add_test(NAME FindXercesC.Test COMMAND + ${CMAKE_CTEST_COMMAND} -C $ + --build-and-test + "${CMake_SOURCE_DIR}/Tests/FindXercesC/Test" + "${CMake_BINARY_DIR}/Tests/FindXercesC/Test" + ${build_generator_args} + --build-project TestFindXercesC + --build-options ${build_options} + --test-command ${CMAKE_CTEST_COMMAND} -V -C $ + ) diff --git a/Tests/FindXercesC/Test/CMakeLists.txt b/Tests/FindXercesC/Test/CMakeLists.txt new file mode 100644 index 000000000..8e7767cfd --- /dev/null +++ b/Tests/FindXercesC/Test/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.1) +project(TestFindXercesC CXX) +include(CTest) + +# CMake does not actually provide FindXercesC publicly. +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../Source/Modules) + +find_package(XercesC REQUIRED) + +add_executable(test_xercesc_tgt main.cxx) +target_link_libraries(test_xercesc_tgt XercesC::XercesC) +add_test(NAME test_xercesc_tgt COMMAND test_xercesc_tgt) + +add_executable(test_xercesc_var main.cxx) +target_include_directories(test_xercesc_var PRIVATE ${XercesC_INCLUDE_DIRS}) +target_link_libraries(test_xercesc_var PRIVATE ${XercesC_LIBRARIES}) +add_test(NAME test_xercesc_var COMMAND test_xercesc_var) diff --git a/Tests/FindXercesC/Test/main.cxx b/Tests/FindXercesC/Test/main.cxx new file mode 100644 index 000000000..1794fa638 --- /dev/null +++ b/Tests/FindXercesC/Test/main.cxx @@ -0,0 +1,7 @@ +#include + +int main() +{ + xercesc::XMLPlatformUtils::Initialize(); + xercesc::XMLPlatformUtils::Terminate(); +}