xref: /aosp_15_r20/external/libxml2/CMakeLists.txt (revision 7c5688314b92172186c154356a6374bf7684c3ca)
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