Merge pull request #302 from slurps-mad-rips/modern-cmake
Modernize CMake
This commit is contained in:
commit
fdd618f13a
294
CMakeLists.txt
294
CMakeLists.txt
@ -1,116 +1,210 @@
|
|||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.4)
|
||||||
|
project(pugixml VERSION 1.10 LANGUAGES CXX)
|
||||||
|
|
||||||
project(pugixml VERSION 1.10)
|
include(CMakePackageConfigHelpers)
|
||||||
|
include(CMakeDependentOption)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
include(CTest)
|
||||||
|
|
||||||
|
|
||||||
|
cmake_dependent_option(USE_VERSIONED_LIBDIR
|
||||||
|
"Use a private subdirectory to install the headers and libraries" OFF
|
||||||
|
"CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
|
||||||
|
|
||||||
|
cmake_dependent_option(USE_POSTFIX
|
||||||
|
"Use separate postfix for each configuration to make sure you can install multiple build outputs" OFF
|
||||||
|
"CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
|
||||||
|
|
||||||
|
cmake_dependent_option(STATIC_CRT
|
||||||
|
"Use static MSVC RT libraries" OFF
|
||||||
|
"MSVC" OFF)
|
||||||
|
|
||||||
|
cmake_dependent_option(BUILD_TESTS
|
||||||
|
"Build pugixml tests" OFF
|
||||||
|
"BUILD_TESTING;CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF)
|
||||||
|
|
||||||
option(BUILD_SHARED_AND_STATIC_LIBS "Build both shared and static libraries" OFF)
|
option(BUILD_SHARED_AND_STATIC_LIBS "Build both shared and static libraries" OFF)
|
||||||
option(BUILD_SHARED_LIBS "Build shared instead of static library" OFF)
|
# Technically not needed for this file. This is builtin.
|
||||||
option(BUILD_TESTS "Build tests" OFF)
|
option(BUILD_SHARED_LIBS "Build shared instead of static library" OFF)
|
||||||
option(USE_VERSIONED_LIBDIR "Use a private subdirectory to install the headers and libs" OFF)
|
|
||||||
option(USE_POSTFIX "Use separate postfix for each configuration to make sure you can install multiple build outputs" OFF)
|
|
||||||
|
|
||||||
set(BUILD_DEFINES "" CACHE STRING "Build defines")
|
set(BUILD_DEFINES CACHE STRING "Build defines")
|
||||||
|
|
||||||
if(MSVC)
|
# This is used to backport a CMake 3.15 feature, but is also forwards compatible
|
||||||
option(STATIC_CRT "Use static CRT libraries" OFF)
|
if (NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
|
||||||
|
set(CMAKE_MSVC_RUNTIME_LIBRARY
|
||||||
# Rewrite command line flags to use /MT if necessary
|
MultiThreaded$<$<CONFIG:Debug>:Debug>$<$<NOT:$<BOOL:${STATIC_CRT}>>:DLL>)
|
||||||
if(STATIC_CRT)
|
|
||||||
foreach(flag_var
|
|
||||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
|
||||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
|
||||||
if(${flag_var} MATCHES "/MD")
|
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
|
||||||
endif(${flag_var} MATCHES "/MD")
|
|
||||||
endforeach(flag_var)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Pre-defines standard install locations on *nix systems.
|
if (NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
|
||||||
include(GNUInstallDirs)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
mark_as_advanced(CLEAR CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR)
|
|
||||||
|
|
||||||
set(HEADERS src/pugixml.hpp src/pugiconfig.hpp)
|
|
||||||
set(SOURCES src/pugixml.cpp)
|
|
||||||
|
|
||||||
if(BUILD_SHARED_LIBS AND MSVC)
|
|
||||||
set(PUGIXML_WINDLL_SRCS scripts/pugixml_dll.rc)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(DEFINED BUILD_DEFINES)
|
if (NOT DEFINED CMAKE_CXX_STANDARD)
|
||||||
foreach(DEFINE ${BUILD_DEFINES})
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
add_definitions("-D" ${DEFINE})
|
|
||||||
endforeach()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(BUILD_SHARED_AND_STATIC_LIBS)
|
if (USE_POSTFIX)
|
||||||
set(LIBRARY pugixml-static pugixml-shared)
|
set(CMAKE_RELWITHDEBINFO_POSTFIX _r)
|
||||||
|
set(CMAKE_MINSIZEREL_POSTFIX _m)
|
||||||
|
set(CMAKE_DEBUG_POSTFIX _d)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_VERSION VERSION_LESS 3.15)
|
||||||
|
set(msvc-rt $<TARGET_PROPERTY:MSVC_RUNTIME_LIBRARY>)
|
||||||
|
|
||||||
|
set(msvc-rt-mtd-shared $<STREQUAL:${msvc-rt},MultiThreadedDebugDLL>)
|
||||||
|
set(msvc-rt-mtd-static $<STREQUAL:${msvc-rt},MultiThreadedDebug>)
|
||||||
|
set(msvc-rt-mt-shared $<STREQUAL:${msvc-rt},MultiThreadedDLL>)
|
||||||
|
set(msvc-rt-mt-static $<STREQUAL:${msvc-rt},MultiThreaded>)
|
||||||
|
unset(msvc-rt)
|
||||||
|
|
||||||
|
set(msvc-rt-mtd-shared $<${msvc-rt-mtd-shared}:-MDd>)
|
||||||
|
set(msvc-rt-mtd-static $<${msvc-rt-mtd-static}:-MTd>)
|
||||||
|
set(msvc-rt-mt-shared $<${msvc-rt-mt-shared}:-MD>)
|
||||||
|
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)
|
||||||
|
|
||||||
|
add_library(pugixml::pugixml ALIAS pugixml)
|
||||||
|
add_library(pugixml::shared ALIAS pugixml-shared)
|
||||||
|
add_library(pugixml::static ALIAS pugixml-static)
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
set_target_properties(pugixml-shared pugixml-static pugixml
|
||||||
|
PROPERTIES
|
||||||
|
MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY}
|
||||||
|
EXCLUDE_FROM_ALL ON
|
||||||
|
SOVERSION ${PROJECT_VERSION_MAJOR}
|
||||||
|
VERSION ${PROJECT_VERSION})
|
||||||
|
|
||||||
|
# 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()
|
else()
|
||||||
set(LIBRARY pugixml)
|
set_target_properties(pugixml
|
||||||
|
PROPERTIES
|
||||||
|
EXCLUDE_FROM_ALL OFF)
|
||||||
|
set(install-targets pugixml)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(BUILD_SHARED_AND_STATIC_LIBS)
|
target_sources(pugixml-shared
|
||||||
add_library(pugixml-static STATIC ${HEADERS} ${SOURCES})
|
PRIVATE
|
||||||
add_library(pugixml-shared SHARED ${HEADERS} ${SOURCES} ${PUGIXML_WINDLL_SRCS})
|
$<${build-shared}:${PROJECT_SOURCE_DIR}/scripts/pugixml_dll.rc>
|
||||||
else()
|
${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
|
||||||
if(BUILD_SHARED_LIBS)
|
target_sources(pugixml-static
|
||||||
add_library(pugixml SHARED ${HEADERS} ${SOURCES} ${PUGIXML_WINDLL_SRCS})
|
PRIVATE
|
||||||
else()
|
${PROJECT_SOURCE_DIR}/src/pugixml.cpp)
|
||||||
add_library(pugixml STATIC ${HEADERS} ${SOURCES})
|
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})
|
||||||
|
|
||||||
|
configure_package_config_file(
|
||||||
|
"${PROJECT_SOURCE_DIR}/scripts/pugixml-config.cmake.in"
|
||||||
|
"${PROJECT_BINARY_DIR}/pugixml-config.cmake"
|
||||||
|
INSTALL_DESTINATION ${CMAKE_INSTALL_DATADIR}
|
||||||
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO
|
||||||
|
NO_SET_AND_CHECK_MACRO)
|
||||||
|
|
||||||
|
write_basic_package_version_file(
|
||||||
|
"${PROJECT_BINARY_DIR}/pugixml-config-version.cmake"
|
||||||
|
COMPATIBILITY SameMajorVersion)
|
||||||
|
|
||||||
|
configure_file(scripts/pugixml.pc.in pugixml.pc @ONLY)
|
||||||
|
|
||||||
|
install(TARGETS ${install-targets}
|
||||||
|
EXPORT pugixml-targets
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir})
|
||||||
|
|
||||||
|
install(EXPORT pugixml-targets
|
||||||
|
NAMESPACE pugixml::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/pugixml)
|
||||||
|
|
||||||
|
install(FILES
|
||||||
|
"${PROJECT_BINARY_DIR}/pugixml-config-version.cmake"
|
||||||
|
"${PROJECT_BINARY_DIR}/pugixml-config.cmake"
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/pugixml)
|
||||||
|
|
||||||
|
install(FILES ${PROJECT_BINARY_DIR}/pugixml.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/pkgconfig)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
"${PROJECT_SOURCE_DIR}/src/pugiconfig.hpp"
|
||||||
|
"${PROJECT_SOURCE_DIR}/src/pugixml.hpp"
|
||||||
|
DESTINATION
|
||||||
|
${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir})
|
||||||
|
|
||||||
|
if (BUILD_TESTS)
|
||||||
|
set(fuzz-pattern "tests/fuzz_*.cpp")
|
||||||
|
set(test-pattern "tests/*.cpp")
|
||||||
|
if (CMAKE_VERSION VERSION_GREATER 3.11)
|
||||||
|
list(INSERT fuzz-pattern 0 CONFIGURE_DEPENDS)
|
||||||
|
list(INSERT test-pattern 0 CONFIGURE_DEPENDS)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
file(GLOB test-sources ${test-pattern})
|
||||||
|
file(GLOB fuzz-sources ${fuzz-pattern})
|
||||||
# Export symbols for shared library builds
|
list(REMOVE_ITEM test-sources ${fuzz-sources})
|
||||||
if(BUILD_SHARED_AND_STATIC_LIBS AND MSVC)
|
|
||||||
target_compile_definitions(pugixml-shared PRIVATE "PUGIXML_API=__declspec(dllexport)")
|
add_custom_target(check
|
||||||
endif()
|
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
|
||||||
|
|
||||||
if(BUILD_SHARED_LIBS AND MSVC)
|
add_executable(pugixml-check ${test-sources})
|
||||||
target_compile_definitions(pugixml PRIVATE "PUGIXML_API=__declspec(dllexport)")
|
add_test(NAME pugixml::test
|
||||||
endif()
|
COMMAND pugixml-check
|
||||||
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
|
||||||
if(USE_VERSIONED_LIBDIR)
|
add_dependencies(check pugixml-check)
|
||||||
# Install library into its own directory under LIBDIR
|
target_link_libraries(pugixml-check
|
||||||
set(INSTALL_SUFFIX /pugixml-${pugixml_VERSION})
|
PRIVATE
|
||||||
endif()
|
$<IF:${build-both},pugixml::static,pugixml::pugixml>)
|
||||||
|
|
||||||
foreach(TARGET ${LIBRARY})
|
|
||||||
# Enable C++11 long long for compilers that are capable of it
|
|
||||||
if(NOT ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} STRLESS 3.1 AND ";${CMAKE_CXX_COMPILE_FEATURES};" MATCHES ";cxx_long_long_type;")
|
|
||||||
target_compile_features(${TARGET} PUBLIC cxx_long_long_type)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(${TARGET} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
|
|
||||||
|
|
||||||
target_include_directories(${TARGET} PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src>
|
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}${INSTALL_SUFFIX}>)
|
|
||||||
|
|
||||||
if(USE_POSTFIX)
|
|
||||||
set_target_properties(${TARGET} PROPERTIES DEBUG_POSTFIX "_d" MINSIZEREL_POSTFIX "_m" RELWITHDEBINFO_POSTFIX "_r")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
install(TARGETS ${LIBRARY} EXPORT pugixml-config
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${INSTALL_SUFFIX}
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${INSTALL_SUFFIX}
|
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
||||||
|
|
||||||
install(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}${INSTALL_SUFFIX})
|
|
||||||
install(EXPORT pugixml-config DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml)
|
|
||||||
|
|
||||||
configure_file(scripts/pugixml.pc.in ${PROJECT_BINARY_DIR}/pugixml.pc @ONLY)
|
|
||||||
install(FILES ${PROJECT_BINARY_DIR}/pugixml.pc DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig)
|
|
||||||
|
|
||||||
if(BUILD_TESTS)
|
|
||||||
file(GLOB TEST_SOURCES tests/*.cpp)
|
|
||||||
file(GLOB FUZZ_SOURCES tests/fuzz_*.cpp)
|
|
||||||
list(REMOVE_ITEM TEST_SOURCES ${FUZZ_SOURCES})
|
|
||||||
|
|
||||||
add_executable(check ${TEST_SOURCES})
|
|
||||||
if(BUILD_SHARED_AND_STATIC_LIBS)
|
|
||||||
target_link_libraries(check pugixml-static)
|
|
||||||
else()
|
|
||||||
target_link_libraries(check pugixml)
|
|
||||||
endif()
|
|
||||||
add_custom_command(TARGET check POST_BUILD COMMAND check WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
3
scripts/pugixml-config.cmake.in
Normal file
3
scripts/pugixml-config.cmake.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/pugixml-targets.cmake")
|
||||||
Loading…
Reference in New Issue
Block a user