aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArseny Kapoulkine <arseny.kapoulkine@gmail.com>2020-05-02 09:36:58 -0700
committerGitHub <noreply@github.com>2020-05-02 09:36:58 -0700
commit285776354d4427c75f9efc7869a3175bcdbf7c82 (patch)
tree185a0bcd8e2733d13921cdf9b35dfa14079cb20b
parentef9cafa9ceda1725ce55e320e73e8bbbf2ce409c (diff)
parentd272f110730b353f60f45d8422f18d445f55f769 (diff)
downloadpugixml-285776354d4427c75f9efc7869a3175bcdbf7c82.zip
pugixml-285776354d4427c75f9efc7869a3175bcdbf7c82.tar.gz
pugixml-285776354d4427c75f9efc7869a3175bcdbf7c82.tar.bz2
Merge pull request #349 from KyleFromKitware/cmake-improvements
Various CMake improvements
-rw-r--r--CMakeLists.txt161
1 files changed, 83 insertions, 78 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d02a01b..a0254d8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,24 +64,63 @@ if (CMAKE_VERSION VERSION_LESS 3.15)
set(msvc-rt-mt-static $<${msvc-rt-mt-static}:-MT>)
endif()
-set(build-shared $<BOOL:${BUILD_SHARED_LIBS}>)
-set(build-both $<BOOL:${BUILD_SHARED_AND_STATIC_LIBS}>)
set(versioned-dir $<$<BOOL:${USE_VERSIONED_LIBDIR}>:/pugixml-${PROJECT_VERSION}>)
-add_library(pugixml) # Auto selects static or shared based on BUILD_SHARED_LIBS
-add_library(pugixml-shared SHARED)
-add_library(pugixml-static STATIC)
+set(libs)
-add_library(pugixml::pugixml ALIAS pugixml)
-add_library(pugixml::shared ALIAS pugixml-shared)
-add_library(pugixml::static ALIAS pugixml-static)
+if (BUILD_SHARED_LIBS OR BUILD_SHARED_AND_STATIC_LIBS)
+ add_library(pugixml-shared SHARED
+ ${PROJECT_SOURCE_DIR}/scripts/pugixml_dll.rc
+ ${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
+ add_library(pugixml::shared ALIAS pugixml-shared)
+ list(APPEND libs pugixml-shared)
+
+ set_property(TARGET pugixml-shared PROPERTY EXPORT_NAME shared)
+ target_include_directories(pugixml-shared
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
+ target_compile_definitions(pugixml-shared
+ PRIVATE
+ $<$<CXX_COMPILER_ID:MSVC>:PUGIXML_API=__declspec\(dllexport\)>)
+ target_compile_options(pugixml-shared
+ PRIVATE
+ ${msvc-rt-mtd-shared}
+ ${msvc-rt-mtd-static}
+ ${msvc-rt-mt-shared}
+ ${msvc-rt-mt-static})
+endif()
-# This means you can use pugixml::shared when a `find_package(pugixml CONFIG)`
-# is called. This keeps it consistent with the aliases we provide.
-set_property(TARGET pugixml-shared PROPERTY EXPORT_NAME shared)
-set_property(TARGET pugixml-static PROPERTY EXPORT_NAME static)
+if (NOT BUILD_SHARED_LIBS OR BUILD_SHARED_AND_STATIC_LIBS)
+ add_library(pugixml-static STATIC
+ ${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
+ add_library(pugixml::static ALIAS pugixml-static)
+ list(APPEND libs pugixml-static)
+
+ set_property(TARGET pugixml-static PROPERTY EXPORT_NAME static)
+ target_include_directories(pugixml-static
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
+ target_compile_definitions(pugixml-static
+ PRIVATE
+ $<$<CXX_COMPILER_ID:MSVC>:PUGIXML_API=__declspec\(dllexport\)>)
+ target_compile_options(pugixml-static
+ PRIVATE
+ ${msvc-rt-mtd-shared}
+ ${msvc-rt-mtd-static}
+ ${msvc-rt-mt-shared}
+ ${msvc-rt-mt-static})
+endif()
-set_target_properties(pugixml-shared pugixml-static pugixml
+if (BUILD_SHARED_LIBS)
+ set(pugixml-alias pugixml-shared)
+else()
+ set(pugixml-alias pugixml-static)
+endif()
+add_library(pugixml INTERFACE)
+target_link_libraries(pugixml INTERFACE ${pugixml-alias})
+add_library(pugixml::pugixml ALIAS pugixml)
+
+set_target_properties(${libs}
PROPERTIES
MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY}
EXCLUDE_FROM_ALL ON
@@ -90,63 +129,10 @@ set_target_properties(pugixml-shared pugixml-static pugixml
VERSION ${PROJECT_VERSION}
OUTPUT_NAME pugixml)
-# XXX: EXCLUDE_FROM_ALL cannot be set via a generator expression! :(
-if (BUILD_SHARED_AND_STATIC_LIBS)
- set_target_properties(pugixml-shared pugixml-static
- PROPERTIES
- EXCLUDE_FROM_ALL OFF)
- set(install-targets pugixml-shared pugixml-static)
-else()
- set_target_properties(pugixml
- PROPERTIES
- EXCLUDE_FROM_ALL OFF)
- set(install-targets pugixml)
-endif()
-
-target_sources(pugixml-shared
- PRIVATE
- $<${build-shared}:${PROJECT_SOURCE_DIR}/scripts/pugixml_dll.rc>
- ${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
-target_sources(pugixml-static
- PRIVATE
- ${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
-target_sources(pugixml
- PRIVATE
- $<${build-shared}:${PROJECT_SOURCE_DIR}/scripts/pugixml_dll.rc>
- ${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
-
-# XXX: INSTALL_INTERFACE is not used here so that INCLUDES DESTINATION can work
-# correctly if USE_VERSIONED_LIBDIR is set. $<INSTALL_INTERFACE> can't expand
-# generator expressions otherwise.
-target_include_directories(pugixml-shared
- PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
-target_include_directories(pugixml-static
- PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
-target_include_directories(pugixml
- PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
-
-target_compile_definitions(pugixml-shared
- PRIVATE
- $<$<CXX_COMPILER_ID:MSVC>:PUGIXML_API=__declspec\(dllexport\)>)
-target_compile_definitions(pugixml
- PRIVATE
- $<$<CXX_COMPILER_ID:MSVC>:PUGIXML_API=__declspec\(dllexport\)>)
-
-target_compile_options(pugixml-shared
- PRIVATE
- ${msvc-rt-mtd-shared}
- ${msvc-rt-mtd-static}
- ${msvc-rt-mt-shared}
- ${msvc-rt-mt-static})
-target_compile_options(pugixml
- PRIVATE
- ${msvc-rt-mtd-shared}
- ${msvc-rt-mtd-static}
- ${msvc-rt-mt-shared}
- ${msvc-rt-mt-static})
+set_target_properties(${libs}
+ PROPERTIES
+ EXCLUDE_FROM_ALL OFF)
+set(install-targets pugixml ${libs})
configure_package_config_file(
"${PROJECT_SOURCE_DIR}/scripts/pugixml-config.cmake.in"
@@ -161,31 +147,50 @@ write_basic_package_version_file(
configure_file(scripts/pugixml.pc.in pugixml.pc @ONLY)
+if (NOT DEFINED PUGIXML_RUNTIME_COMPONENT)
+ set(PUGIXML_RUNTIME_COMPONENT Runtime)
+endif()
+
+if (NOT DEFINED PUGIXML_LIBRARY_COMPONENT)
+ set(PUGIXML_LIBRARY_COMPONENT Library)
+endif()
+
+if (NOT DEFINED PUGIXML_DEVELOPMENT_COMPONENT)
+ set(PUGIXML_DEVELOPMENT_COMPONENT Development)
+endif()
+
+set(namelink-component)
+if (NOT CMAKE_VERSION VERSION_LESS 3.12)
+ set(namelink-component NAMELINK_COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT})
+endif()
install(TARGETS ${install-targets}
EXPORT pugixml-targets
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${PUGIXML_RUNTIME_COMPONENT}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${PUGIXML_LIBRARY_COMPONENT} ${namelink-component}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir})
install(EXPORT pugixml-targets
NAMESPACE pugixml::
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml)
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT})
+
+export(EXPORT pugixml-targets
+ NAMESPACE pugixml::)
install(FILES
"${PROJECT_BINARY_DIR}/pugixml-config-version.cmake"
"${PROJECT_BINARY_DIR}/pugixml-config.cmake"
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml)
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT})
install(FILES ${PROJECT_BINARY_DIR}/pugixml.pc
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT})
install(
FILES
"${PROJECT_SOURCE_DIR}/src/pugiconfig.hpp"
"${PROJECT_SOURCE_DIR}/src/pugixml.hpp"
DESTINATION
- ${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir})
+ ${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir} COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT})
if (BUILD_TESTS)
set(fuzz-pattern "tests/fuzz_*.cpp")
@@ -208,5 +213,5 @@ if (BUILD_TESTS)
add_dependencies(check pugixml-check)
target_link_libraries(pugixml-check
PRIVATE
- $<IF:${build-both},pugixml::static,pugixml::pugixml>)
+ pugixml::pugixml)
endif()