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