Mercurial > minori
comparison dep/pugixml/CMakeLists.txt @ 343:1faa72660932
*: transfer back to cmake from autotools
autotools just made lots of things more complicated than
they should have and many things broke (i.e. translations)
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Thu, 20 Jun 2024 05:56:06 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 342:adb79bdde329 | 343:1faa72660932 |
|---|---|
| 1 cmake_minimum_required(VERSION 3.5) | |
| 2 | |
| 3 # Policy configuration; this *MUST* be specified before project is defined | |
| 4 if(POLICY CMP0091) | |
| 5 cmake_policy(SET CMP0091 NEW) # Enables use of MSVC_RUNTIME_LIBRARY | |
| 6 endif() | |
| 7 | |
| 8 project(pugixml VERSION 1.14 LANGUAGES CXX) | |
| 9 | |
| 10 include(CMakePackageConfigHelpers) | |
| 11 include(CMakeDependentOption) | |
| 12 include(GNUInstallDirs) | |
| 13 | |
| 14 cmake_dependent_option(PUGIXML_USE_VERSIONED_LIBDIR | |
| 15 "Use a private subdirectory to install the headers and libraries" OFF | |
| 16 "CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) | |
| 17 | |
| 18 cmake_dependent_option(PUGIXML_USE_POSTFIX | |
| 19 "Use separate postfix for each configuration to make sure you can install multiple build outputs" OFF | |
| 20 "CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) | |
| 21 | |
| 22 cmake_dependent_option(PUGIXML_STATIC_CRT | |
| 23 "Use static MSVC RT libraries" OFF | |
| 24 "MSVC" OFF) | |
| 25 | |
| 26 cmake_dependent_option(PUGIXML_BUILD_TESTS | |
| 27 "Build pugixml tests" OFF | |
| 28 "CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) | |
| 29 | |
| 30 # Custom build defines | |
| 31 set(PUGIXML_BUILD_DEFINES CACHE STRING "Build defines for custom options") | |
| 32 separate_arguments(PUGIXML_BUILD_DEFINES) | |
| 33 | |
| 34 # Technically not needed for this file. This is builtin CMAKE global variable. | |
| 35 option(BUILD_SHARED_LIBS "Build shared instead of static library" OFF) | |
| 36 | |
| 37 # Expose option to build PUGIXML as static as well when the global BUILD_SHARED_LIBS variable is set | |
| 38 cmake_dependent_option(PUGIXML_BUILD_SHARED_AND_STATIC_LIBS | |
| 39 "Build both shared and static libraries" OFF | |
| 40 "BUILD_SHARED_LIBS" OFF) | |
| 41 | |
| 42 # Expose options from the pugiconfig.hpp | |
| 43 option(PUGIXML_WCHAR_MODE "Enable wchar_t mode" OFF) | |
| 44 option(PUGIXML_COMPACT "Enable compact mode" OFF) | |
| 45 option(PUGIXML_INSTALL "Enable installation rules" ON) | |
| 46 | |
| 47 # Advanced options from pugiconfig.hpp | |
| 48 option(PUGIXML_NO_XPATH "Disable XPath" OFF) | |
| 49 option(PUGIXML_NO_STL "Disable STL" OFF) | |
| 50 option(PUGIXML_NO_EXCEPTIONS "Disable Exceptions" OFF) | |
| 51 mark_as_advanced(PUGIXML_NO_XPATH PUGIXML_NO_STL PUGIXML_NO_EXCEPTIONS) | |
| 52 | |
| 53 set(PUGIXML_PUBLIC_DEFINITIONS | |
| 54 $<$<BOOL:${PUGIXML_WCHAR_MODE}>:PUGIXML_WCHAR_MODE> | |
| 55 $<$<BOOL:${PUGIXML_COMPACT}>:PUGIXML_COMPACT> | |
| 56 $<$<BOOL:${PUGIXML_NO_XPATH}>:PUGIXML_NO_XPATH> | |
| 57 $<$<BOOL:${PUGIXML_NO_STL}>:PUGIXML_NO_STL> | |
| 58 $<$<BOOL:${PUGIXML_NO_EXCEPTIONS}>:PUGIXML_NO_EXCEPTIONS>) | |
| 59 | |
| 60 # This is used to backport a CMake 3.15 feature, but is also forwards compatible | |
| 61 if (NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) | |
| 62 set(CMAKE_MSVC_RUNTIME_LIBRARY | |
| 63 MultiThreaded$<$<CONFIG:Debug>:Debug>$<$<NOT:$<BOOL:${PUGIXML_STATIC_CRT}>>:DLL>) | |
| 64 endif() | |
| 65 | |
| 66 if (NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED) | |
| 67 set(CMAKE_CXX_STANDARD_REQUIRED ON) | |
| 68 endif() | |
| 69 | |
| 70 if (NOT DEFINED CMAKE_CXX_STANDARD) | |
| 71 set(CMAKE_CXX_STANDARD 11) | |
| 72 endif() | |
| 73 | |
| 74 if (PUGIXML_USE_POSTFIX) | |
| 75 set(CMAKE_RELWITHDEBINFO_POSTFIX _r) | |
| 76 set(CMAKE_MINSIZEREL_POSTFIX _m) | |
| 77 set(CMAKE_DEBUG_POSTFIX _d) | |
| 78 endif() | |
| 79 | |
| 80 if (CMAKE_VERSION VERSION_LESS 3.15) | |
| 81 set(msvc-rt $<TARGET_PROPERTY:MSVC_RUNTIME_LIBRARY>) | |
| 82 | |
| 83 set(msvc-rt-mtd-shared $<STREQUAL:${msvc-rt},MultiThreadedDebugDLL>) | |
| 84 set(msvc-rt-mtd-static $<STREQUAL:${msvc-rt},MultiThreadedDebug>) | |
| 85 set(msvc-rt-mt-shared $<STREQUAL:${msvc-rt},MultiThreadedDLL>) | |
| 86 set(msvc-rt-mt-static $<STREQUAL:${msvc-rt},MultiThreaded>) | |
| 87 unset(msvc-rt) | |
| 88 | |
| 89 set(msvc-rt-mtd-shared $<${msvc-rt-mtd-shared}:-MDd>) | |
| 90 set(msvc-rt-mtd-static $<${msvc-rt-mtd-static}:-MTd>) | |
| 91 set(msvc-rt-mt-shared $<${msvc-rt-mt-shared}:-MD>) | |
| 92 set(msvc-rt-mt-static $<${msvc-rt-mt-static}:-MT>) | |
| 93 endif() | |
| 94 | |
| 95 set(versioned-dir $<$<BOOL:${PUGIXML_USE_VERSIONED_LIBDIR}>:/pugixml-${PROJECT_VERSION}>) | |
| 96 | |
| 97 set(libs) | |
| 98 | |
| 99 if (BUILD_SHARED_LIBS) | |
| 100 add_library(pugixml-shared SHARED | |
| 101 ${PROJECT_SOURCE_DIR}/scripts/pugixml_dll.rc | |
| 102 ${PROJECT_SOURCE_DIR}/src/pugixml.cpp) | |
| 103 add_library(pugixml::shared ALIAS pugixml-shared) | |
| 104 list(APPEND libs pugixml-shared) | |
| 105 string(CONCAT pugixml.msvc $<OR: | |
| 106 $<STREQUAL:${CMAKE_CXX_COMPILER_FRONTEND_VARIANT},MSVC>, | |
| 107 $<CXX_COMPILER_ID:MSVC> | |
| 108 >) | |
| 109 | |
| 110 set_property(TARGET pugixml-shared PROPERTY EXPORT_NAME shared) | |
| 111 target_include_directories(pugixml-shared | |
| 112 PUBLIC | |
| 113 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>) | |
| 114 target_compile_definitions(pugixml-shared | |
| 115 PUBLIC | |
| 116 ${PUGIXML_BUILD_DEFINES} | |
| 117 ${PUGIXML_PUBLIC_DEFINITIONS} | |
| 118 PRIVATE | |
| 119 PUGIXML_API=$<IF:${pugixml.msvc},__declspec\(dllexport\),__attribute__\(\(visibility\("default"\)\)\)> | |
| 120 ) | |
| 121 target_compile_options(pugixml-shared | |
| 122 PRIVATE | |
| 123 ${msvc-rt-mtd-shared} | |
| 124 ${msvc-rt-mtd-static} | |
| 125 ${msvc-rt-mt-shared} | |
| 126 ${msvc-rt-mt-static}) | |
| 127 endif() | |
| 128 | |
| 129 if (NOT BUILD_SHARED_LIBS OR PUGIXML_BUILD_SHARED_AND_STATIC_LIBS) | |
| 130 add_library(pugixml-static STATIC | |
| 131 ${PROJECT_SOURCE_DIR}/src/pugixml.cpp) | |
| 132 add_library(pugixml::static ALIAS pugixml-static) | |
| 133 list(APPEND libs pugixml-static) | |
| 134 | |
| 135 set_property(TARGET pugixml-static PROPERTY EXPORT_NAME static) | |
| 136 target_include_directories(pugixml-static | |
| 137 PUBLIC | |
| 138 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>) | |
| 139 target_compile_definitions(pugixml-static | |
| 140 PUBLIC | |
| 141 ${PUGIXML_BUILD_DEFINES} | |
| 142 ${PUGIXML_PUBLIC_DEFINITIONS}) | |
| 143 target_compile_options(pugixml-static | |
| 144 PRIVATE | |
| 145 ${msvc-rt-mtd-shared} | |
| 146 ${msvc-rt-mtd-static} | |
| 147 ${msvc-rt-mt-shared} | |
| 148 ${msvc-rt-mt-static}) | |
| 149 endif() | |
| 150 | |
| 151 if (BUILD_SHARED_LIBS) | |
| 152 set(pugixml-alias pugixml-shared) | |
| 153 else() | |
| 154 set(pugixml-alias pugixml-static) | |
| 155 endif() | |
| 156 add_library(pugixml INTERFACE) | |
| 157 target_link_libraries(pugixml INTERFACE ${pugixml-alias}) | |
| 158 add_library(pugixml::pugixml ALIAS pugixml) | |
| 159 | |
| 160 set_target_properties(${libs} | |
| 161 PROPERTIES | |
| 162 MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY} | |
| 163 EXCLUDE_FROM_ALL ON | |
| 164 POSITION_INDEPENDENT_CODE ON | |
| 165 SOVERSION ${PROJECT_VERSION_MAJOR} | |
| 166 VERSION ${PROJECT_VERSION} | |
| 167 OUTPUT_NAME pugixml) | |
| 168 | |
| 169 set_target_properties(${libs} | |
| 170 PROPERTIES | |
| 171 EXCLUDE_FROM_ALL OFF) | |
| 172 set(install-targets pugixml ${libs}) | |
| 173 | |
| 174 configure_package_config_file( | |
| 175 "${PROJECT_SOURCE_DIR}/scripts/pugixml-config.cmake.in" | |
| 176 "${PROJECT_BINARY_DIR}/pugixml-config.cmake" | |
| 177 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR} | |
| 178 NO_CHECK_REQUIRED_COMPONENTS_MACRO | |
| 179 NO_SET_AND_CHECK_MACRO) | |
| 180 | |
| 181 write_basic_package_version_file( | |
| 182 "${PROJECT_BINARY_DIR}/pugixml-config-version.cmake" | |
| 183 COMPATIBILITY SameMajorVersion) | |
| 184 | |
| 185 if (PUGIXML_USE_POSTFIX) | |
| 186 if(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) | |
| 187 set(LIB_POSTFIX ${CMAKE_RELWITHDEBINFO_POSTFIX}) | |
| 188 elseif(CMAKE_BUILD_TYPE MATCHES MinSizeRel) | |
| 189 set(LIB_POSTFIX ${CMAKE_MINSIZEREL_POSTFIX}) | |
| 190 elseif(CMAKE_BUILD_TYPE MATCHES Debug) | |
| 191 set(LIB_POSTFIX ${CMAKE_DEBUG_POSTFIX}) | |
| 192 endif() | |
| 193 endif() | |
| 194 | |
| 195 # Handle both relative and absolute paths (e.g. NixOS) for a relocatable package | |
| 196 if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") | |
| 197 set(PUGIXML_PC_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}") | |
| 198 else() | |
| 199 set(PUGIXML_PC_INCLUDEDIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") | |
| 200 endif() | |
| 201 if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") | |
| 202 set(PUGIXML_PC_LIBDIR "${CMAKE_INSTALL_LIBDIR}") | |
| 203 else() | |
| 204 set(PUGIXML_PC_LIBDIR "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") | |
| 205 endif() | |
| 206 configure_file(scripts/pugixml.pc.in pugixml.pc @ONLY) | |
| 207 | |
| 208 export(TARGETS ${install-targets} | |
| 209 NAMESPACE pugixml:: | |
| 210 FILE pugixml-targets.cmake) | |
| 211 | |
| 212 if(PUGIXML_INSTALL) | |
| 213 if (NOT DEFINED PUGIXML_RUNTIME_COMPONENT) | |
| 214 set(PUGIXML_RUNTIME_COMPONENT Runtime) | |
| 215 endif() | |
| 216 | |
| 217 if (NOT DEFINED PUGIXML_LIBRARY_COMPONENT) | |
| 218 set(PUGIXML_LIBRARY_COMPONENT Library) | |
| 219 endif() | |
| 220 | |
| 221 if (NOT DEFINED PUGIXML_DEVELOPMENT_COMPONENT) | |
| 222 set(PUGIXML_DEVELOPMENT_COMPONENT Development) | |
| 223 endif() | |
| 224 | |
| 225 set(namelink-component) | |
| 226 if (NOT CMAKE_VERSION VERSION_LESS 3.12) | |
| 227 set(namelink-component NAMELINK_COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT}) | |
| 228 endif() | |
| 229 install(TARGETS ${install-targets} | |
| 230 EXPORT pugixml-targets | |
| 231 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${PUGIXML_RUNTIME_COMPONENT} | |
| 232 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${PUGIXML_LIBRARY_COMPONENT} ${namelink-component} | |
| 233 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT} | |
| 234 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir}) | |
| 235 | |
| 236 install(EXPORT pugixml-targets | |
| 237 NAMESPACE pugixml:: | |
| 238 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT}) | |
| 239 | |
| 240 install(FILES | |
| 241 "${PROJECT_BINARY_DIR}/pugixml-config-version.cmake" | |
| 242 "${PROJECT_BINARY_DIR}/pugixml-config.cmake" | |
| 243 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pugixml COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT}) | |
| 244 | |
| 245 install(FILES ${PROJECT_BINARY_DIR}/pugixml.pc | |
| 246 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT}) | |
| 247 | |
| 248 install( | |
| 249 FILES | |
| 250 "${PROJECT_SOURCE_DIR}/src/pugiconfig.hpp" | |
| 251 "${PROJECT_SOURCE_DIR}/src/pugixml.hpp" | |
| 252 DESTINATION | |
| 253 ${CMAKE_INSTALL_INCLUDEDIR}${versioned-dir} COMPONENT ${PUGIXML_DEVELOPMENT_COMPONENT}) | |
| 254 endif() | |
| 255 | |
| 256 if (PUGIXML_BUILD_TESTS) | |
| 257 include(CTest) | |
| 258 set(fuzz-pattern "tests/fuzz_*.cpp") | |
| 259 set(test-pattern "tests/*.cpp") | |
| 260 if (CMAKE_VERSION VERSION_GREATER 3.11) | |
| 261 list(INSERT fuzz-pattern 0 CONFIGURE_DEPENDS) | |
| 262 list(INSERT test-pattern 0 CONFIGURE_DEPENDS) | |
| 263 endif() | |
| 264 file(GLOB test-sources ${test-pattern}) | |
| 265 file(GLOB fuzz-sources ${fuzz-pattern}) | |
| 266 list(REMOVE_ITEM test-sources ${fuzz-sources}) | |
| 267 | |
| 268 add_custom_target(check | |
| 269 COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) | |
| 270 | |
| 271 add_executable(pugixml-check ${test-sources}) | |
| 272 add_test(NAME pugixml::test | |
| 273 COMMAND pugixml-check | |
| 274 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |
| 275 add_dependencies(check pugixml-check) | |
| 276 target_link_libraries(pugixml-check | |
| 277 PRIVATE | |
| 278 pugixml::pugixml) | |
| 279 endif() |
