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