diff options
author | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2020-05-02 09:36:58 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-02 09:36:58 -0700 |
commit | 285776354d4427c75f9efc7869a3175bcdbf7c82 (patch) | |
tree | 185a0bcd8e2733d13921cdf9b35dfa14079cb20b | |
parent | ef9cafa9ceda1725ce55e320e73e8bbbf2ce409c (diff) | |
parent | d272f110730b353f60f45d8422f18d445f55f769 (diff) | |
download | pugixml-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.txt | 161 |
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() |