1cmake_minimum_required(VERSION 3.18) 2 3file(READ "VERSION" VERSION) 4string(STRIP ${VERSION} VERSION) 5if(${VERSION} MATCHES [[([0-9]+)\.([0-9]+)\.([0-9]+)]]) 6 set(LIBXML_MAJOR_VERSION ${CMAKE_MATCH_1}) 7 set(LIBXML_MINOR_VERSION ${CMAKE_MATCH_2}) 8 set(LIBXML_MICRO_VERSION ${CMAKE_MATCH_3}) 9endif() 10 11project(libxml2 VERSION ${VERSION} LANGUAGES C) 12 13include(CheckCSourceCompiles) 14include(CheckFunctionExists) 15include(CheckIncludeFiles) 16include(CheckLibraryExists) 17include(CheckLinkerFlag) 18include(CheckStructHasMember) 19include(CheckSymbolExists) 20include(CMakeDependentOption) 21include(CMakePackageConfigHelpers) 22include(FindPkgConfig) 23include(GNUInstallDirs) 24 25option(BUILD_SHARED_LIBS "Build shared libraries" ON) 26set(LIBXML2_WITH_AUTOMATA ON) 27option(LIBXML2_WITH_CATALOG "Add the Catalog support" ON) 28option(LIBXML2_WITH_DEBUG "Add the debugging module" ON) 29set(LIBXML2_WITH_EXPR ON) 30option(LIBXML2_WITH_HTML "Add the HTML support" ON) 31option(LIBXML2_WITH_HTTP "Add the HTTP support" OFF) 32option(LIBXML2_WITH_ICONV "Add ICONV support" ON) 33option(LIBXML2_WITH_ICU "Add ICU support" OFF) 34option(LIBXML2_WITH_ISO8859X "Add ISO8859X support if no iconv" ON) 35option(LIBXML2_WITH_LEGACY "Add deprecated APIs for compatibility" OFF) 36option(LIBXML2_WITH_LZMA "Use liblzma" OFF) 37option(LIBXML2_WITH_MODULES "Add the dynamic modules support" ON) 38option(LIBXML2_WITH_OUTPUT "Add the serialization support" ON) 39option(LIBXML2_WITH_PATTERN "Add the xmlPattern selection interface" ON) 40option(LIBXML2_WITH_PROGRAMS "Build programs" ON) 41option(LIBXML2_WITH_PUSH "Add the PUSH parser interfaces" ON) 42option(LIBXML2_WITH_PYTHON "Build Python bindings" ON) 43option(LIBXML2_WITH_READLINE "readline support for xmllint shell" OFF) 44option(LIBXML2_WITH_REGEXPS "Add Regular Expressions support" ON) 45option(LIBXML2_WITH_SAX1 "Add the older SAX1 interface" ON) 46option(LIBXML2_WITH_TESTS "Build tests" ON) 47option(LIBXML2_WITH_THREADS "Add multithread support" ON) 48option(LIBXML2_WITH_TLS "Enable thread-local storage" OFF) 49set(LIBXML2_WITH_UNICODE ON) 50option(LIBXML2_WITH_VALID "Add the DTD validation support" ON) 51option(LIBXML2_WITH_XPATH "Add the XPATH support" ON) 52option(LIBXML2_WITH_ZLIB "Use libz" OFF) 53 54cmake_dependent_option( 55 LIBXML2_WITH_C14N "Add the Canonicalization support" ON 56 "LIBXML2_WITH_OUTPUT;LIBXML2_WITH_XPATH" OFF) 57cmake_dependent_option( 58 LIBXML2_WITH_HISTORY "history support for xmllint shell" OFF 59 "LIBXML2_WITH_READLINE" OFF) 60cmake_dependent_option( 61 LIBXML2_WITH_READER "Add the xmlReader parsing interface" ON 62 "LIBXML2_WITH_PUSH" OFF) 63cmake_dependent_option( 64 LIBXML2_WITH_SCHEMAS "Add Relax-NG and Schemas support" ON 65 "LIBXML2_WITH_PATTERN;LIBXML2_WITH_REGEXPS" OFF) 66cmake_dependent_option( 67 LIBXML2_WITH_SCHEMATRON "Add Schematron support" ON 68 "LIBXML2_WITH_PATTERN;LIBXML2_WITH_XPATH" OFF) 69cmake_dependent_option( 70 LIBXML2_WITH_THREAD_ALLOC "Add per-thread malloc hooks" OFF 71 "LIBXML2_WITH_THREADS" OFF) 72cmake_dependent_option( 73 LIBXML2_WITH_WRITER "Add the xmlWriter saving interface" ON 74 "LIBXML2_WITH_OUTPUT;LIBXML2_WITH_PUSH" OFF) 75cmake_dependent_option( 76 LIBXML2_WITH_XINCLUDE "Add the XInclude support" ON 77 "LIBXML2_WITH_XPATH" OFF) 78cmake_dependent_option( 79 LIBXML2_WITH_XPTR "Add the XPointer support" ON 80 "LIBXML2_WITH_XPATH" OFF) 81 82set(LIBXML2_XMLCONF_WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Working directory for XML Conformance Test Suite") 83 84if(LIBXML2_WITH_PYTHON) 85 find_package(Python COMPONENTS Interpreter Development REQUIRED) 86 #set(LIBXML2_PYTHON_INSTALL_DIR ${Python_SITEARCH} CACHE PATH "Python bindings install directory") 87 set(LIBXML2_PYTHON_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/python" 88 CACHE PATH "Python bindings install directory") 89endif() 90 91foreach(VARIABLE IN ITEMS WITH_AUTOMATA WITH_C14N WITH_CATALOG WITH_DEBUG WITH_EXPR WITH_HTML WITH_HTTP WITH_ICONV WITH_ICU WITH_ISO8859X WITH_LEGACY WITH_LZMA WITH_MODULES WITH_OUTPUT WITH_PATTERN WITH_PUSH WITH_READER WITH_REGEXPS WITH_SAX1 WITH_SCHEMAS WITH_SCHEMATRON WITH_THREADS WITH_THREAD_ALLOC WITH_UNICODE WITH_VALID WITH_WRITER WITH_XINCLUDE WITH_XPATH WITH_XPTR WITH_ZLIB) 92 if(LIBXML2_${VARIABLE}) 93 set(${VARIABLE} 1) 94 else() 95 set(${VARIABLE} 0) 96 endif() 97endforeach() 98 99set(LIBXML_VERSION ${VERSION}) 100set(LIBXML_VERSION_EXTRA "") 101math(EXPR LIBXML_VERSION_NUMBER " 102 ${LIBXML_MAJOR_VERSION} * 10000 + 103 ${LIBXML_MINOR_VERSION} * 100 + 104 ${LIBXML_MICRO_VERSION} 105") 106 107set(MODULE_EXTENSION "${CMAKE_SHARED_LIBRARY_SUFFIX}") 108 109set(PACKAGE "libxml2") 110set(PACKAGE_NAME "libxml2") 111set(PACKAGE_STRING "libxml2 ${VERSION}") 112set(PACKAGE_TARNAME "libxml2") 113set(PACKAGE_URL "https://gitlab.gnome.org/GNOME/libxml2") 114set(PACKAGE_VERSION ${VERSION}) 115 116if(LIBXML2_WITH_ICONV) 117 find_package(Iconv REQUIRED) 118endif() 119 120if(LIBXML2_WITH_ICU) 121 find_package(ICU REQUIRED COMPONENTS data i18n uc) 122endif() 123 124if(LIBXML2_WITH_LZMA) 125 find_package(LibLZMA REQUIRED) 126endif() 127 128if(LIBXML2_WITH_THREADS) 129 find_package(Threads REQUIRED) 130 set(THREAD_LIBS ${CMAKE_THREAD_LIBS_INIT}) 131 list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads) 132endif() 133 134if(LIBXML2_WITH_ZLIB) 135 find_package(ZLIB REQUIRED) 136endif() 137 138check_c_source_compiles(" 139 void __attribute__((destructor)) 140 f(void) {} 141 int main(void) { return 0; } 142" HAVE_FUNC_ATTRIBUTE_DESTRUCTOR) 143check_symbol_exists(getentropy "sys/random.h" HAVE_DECL_GETENTROPY) 144check_symbol_exists(glob "glob.h" HAVE_DECL_GLOB) 145check_symbol_exists(mmap "sys/mman.h" HAVE_DECL_MMAP) 146check_include_files(stdint.h HAVE_STDINT_H) 147 148if(LIBXML2_WITH_READLINE) 149 check_library_exists(readline readline "" HAVE_LIBREADLINE) 150 if (LIBXML2_WITH_HISTORY) 151 check_library_exists(history append_history "" HAVE_LIBHISTORY) 152 endif() 153endif() 154 155if(LIBXML2_WITH_HTTP) 156 check_include_files(poll.h HAVE_POLL_H) 157endif() 158 159if(LIBXML2_WITH_TLS) 160 check_c_source_compiles( 161 "_Thread_local int v; int main(){return 0;}" 162 XML_THREAD_LOCAL_C11 163 ) 164 if (XML_THREAD_LOCAL_C11) 165 set(XML_THREAD_LOCAL "_Thread_local") 166 else() 167 check_c_source_compiles( 168 "__thread int v; int main(){return 0;}" 169 XML_THREAD_LOCAL_THREAD 170 ) 171 if (XML_THREAD_LOCAL_THREAD) 172 set(XML_THREAD_LOCAL "__thread") 173 else() 174 check_c_source_compiles( 175 "__declspec(thread) int v; int main(){return 0;}" 176 XML_THREAD_LOCAL_DECLSPEC 177 ) 178 if (XML_THREAD_LOCAL_DECLSPEC) 179 set(XML_THREAD_LOCAL "__declspec(thread)") 180 endif() 181 endif() 182 endif() 183endif() 184 185set( 186 LIBXML2_HDRS 187 include/libxml/c14n.h 188 include/libxml/catalog.h 189 include/libxml/chvalid.h 190 include/libxml/debugXML.h 191 include/libxml/dict.h 192 include/libxml/encoding.h 193 include/libxml/entities.h 194 include/libxml/globals.h 195 include/libxml/hash.h 196 include/libxml/HTMLparser.h 197 include/libxml/HTMLtree.h 198 include/libxml/list.h 199 include/libxml/nanoftp.h 200 include/libxml/nanohttp.h 201 include/libxml/parser.h 202 include/libxml/parserInternals.h 203 include/libxml/pattern.h 204 include/libxml/relaxng.h 205 include/libxml/SAX.h 206 include/libxml/SAX2.h 207 include/libxml/schemasInternals.h 208 include/libxml/schematron.h 209 include/libxml/threads.h 210 include/libxml/tree.h 211 include/libxml/uri.h 212 include/libxml/valid.h 213 include/libxml/xinclude.h 214 include/libxml/xlink.h 215 include/libxml/xmlIO.h 216 include/libxml/xmlautomata.h 217 include/libxml/xmlerror.h 218 include/libxml/xmlexports.h 219 include/libxml/xmlmemory.h 220 include/libxml/xmlmodule.h 221 include/libxml/xmlreader.h 222 include/libxml/xmlregexp.h 223 include/libxml/xmlsave.h 224 include/libxml/xmlschemas.h 225 include/libxml/xmlschemastypes.h 226 include/libxml/xmlstring.h 227 include/libxml/xmlunicode.h 228 include/libxml/xmlwriter.h 229 include/libxml/xpath.h 230 include/libxml/xpathInternals.h 231 include/libxml/xpointer.h 232) 233 234set( 235 LIBXML2_SRCS 236 buf.c 237 c14n.c 238 catalog.c 239 chvalid.c 240 debugXML.c 241 dict.c 242 encoding.c 243 entities.c 244 error.c 245 globals.c 246 hash.c 247 HTMLparser.c 248 HTMLtree.c 249 legacy.c 250 list.c 251 nanohttp.c 252 parser.c 253 parserInternals.c 254 pattern.c 255 relaxng.c 256 SAX2.c 257 schematron.c 258 threads.c 259 tree.c 260 uri.c 261 valid.c 262 xinclude.c 263 xlink.c 264 xmlIO.c 265 xmlmemory.c 266 xmlmodule.c 267 xmlreader.c 268 xmlregexp.c 269 xmlsave.c 270 xmlschemas.c 271 xmlschemastypes.c 272 xmlstring.c 273 xmlunicode.c 274 xmlwriter.c 275 xpath.c 276 xpointer.c 277 xzlib.c 278) 279 280if(WIN32) 281 list(APPEND LIBXML2_SRCS win32/libxml2.rc) 282 file( 283 WRITE 284 ${CMAKE_CURRENT_BINARY_DIR}/rcVersion.h 285 "#define LIBXML_MAJOR_VERSION ${LIBXML_MAJOR_VERSION}\n" 286 "#define LIBXML_MINOR_VERSION ${LIBXML_MINOR_VERSION}\n" 287 "#define LIBXML_MICRO_VERSION ${LIBXML_MICRO_VERSION}\n" 288 "#define LIBXML_DOTTED_VERSION \"${VERSION}\"\n" 289 ) 290endif() 291 292add_library(LibXml2 ${LIBXML2_HDRS} ${LIBXML2_SRCS}) 293add_library(LibXml2::LibXml2 ALIAS LibXml2) 294 295target_compile_definitions(LibXml2 PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}") 296 297target_include_directories( 298 LibXml2 299 PUBLIC 300 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> 301 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 302 $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/libxml2> 303) 304 305if(LIBXML2_WITH_MODULES) 306 check_library_exists(dl dlopen "" HAVE_DLOPEN) 307 if(HAVE_DLOPEN) 308 target_link_libraries(LibXml2 PRIVATE dl) 309 set(MODULE_LIBS "-ldl") 310 else() 311 check_library_exists(dld shl_load "" HAVE_SHLLOAD) 312 if(HAVE_SHLLOAD) 313 target_link_libraries(LibXml2 PRIVATE dld) 314 set(MODULE_LIBS "-ldld") 315 endif() 316 endif() 317endif() 318 319if(UNIX) 320 target_link_libraries(LibXml2 PRIVATE m) 321 set(LIBM "-lm") 322endif() 323 324if(WIN32) 325 target_link_libraries(LibXml2 PRIVATE ws2_32) 326 set(WINSOCK_LIBS "-lws2_32") 327 target_link_libraries(LibXml2 PRIVATE bcrypt) 328 set(CRYPTO_LIBS "-lbcrypt") 329endif() 330 331if(LIBXML2_WITH_ICONV) 332 target_link_libraries(LibXml2 PUBLIC Iconv::Iconv) 333 if(NOT Iconv_IS_BUILT_IN) 334 set(ICONV_LIBS "-liconv") 335 endif() 336endif() 337 338if(LIBXML2_WITH_ICU) 339 target_link_libraries(LibXml2 PRIVATE ICU::data ICU::i18n ICU::uc) 340 if(WIN32) 341 set(ICU_LDFLAGS "-licudt -licuin -licuuc") 342 else() 343 set(ICU_LDFLAGS "-licudata -licui18n -licuuc") 344 endif() 345 list(APPEND XML_PRIVATE_LIBS "${ICU_LDFLAGS}") 346 pkg_check_modules(ICU_PC IMPORTED_TARGET icu-i18n) 347 if(ICU_PC_FOUND) 348 list(APPEND XML_PC_REQUIRES icu-i18n) 349 else() 350 list(APPEND XML_PC_LIBS "${ICU_LDFLAGS}") 351 endif() 352endif() 353 354if(LIBXML2_WITH_LZMA) 355 target_link_libraries(LibXml2 PRIVATE LibLZMA::LibLZMA) 356 set(LibLZMA_LDFLAGS "-llzma") 357 list(APPEND XML_PRIVATE_LIBS "${LibLZMA_LDFLAGS}") 358 pkg_check_modules(LibLZMA_PC IMPORTED_TARGET liblzma) 359 if(LibLZMA_PC_FOUND) 360 list(APPEND XML_PC_REQUIRES liblzma) 361 else() 362 list(APPEND XML_PC_LIBS "${LibLZMA_LDFLAGS}") 363 endif() 364endif() 365 366if(LIBXML2_WITH_THREADS) 367 target_link_libraries(LibXml2 PRIVATE Threads::Threads) 368endif() 369 370if(LIBXML2_WITH_ZLIB) 371 target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB) 372 set(ZLIB_LDFLAGS "-lz") 373 list(APPEND XML_PRIVATE_LIBS "${ZLIB_LDFLAGS}") 374 pkg_check_modules(ZLIB_PC IMPORTED_TARGET zlib) 375 if(ZLIB_PC_FOUND) 376 list(APPEND XML_PC_REQUIRES zlib) 377 else() 378 list(APPEND XML_PC_LIBS "${ZLIB_LDFLAGS}") 379 endif() 380endif() 381 382if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU") 383 # These compiler flags can break the checks above so keep them here. 384 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wshadow \ 385-Wpointer-arith -Wcast-align -Wwrite-strings \ 386-Wstrict-prototypes -Wmissing-prototypes \ 387-Wno-long-long -Wno-format-extra-args -Wno-array-bounds") 388 389 if(LIBXML2_WITH_LEGACY AND BUILD_SHARED_LIBS AND UNIX AND NOT APPLE) 390 check_linker_flag(C "LINKER:--undefined-version" FLAG_UNDEFINED_VERSION) 391 if (FLAG_UNDEFINED_VERSION) 392 target_link_options(LibXml2 PRIVATE "LINKER:--undefined-version") 393 endif() 394 target_link_options(LibXml2 PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libxml2.syms") 395 endif() 396endif() 397 398set(LIBXML_MINOR_COMPAT 0) 399math(EXPR LIBXML_SOVERSION "${LIBXML_MAJOR_VERSION} + ${LIBXML_MINOR_COMPAT}") 400set_target_properties( 401 LibXml2 402 PROPERTIES 403 IMPORT_PREFIX lib 404 OUTPUT_NAME xml2 405 POSITION_INDEPENDENT_CODE ON 406 PREFIX lib 407 VERSION ${PROJECT_VERSION} 408 SOVERSION ${LIBXML_SOVERSION} 409) 410 411if(MSVC) 412 if(BUILD_SHARED_LIBS) 413 set_target_properties( 414 LibXml2 415 PROPERTIES 416 DEBUG_POSTFIX d 417 ) 418 else() 419 set_target_properties( 420 LibXml2 421 PROPERTIES 422 DEBUG_POSTFIX sd 423 MINSIZEREL_POSTFIX s 424 RELEASE_POSTFIX s 425 RELWITHDEBINFO_POSTFIX s 426 ) 427 endif() 428endif() 429 430install(FILES ${LIBXML2_HDRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development) 431 432install( 433 TARGETS LibXml2 434 EXPORT LibXml2 435 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development 436 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_COMPONENT development 437 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime 438) 439 440if(MSVC AND BUILD_SHARED_LIBS) 441 install(FILES $<TARGET_PDB_FILE:LibXml2> DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug) 442endif() 443 444if(LIBXML2_WITH_PROGRAMS) 445 add_executable(xmllint xmllint.c shell.c) 446 add_executable(xmlcatalog xmlcatalog.c) 447 set( 448 PROGRAMS 449 xmlcatalog 450 xmllint 451 ) 452 foreach(PROGRAM ${PROGRAMS}) 453 add_executable(LibXml2::${PROGRAM} ALIAS ${PROGRAM}) 454 target_compile_definitions(${PROGRAM} PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}") 455 target_link_libraries(${PROGRAM} LibXml2) 456 if(HAVE_LIBHISTORY) 457 target_link_libraries(${PROGRAM} history) 458 endif() 459 if(HAVE_LIBREADLINE) 460 target_link_libraries(${PROGRAM} readline) 461 endif() 462 install(TARGETS ${PROGRAM} EXPORT LibXml2 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT programs) 463 endforeach() 464endif() 465 466if(LIBXML2_WITH_TESTS) 467 enable_testing() 468 set( 469 TESTS 470 runtest 471 runxmlconf 472 runsuite 473 testapi 474 testchar 475 testdict 476 testModule 477 testlimits 478 testparser 479 testrecurse 480 ) 481 foreach(TEST ${TESTS}) 482 add_executable(${TEST} ${TEST}.c) 483 target_compile_definitions(${TEST} PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}") 484 target_link_libraries(${TEST} LibXml2) 485 endforeach() 486 if(Threads_FOUND) 487 foreach(TEST runtest) 488 target_link_libraries(${TEST} Threads::Threads) 489 endforeach() 490 endif() 491 add_test(NAME runtest COMMAND runtest --out ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 492 add_test(NAME runsuite COMMAND runsuite WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 493 if(EXISTS ${LIBXML2_XMLCONF_WORKING_DIR}/xmlconf/xmlconf.xml) 494 add_test(NAME runxmlconf COMMAND runxmlconf WORKING_DIRECTORY ${LIBXML2_XMLCONF_WORKING_DIR}) 495 endif() 496 if(NOT WIN32) 497 add_test(NAME testapi COMMAND testapi) 498 endif() 499 add_test(NAME testchar COMMAND testchar) 500 add_test(NAME testdict COMMAND testdict) 501 add_test(NAME testparser COMMAND testparser WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 502 add_test(NAME testrecurse COMMAND testrecurse WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 503endif() 504 505if(LIBXML2_WITH_PYTHON) 506 execute_process( 507 COMMAND 508 ${Python_EXECUTABLE} 509 ${CMAKE_CURRENT_SOURCE_DIR}/python/generator.py 510 ${CMAKE_CURRENT_SOURCE_DIR}/doc/libxml2-api.xml 511 ${CMAKE_CURRENT_SOURCE_DIR}/python/libxml2-python-api.xml 512 WORKING_DIRECTORY 513 ${CMAKE_CURRENT_BINARY_DIR} 514 ) 515 file(READ python/libxml.py LIBXML_PY) 516 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in "${LIBXML_PY}") 517 file(READ ${CMAKE_CURRENT_BINARY_DIR}/libxml2class.py LIBXML2CLASS_PY) 518 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in "${LIBXML2CLASS_PY}") 519 configure_file(${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in libxml2.py COPYONLY) 520 add_library( 521 LibXml2Mod 522 libxml2-py.c 523 libxml2-py.h 524 python/libxml.c 525 python/libxml_wrap.h 526 python/types.c 527 ) 528 target_include_directories( 529 LibXml2Mod 530 PUBLIC 531 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/python> 532 ) 533 target_link_libraries(LibXml2Mod LibXml2 Python::Python) 534 set_target_properties( 535 LibXml2Mod 536 PROPERTIES 537 IMPORT_PREFIX lib 538 OUTPUT_NAME xml2mod 539 PREFIX lib 540 VERSION ${PROJECT_VERSION} 541 ) 542 if (WIN32) 543 set_target_properties(LibXml2Mod PROPERTIES SUFFIX ".pyd") 544 endif() 545 install( 546 TARGETS LibXml2Mod 547 ARCHIVE DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT development 548 LIBRARY DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime NAMELINK_COMPONENT development 549 RUNTIME DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime 550 ) 551 if(MSVC AND BUILD_SHARED_LIBS) 552 install(FILES $<TARGET_PDB_FILE:LibXml2Mod> DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug) 553 endif() 554 install(FILES python/drv_libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime) 555 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime) 556endif() 557 558install(FILES doc/xml2-config.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation) 559if(LIBXML2_WITH_PROGRAMS) 560 install(FILES doc/xmlcatalog.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation) 561 install(FILES doc/xmllint.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation) 562endif() 563install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT documentation 564 PATTERN "Makefile.*" EXCLUDE 565 PATTERN "meson.build" EXCLUDE 566 PATTERN "*.1" EXCLUDE 567 PATTERN "*.py" EXCLUDE 568 PATTERN "*.res" EXCLUDE 569 PATTERN "*.xml" EXCLUDE 570 PATTERN "*.xsl" EXCLUDE) 571 572configure_package_config_file( 573 libxml2-config.cmake.cmake.in libxml2-config.cmake 574 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION} 575) 576 577install( 578 FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config.cmake 579 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION} 580 COMPONENT development 581) 582 583write_basic_package_version_file( 584 ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake 585 VERSION ${PROJECT_VERSION} 586 COMPATIBILITY ExactVersion 587) 588 589install( 590 FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake 591 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION} 592 COMPONENT development 593) 594 595install( 596 EXPORT LibXml2 597 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION} 598 NAMESPACE LibXml2:: 599 FILE libxml2-export.cmake 600 COMPONENT development 601) 602 603configure_file(config.h.cmake.in config.h) 604configure_file(include/libxml/xmlversion.h.in libxml/xmlversion.h) 605install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml/xmlversion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development) 606 607if(LIBXML2_WITH_PYTHON) 608 set(prefix "${CMAKE_INSTALL_PREFIX}") 609 configure_file(python/setup.py.in setup.py @ONLY) 610endif() 611 612set(NON_PC_LIBS "${THREAD_LIBS} ${ICONV_LIBS} ${LIBM} ${WINSOCK_LIBS} ${CRYPTO_LIBS} ${MODULE_LIBS}") 613list(APPEND XML_PC_LIBS "${NON_PC_LIBS}") 614list(APPEND XML_PRIVATE_LIBS "${NON_PC_LIBS}") 615list(REMOVE_DUPLICATES XML_PC_LIBS) 616list(REMOVE_DUPLICATES XML_PRIVATE_LIBS) 617 618list(JOIN XML_PC_REQUIRES " " XML_PC_REQUIRES) 619list(JOIN XML_PC_LIBS " " XML_PC_LIBS) 620list(JOIN XML_PRIVATE_LIBS " " XML_PRIVATE_LIBS) 621 622set(XML_INCLUDEDIR "-I\${includedir}/libxml2") 623set(XML_LIBDIR "-L\${libdir}") 624set(XML_LIBS "-lxml2") 625 626if(BUILD_SHARED_LIBS) 627 set(XML_PC_PRIVATE ".private") 628 set(XML_PC_LIBS_PRIVATE " 629Libs.private:") 630else() 631 set(XML_PRIVATE_LIBS_NO_SHARED "${XML_PRIVATE_LIBS}") 632endif() 633 634if(WIN32) 635 set(XML_STATIC_CFLAGS "-DLIBXML_STATIC") 636 if (BUILD_SHARED_LIBS) 637 set(XML_PC_CFLAGS_PRIVATE " 638Cflags.private:") 639 else() 640 target_compile_definitions(LibXml2 PUBLIC LIBXML_STATIC) 641 set(XML_CFLAGS "${XML_STATIC_CFLAGS}") 642 endif() 643endif() 644 645file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig" "${CMAKE_INSTALL_PREFIX}") 646string(REGEX REPLACE "/$" "" PACKAGE_RELATIVE_PATH "${PACKAGE_RELATIVE_PATH}") 647 648if(WIN32) 649 set(prefix "\${pcfiledir}/${PACKAGE_RELATIVE_PATH}") 650else() 651 set(prefix "${CMAKE_INSTALL_PREFIX}") 652endif() 653set(exec_prefix "\${prefix}") 654set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}") 655set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") 656configure_file(libxml-2.0.pc.in libxml-2.0.pc @ONLY) 657install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml-2.0.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT development) 658 659if(WIN32) 660 set(prefix "\$(cd \"\$(dirname \"\$0\")\"; pwd -P)/..") 661endif() 662configure_file(xml2-config.in xml2-config @ONLY) 663install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/xml2-config DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT development) 664 665set(XML_INCLUDEDIR "-I${CMAKE_INSTALL_FULL_INCLUDEDIR}/libxml2") 666set(XML_LIBDIR "-L${CMAKE_INSTALL_FULL_LIBDIR}") 667 668set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime) 669set(CPACK_COMPONENT_PROGRAMS_DEPENDS runtime) 670set(CPACK_DEB_COMPONENT_INSTALL ON) 671set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_DEPENDS "${PACKAGE_TARNAME}") 672set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_NAME "${PACKAGE_TARNAME}-dev") 673set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_SECTION "libdevel") 674set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PACKAGE_URL}) 675set(CPACK_DEBIAN_PACKAGE_NAME ${PACKAGE_TARNAME}) 676set(CPACK_DEBIAN_PACKAGE_SECTION "devel") 677set(CPACK_DEBIAN_PROGRAMS_PACKAGE_DEPENDS "${PACKAGE_TARNAME}") 678set(CPACK_DEBIAN_PROGRAMS_PACKAGE_NAME "${PACKAGE_TARNAME}-utils") 679set(CPACK_DEBIAN_PROGRAMS_PACKAGE_SECTION "utils") 680set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME ${PACKAGE_TARNAME}) 681set(CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "${PACKAGE_TARNAME}-utils") 682set(CPACK_DEBIAN_RUNTIME_PACKAGE_SECTION "libs") 683set(CPACK_NSIS_PACKAGE_NAME ${PACKAGE_STRING}) 684set(CPACK_NSIS_URL_INFO_ABOUT ${PACKAGE_URL}) 685set(CPACK_PACKAGE_DISPLAY_NAME ${PACKAGE_STRING}) 686set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PACKAGE_TARNAME}-${PACKAGE_VERSION}") 687set(CPACK_PACKAGE_NAME ${PACKAGE_TARNAME}) 688set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION}) 689set(CPACK_PACKAGE_VERSION_MAJOR ${LIBXML_MAJOR_VERSION}) 690set(CPACK_PACKAGE_VERSION_MINOR ${LIBXML_MINOR_VERSION}) 691set(CPACK_PACKAGE_VERSION_PATCH ${LIBXML_MICRO_VERSION}) 692set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/Copyright) 693set(CPACK_RPM_COMPONENT_INSTALL ON) 694set(CPACK_RPM_development_PACKAGE_NAME "${PACKAGE_NAME}-devel") 695set(CPACK_RPM_development_PACKAGE_REQUIRES "${PACKAGE_NAME}") 696set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries") 697set(CPACK_RPM_PACKAGE_NAME ${PACKAGE_TARNAME}) 698set(CPACK_RPM_PACKAGE_URL ${PACKAGE_URL}) 699set(CPACK_RPM_programs_PACKAGE_NAME "${PACKAGE_NAME}-utils") 700set(CPACK_RPM_programs_PACKAGE_REQUIRES "${PACKAGE_NAME}") 701set(CPACK_RPM_runtime_PACKAGE_NAME "${PACKAGE_NAME}") 702set(CPACK_RPM_runtime_PACKAGE_SUGGESTS "${PACKAGE_NAME}-utils") 703 704include(CPack) 705