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