• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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