cmake_minimum_required(VERSION 3.18)

file(READ "VERSION" VERSION)
string(STRIP ${VERSION} VERSION)
if(${VERSION} MATCHES [[([0-9]+)\.([0-9]+)\.([0-9]+)]])
    set(LIBXML_MAJOR_VERSION ${CMAKE_MATCH_1})
    set(LIBXML_MINOR_VERSION ${CMAKE_MATCH_2})
    set(LIBXML_MICRO_VERSION ${CMAKE_MATCH_3})
endif()

project(libxml2 VERSION ${VERSION} LANGUAGES C)

include(CheckCSourceCompiles)
include(CheckFunctionExists)
include(CheckIncludeFiles)
include(CheckLibraryExists)
include(CheckLinkerFlag)
include(CheckStructHasMember)
include(CheckSymbolExists)
include(CMakeDependentOption)
include(CMakePackageConfigHelpers)
include(FindPkgConfig)
include(GNUInstallDirs)

option(BUILD_SHARED_LIBS "Build shared libraries" ON)
set(LIBXML2_WITH_AUTOMATA ON)
option(LIBXML2_WITH_CATALOG "Add the Catalog support" ON)
option(LIBXML2_WITH_DEBUG "Add the debugging module" ON)
set(LIBXML2_WITH_EXPR ON)
option(LIBXML2_WITH_HTML "Add the HTML support" ON)
option(LIBXML2_WITH_HTTP "Add the HTTP support" OFF)
option(LIBXML2_WITH_ICONV "Add ICONV support" ON)
option(LIBXML2_WITH_ICU "Add ICU support" OFF)
option(LIBXML2_WITH_ISO8859X "Add ISO8859X support if no iconv" ON)
option(LIBXML2_WITH_LEGACY "Add deprecated APIs for compatibility" OFF)
option(LIBXML2_WITH_LZMA "Use liblzma" OFF)
option(LIBXML2_WITH_MODULES "Add the dynamic modules support" ON)
option(LIBXML2_WITH_OUTPUT "Add the serialization support" ON)
option(LIBXML2_WITH_PATTERN "Add the xmlPattern selection interface" ON)
option(LIBXML2_WITH_PROGRAMS "Build programs" ON)
option(LIBXML2_WITH_PUSH "Add the PUSH parser interfaces" ON)
option(LIBXML2_WITH_PYTHON "Build Python bindings" ON)
option(LIBXML2_WITH_READLINE "readline support for xmllint shell" OFF)
option(LIBXML2_WITH_REGEXPS "Add Regular Expressions support" ON)
option(LIBXML2_WITH_SAX1 "Add the older SAX1 interface" ON)
option(LIBXML2_WITH_TESTS "Build tests" ON)
option(LIBXML2_WITH_THREADS "Add multithread support" ON)
option(LIBXML2_WITH_TLS "Enable thread-local storage" OFF)
set(LIBXML2_WITH_UNICODE ON)
option(LIBXML2_WITH_VALID "Add the DTD validation support" ON)
option(LIBXML2_WITH_XPATH "Add the XPATH support" ON)
option(LIBXML2_WITH_ZLIB "Use libz" OFF)

cmake_dependent_option(
    LIBXML2_WITH_C14N "Add the Canonicalization support" ON
    "LIBXML2_WITH_OUTPUT;LIBXML2_WITH_XPATH" OFF)
cmake_dependent_option(
    LIBXML2_WITH_HISTORY "history support for xmllint shell" OFF
    "LIBXML2_WITH_READLINE" OFF)
cmake_dependent_option(
    LIBXML2_WITH_READER "Add the xmlReader parsing interface" ON
    "LIBXML2_WITH_PUSH" OFF)
cmake_dependent_option(
    LIBXML2_WITH_SCHEMAS "Add Relax-NG and Schemas support" ON
    "LIBXML2_WITH_PATTERN;LIBXML2_WITH_REGEXPS" OFF)
cmake_dependent_option(
    LIBXML2_WITH_SCHEMATRON "Add Schematron support" ON
    "LIBXML2_WITH_PATTERN;LIBXML2_WITH_XPATH" OFF)
cmake_dependent_option(
    LIBXML2_WITH_THREAD_ALLOC "Add per-thread malloc hooks" OFF
    "LIBXML2_WITH_THREADS" OFF)
cmake_dependent_option(
    LIBXML2_WITH_WRITER "Add the xmlWriter saving interface" ON
    "LIBXML2_WITH_OUTPUT;LIBXML2_WITH_PUSH" OFF)
cmake_dependent_option(
    LIBXML2_WITH_XINCLUDE "Add the XInclude support" ON
    "LIBXML2_WITH_XPATH" OFF)
cmake_dependent_option(
    LIBXML2_WITH_XPTR "Add the XPointer support" ON
    "LIBXML2_WITH_XPATH" OFF)

set(LIBXML2_XMLCONF_WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Working directory for XML Conformance Test Suite")

if(LIBXML2_WITH_PYTHON)
    find_package(Python COMPONENTS Interpreter Development REQUIRED)
    #set(LIBXML2_PYTHON_INSTALL_DIR ${Python_SITEARCH} CACHE PATH "Python bindings install directory")
    set(LIBXML2_PYTHON_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/python"
        CACHE PATH "Python bindings install directory")
endif()

foreach(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)
    if(LIBXML2_${VARIABLE})
        set(${VARIABLE} 1)
    else()
        set(${VARIABLE} 0)
    endif()
endforeach()

set(LIBXML_VERSION ${VERSION})
set(LIBXML_VERSION_EXTRA "")
math(EXPR LIBXML_VERSION_NUMBER "
    ${LIBXML_MAJOR_VERSION} * 10000 +
    ${LIBXML_MINOR_VERSION} * 100 +
    ${LIBXML_MICRO_VERSION}
")

set(MODULE_EXTENSION "${CMAKE_SHARED_LIBRARY_SUFFIX}")

set(PACKAGE "libxml2")
set(PACKAGE_NAME "libxml2")
set(PACKAGE_STRING "libxml2 ${VERSION}")
set(PACKAGE_TARNAME "libxml2")
set(PACKAGE_URL "https://gitlab.gnome.org/GNOME/libxml2")
set(PACKAGE_VERSION ${VERSION})

if(LIBXML2_WITH_ICONV)
    find_package(Iconv REQUIRED)
endif()

if(LIBXML2_WITH_ICU)
    find_package(ICU REQUIRED COMPONENTS data i18n uc)
endif()

if(LIBXML2_WITH_LZMA)
    find_package(LibLZMA REQUIRED)
endif()

if(LIBXML2_WITH_THREADS)
    find_package(Threads REQUIRED)
    set(THREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
    list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads)
endif()

if(LIBXML2_WITH_ZLIB)
    find_package(ZLIB REQUIRED)
endif()

check_c_source_compiles("
    void __attribute__((destructor))
    f(void) {}
    int main(void) { return 0; }
" HAVE_FUNC_ATTRIBUTE_DESTRUCTOR)
check_symbol_exists(getentropy "sys/random.h" HAVE_DECL_GETENTROPY)
check_symbol_exists(glob "glob.h" HAVE_DECL_GLOB)
check_symbol_exists(mmap "sys/mman.h" HAVE_DECL_MMAP)
check_include_files(stdint.h HAVE_STDINT_H)

if(LIBXML2_WITH_READLINE)
    check_library_exists(readline readline "" HAVE_LIBREADLINE)
    if (LIBXML2_WITH_HISTORY)
        check_library_exists(history append_history "" HAVE_LIBHISTORY)
    endif()
endif()

if(LIBXML2_WITH_HTTP)
    check_include_files(poll.h HAVE_POLL_H)
endif()

if(LIBXML2_WITH_TLS)
    check_c_source_compiles(
        "_Thread_local int v; int main(){return 0;}"
        XML_THREAD_LOCAL_C11
    )
    if (XML_THREAD_LOCAL_C11)
        set(XML_THREAD_LOCAL "_Thread_local")
    else()
        check_c_source_compiles(
            "__thread int v; int main(){return 0;}"
            XML_THREAD_LOCAL_THREAD
        )
        if (XML_THREAD_LOCAL_THREAD)
            set(XML_THREAD_LOCAL "__thread")
        else()
            check_c_source_compiles(
                "__declspec(thread) int v; int main(){return 0;}"
                XML_THREAD_LOCAL_DECLSPEC
            )
            if (XML_THREAD_LOCAL_DECLSPEC)
                set(XML_THREAD_LOCAL "__declspec(thread)")
            endif()
        endif()
    endif()
endif()

set(
    LIBXML2_HDRS
    include/libxml/c14n.h
    include/libxml/catalog.h
    include/libxml/chvalid.h
    include/libxml/debugXML.h
    include/libxml/dict.h
    include/libxml/encoding.h
    include/libxml/entities.h
    include/libxml/globals.h
    include/libxml/hash.h
    include/libxml/HTMLparser.h
    include/libxml/HTMLtree.h
    include/libxml/list.h
    include/libxml/nanoftp.h
    include/libxml/nanohttp.h
    include/libxml/parser.h
    include/libxml/parserInternals.h
    include/libxml/pattern.h
    include/libxml/relaxng.h
    include/libxml/SAX.h
    include/libxml/SAX2.h
    include/libxml/schemasInternals.h
    include/libxml/schematron.h
    include/libxml/threads.h
    include/libxml/tree.h
    include/libxml/uri.h
    include/libxml/valid.h
    include/libxml/xinclude.h
    include/libxml/xlink.h
    include/libxml/xmlIO.h
    include/libxml/xmlautomata.h
    include/libxml/xmlerror.h
    include/libxml/xmlexports.h
    include/libxml/xmlmemory.h
    include/libxml/xmlmodule.h
    include/libxml/xmlreader.h
    include/libxml/xmlregexp.h
    include/libxml/xmlsave.h
    include/libxml/xmlschemas.h
    include/libxml/xmlschemastypes.h
    include/libxml/xmlstring.h
    include/libxml/xmlunicode.h
    include/libxml/xmlwriter.h
    include/libxml/xpath.h
    include/libxml/xpathInternals.h
    include/libxml/xpointer.h
)

set(
    LIBXML2_SRCS
    buf.c
    c14n.c
    catalog.c
    chvalid.c
    debugXML.c
    dict.c
    encoding.c
    entities.c
    error.c
    globals.c
    hash.c
    HTMLparser.c
    HTMLtree.c
    legacy.c
    list.c
    nanohttp.c
    parser.c
    parserInternals.c
    pattern.c
    relaxng.c
    SAX2.c
    schematron.c
    threads.c
    tree.c
    uri.c
    valid.c
    xinclude.c
    xlink.c
    xmlIO.c
    xmlmemory.c
    xmlmodule.c
    xmlreader.c
    xmlregexp.c
    xmlsave.c
    xmlschemas.c
    xmlschemastypes.c
    xmlstring.c
    xmlunicode.c
    xmlwriter.c
    xpath.c
    xpointer.c
    xzlib.c
)

if(WIN32)
    list(APPEND LIBXML2_SRCS win32/libxml2.rc)
    file(
        WRITE
        ${CMAKE_CURRENT_BINARY_DIR}/rcVersion.h
        "#define LIBXML_MAJOR_VERSION ${LIBXML_MAJOR_VERSION}\n"
        "#define LIBXML_MINOR_VERSION ${LIBXML_MINOR_VERSION}\n"
        "#define LIBXML_MICRO_VERSION ${LIBXML_MICRO_VERSION}\n"
        "#define LIBXML_DOTTED_VERSION \"${VERSION}\"\n"
    )
endif()

add_library(LibXml2 ${LIBXML2_HDRS} ${LIBXML2_SRCS})
add_library(LibXml2::LibXml2 ALIAS LibXml2)

target_compile_definitions(LibXml2 PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")

target_include_directories(
    LibXml2
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/libxml2>
)

if(LIBXML2_WITH_MODULES)
    check_library_exists(dl dlopen "" HAVE_DLOPEN)
    if(HAVE_DLOPEN)
        target_link_libraries(LibXml2 PRIVATE dl)
        set(MODULE_LIBS "-ldl")
    else()
        check_library_exists(dld shl_load "" HAVE_SHLLOAD)
        if(HAVE_SHLLOAD)
            target_link_libraries(LibXml2 PRIVATE dld)
            set(MODULE_LIBS "-ldld")
        endif()
    endif()
endif()

if(UNIX)
    target_link_libraries(LibXml2 PRIVATE m)
    set(LIBM "-lm")
endif()

if(WIN32)
    target_link_libraries(LibXml2 PRIVATE ws2_32)
    set(WINSOCK_LIBS "-lws2_32")
    target_link_libraries(LibXml2 PRIVATE bcrypt)
    set(CRYPTO_LIBS "-lbcrypt")
endif()

if(LIBXML2_WITH_ICONV)
    target_link_libraries(LibXml2 PUBLIC Iconv::Iconv)
    if(NOT Iconv_IS_BUILT_IN)
        set(ICONV_LIBS "-liconv")
    endif()
endif()

if(LIBXML2_WITH_ICU)
    target_link_libraries(LibXml2 PRIVATE ICU::data ICU::i18n ICU::uc)
    if(WIN32)
        set(ICU_LDFLAGS "-licudt -licuin -licuuc")
    else()
        set(ICU_LDFLAGS "-licudata -licui18n -licuuc")
    endif()
    list(APPEND XML_PRIVATE_LIBS "${ICU_LDFLAGS}")
    pkg_check_modules(ICU_PC IMPORTED_TARGET icu-i18n)
    if(ICU_PC_FOUND)
        list(APPEND XML_PC_REQUIRES icu-i18n)
    else()
        list(APPEND XML_PC_LIBS "${ICU_LDFLAGS}")
    endif()
endif()

if(LIBXML2_WITH_LZMA)
    target_link_libraries(LibXml2 PRIVATE LibLZMA::LibLZMA)
    set(LibLZMA_LDFLAGS "-llzma")
    list(APPEND XML_PRIVATE_LIBS "${LibLZMA_LDFLAGS}")
    pkg_check_modules(LibLZMA_PC IMPORTED_TARGET liblzma)
    if(LibLZMA_PC_FOUND)
        list(APPEND XML_PC_REQUIRES liblzma)
    else()
        list(APPEND XML_PC_LIBS "${LibLZMA_LDFLAGS}")
    endif()
endif()

if(LIBXML2_WITH_THREADS)
    target_link_libraries(LibXml2 PRIVATE Threads::Threads)
endif()

if(LIBXML2_WITH_ZLIB)
    target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB)
    set(ZLIB_LDFLAGS "-lz")
    list(APPEND XML_PRIVATE_LIBS "${ZLIB_LDFLAGS}")
    pkg_check_modules(ZLIB_PC IMPORTED_TARGET zlib)
    if(ZLIB_PC_FOUND)
        list(APPEND XML_PC_REQUIRES zlib)
    else()
        list(APPEND XML_PC_LIBS "${ZLIB_LDFLAGS}")
    endif()
endif()

if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")
    # These compiler flags can break the checks above so keep them here.
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wshadow \
-Wpointer-arith -Wcast-align -Wwrite-strings \
-Wstrict-prototypes -Wmissing-prototypes \
-Wno-long-long -Wno-format-extra-args -Wno-array-bounds")

    if(LIBXML2_WITH_LEGACY AND BUILD_SHARED_LIBS AND UNIX AND NOT APPLE)
        check_linker_flag(C "LINKER:--undefined-version" FLAG_UNDEFINED_VERSION)
        if (FLAG_UNDEFINED_VERSION)
            target_link_options(LibXml2 PRIVATE "LINKER:--undefined-version")
        endif()
        target_link_options(LibXml2 PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libxml2.syms")
    endif()
endif()

set(LIBXML_MINOR_COMPAT 0)
math(EXPR LIBXML_SOVERSION "${LIBXML_MAJOR_VERSION} + ${LIBXML_MINOR_COMPAT}")
set_target_properties(
    LibXml2
    PROPERTIES
    IMPORT_PREFIX lib
    OUTPUT_NAME xml2
    POSITION_INDEPENDENT_CODE ON
    PREFIX lib
    VERSION ${PROJECT_VERSION}
    SOVERSION ${LIBXML_SOVERSION}
)

if(MSVC)
    if(BUILD_SHARED_LIBS)
        set_target_properties(
            LibXml2
            PROPERTIES
            DEBUG_POSTFIX d
        )
    else()
        set_target_properties(
            LibXml2
            PROPERTIES
            DEBUG_POSTFIX sd
            MINSIZEREL_POSTFIX s
            RELEASE_POSTFIX s
            RELWITHDEBINFO_POSTFIX s
        )
    endif()
endif()

install(FILES ${LIBXML2_HDRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)

install(
    TARGETS    LibXml2
    EXPORT LibXml2
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_COMPONENT development
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
)

if(MSVC AND BUILD_SHARED_LIBS)
    install(FILES $<TARGET_PDB_FILE:LibXml2> DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug)
endif()

if(LIBXML2_WITH_PROGRAMS)
    add_executable(xmllint xmllint.c shell.c)
    add_executable(xmlcatalog xmlcatalog.c)
    set(
        PROGRAMS
        xmlcatalog
        xmllint
    )
    foreach(PROGRAM ${PROGRAMS})
        add_executable(LibXml2::${PROGRAM} ALIAS ${PROGRAM})
        target_compile_definitions(${PROGRAM} PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
        target_link_libraries(${PROGRAM} LibXml2)
        if(HAVE_LIBHISTORY)
            target_link_libraries(${PROGRAM} history)
        endif()
        if(HAVE_LIBREADLINE)
            target_link_libraries(${PROGRAM} readline)
        endif()
        install(TARGETS    ${PROGRAM} EXPORT LibXml2 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT programs)
    endforeach()
endif()

if(LIBXML2_WITH_TESTS)
    enable_testing()
    set(
        TESTS
        runtest
        runxmlconf
        runsuite
        testapi
        testchar
        testdict
        testModule
        testlimits
        testparser
        testrecurse
    )
    foreach(TEST ${TESTS})
        add_executable(${TEST} ${TEST}.c)
        target_compile_definitions(${TEST} PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
        target_link_libraries(${TEST} LibXml2)
    endforeach()
    if(Threads_FOUND)
        foreach(TEST runtest)
            target_link_libraries(${TEST} Threads::Threads)
        endforeach()
    endif()
    add_test(NAME runtest COMMAND runtest --out ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
    add_test(NAME runsuite COMMAND runsuite WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
    if(EXISTS ${LIBXML2_XMLCONF_WORKING_DIR}/xmlconf/xmlconf.xml)
        add_test(NAME runxmlconf COMMAND runxmlconf WORKING_DIRECTORY ${LIBXML2_XMLCONF_WORKING_DIR})
    endif()
    if(NOT WIN32)
        add_test(NAME testapi COMMAND testapi)
    endif()
    add_test(NAME testchar COMMAND testchar)
    add_test(NAME testdict COMMAND testdict)
    add_test(NAME testparser COMMAND testparser WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
    add_test(NAME testrecurse COMMAND testrecurse WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()

if(LIBXML2_WITH_PYTHON)
    execute_process(
        COMMAND
        ${Python_EXECUTABLE}
        ${CMAKE_CURRENT_SOURCE_DIR}/python/generator.py
        ${CMAKE_CURRENT_SOURCE_DIR}/doc/libxml2-api.xml
        ${CMAKE_CURRENT_SOURCE_DIR}/python/libxml2-python-api.xml
        WORKING_DIRECTORY
        ${CMAKE_CURRENT_BINARY_DIR}
    )
    file(READ python/libxml.py LIBXML_PY)
    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in "${LIBXML_PY}")
    file(READ ${CMAKE_CURRENT_BINARY_DIR}/libxml2class.py LIBXML2CLASS_PY)
    file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in "${LIBXML2CLASS_PY}")
    configure_file(${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in libxml2.py COPYONLY)
    add_library(
        LibXml2Mod
        libxml2-py.c
        libxml2-py.h
        python/libxml.c
        python/libxml_wrap.h
        python/types.c
    )
    target_include_directories(
        LibXml2Mod
        PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/python>
    )
    target_link_libraries(LibXml2Mod LibXml2 Python::Python)
    set_target_properties(
        LibXml2Mod
        PROPERTIES
        IMPORT_PREFIX lib
        OUTPUT_NAME xml2mod
        PREFIX lib
        VERSION ${PROJECT_VERSION}
    )
    if (WIN32)
        set_target_properties(LibXml2Mod PROPERTIES SUFFIX ".pyd")
    endif()
    install(
        TARGETS    LibXml2Mod
        ARCHIVE DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT development
        LIBRARY DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime NAMELINK_COMPONENT development
        RUNTIME DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime
    )
    if(MSVC AND BUILD_SHARED_LIBS)
        install(FILES $<TARGET_PDB_FILE:LibXml2Mod> DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug)
    endif()
    install(FILES python/drv_libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime)
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime)
endif()

install(FILES doc/xml2-config.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
if(LIBXML2_WITH_PROGRAMS)
    install(FILES doc/xmlcatalog.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
    install(FILES doc/xmllint.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
endif()
install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT documentation
    PATTERN "Makefile.*" EXCLUDE
    PATTERN "meson.build" EXCLUDE
    PATTERN "*.1" EXCLUDE
    PATTERN "*.py" EXCLUDE
    PATTERN "*.res" EXCLUDE
    PATTERN "*.xml" EXCLUDE
    PATTERN "*.xsl" EXCLUDE)

configure_package_config_file(
    libxml2-config.cmake.cmake.in libxml2-config.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
)

install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
    COMPONENT development
)

write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY ExactVersion
)

install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
    COMPONENT development
)

install(
    EXPORT LibXml2
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
    NAMESPACE LibXml2::
    FILE libxml2-export.cmake
    COMPONENT development
)

configure_file(config.h.cmake.in config.h)
configure_file(include/libxml/xmlversion.h.in libxml/xmlversion.h)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml/xmlversion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)

if(LIBXML2_WITH_PYTHON)
    set(prefix "${CMAKE_INSTALL_PREFIX}")
    configure_file(python/setup.py.in setup.py @ONLY)
endif()

set(NON_PC_LIBS "${THREAD_LIBS} ${ICONV_LIBS} ${LIBM} ${WINSOCK_LIBS} ${CRYPTO_LIBS} ${MODULE_LIBS}")
list(APPEND XML_PC_LIBS "${NON_PC_LIBS}")
list(APPEND XML_PRIVATE_LIBS "${NON_PC_LIBS}")
list(REMOVE_DUPLICATES XML_PC_LIBS)
list(REMOVE_DUPLICATES XML_PRIVATE_LIBS)

list(JOIN XML_PC_REQUIRES " " XML_PC_REQUIRES)
list(JOIN XML_PC_LIBS " " XML_PC_LIBS)
list(JOIN XML_PRIVATE_LIBS " " XML_PRIVATE_LIBS)

set(XML_INCLUDEDIR "-I\${includedir}/libxml2")
set(XML_LIBDIR "-L\${libdir}")
set(XML_LIBS "-lxml2")

if(BUILD_SHARED_LIBS)
    set(XML_PC_PRIVATE ".private")
    set(XML_PC_LIBS_PRIVATE "
Libs.private:")
else()
    set(XML_PRIVATE_LIBS_NO_SHARED "${XML_PRIVATE_LIBS}")
endif()

if(WIN32)
    set(XML_STATIC_CFLAGS "-DLIBXML_STATIC")
    if (BUILD_SHARED_LIBS)
        set(XML_PC_CFLAGS_PRIVATE "
Cflags.private:")
    else()
        target_compile_definitions(LibXml2 PUBLIC LIBXML_STATIC)
        set(XML_CFLAGS "${XML_STATIC_CFLAGS}")
    endif()
endif()

file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig" "${CMAKE_INSTALL_PREFIX}")
string(REGEX REPLACE "/$" "" PACKAGE_RELATIVE_PATH "${PACKAGE_RELATIVE_PATH}")

if(WIN32)
    set(prefix "\${pcfiledir}/${PACKAGE_RELATIVE_PATH}")
else()
    set(prefix "${CMAKE_INSTALL_PREFIX}")
endif()
set(exec_prefix "\${prefix}")
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
configure_file(libxml-2.0.pc.in libxml-2.0.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml-2.0.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT development)

if(WIN32)
    set(prefix "\$(cd \"\$(dirname \"\$0\")\"; pwd -P)/..")
endif()
configure_file(xml2-config.in xml2-config @ONLY)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/xml2-config DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT development)

set(XML_INCLUDEDIR "-I${CMAKE_INSTALL_FULL_INCLUDEDIR}/libxml2")
set(XML_LIBDIR "-L${CMAKE_INSTALL_FULL_LIBDIR}")

set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime)
set(CPACK_COMPONENT_PROGRAMS_DEPENDS runtime)
set(CPACK_DEB_COMPONENT_INSTALL ON)
set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_DEPENDS "${PACKAGE_TARNAME}")
set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_NAME "${PACKAGE_TARNAME}-dev")
set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_SECTION "libdevel")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PACKAGE_URL})
set(CPACK_DEBIAN_PACKAGE_NAME ${PACKAGE_TARNAME})
set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
set(CPACK_DEBIAN_PROGRAMS_PACKAGE_DEPENDS "${PACKAGE_TARNAME}")
set(CPACK_DEBIAN_PROGRAMS_PACKAGE_NAME "${PACKAGE_TARNAME}-utils")
set(CPACK_DEBIAN_PROGRAMS_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME ${PACKAGE_TARNAME})
set(CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "${PACKAGE_TARNAME}-utils")
set(CPACK_DEBIAN_RUNTIME_PACKAGE_SECTION "libs")
set(CPACK_NSIS_PACKAGE_NAME ${PACKAGE_STRING})
set(CPACK_NSIS_URL_INFO_ABOUT ${PACKAGE_URL})
set(CPACK_PACKAGE_DISPLAY_NAME ${PACKAGE_STRING})
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PACKAGE_TARNAME}-${PACKAGE_VERSION}")
set(CPACK_PACKAGE_NAME ${PACKAGE_TARNAME})
set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR ${LIBXML_MAJOR_VERSION})
set(CPACK_PACKAGE_VERSION_MINOR ${LIBXML_MINOR_VERSION})
set(CPACK_PACKAGE_VERSION_PATCH ${LIBXML_MICRO_VERSION})
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/Copyright)
set(CPACK_RPM_COMPONENT_INSTALL ON)
set(CPACK_RPM_development_PACKAGE_NAME "${PACKAGE_NAME}-devel")
set(CPACK_RPM_development_PACKAGE_REQUIRES "${PACKAGE_NAME}")
set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
set(CPACK_RPM_PACKAGE_NAME ${PACKAGE_TARNAME})
set(CPACK_RPM_PACKAGE_URL ${PACKAGE_URL})
set(CPACK_RPM_programs_PACKAGE_NAME "${PACKAGE_NAME}-utils")
set(CPACK_RPM_programs_PACKAGE_REQUIRES "${PACKAGE_NAME}")
set(CPACK_RPM_runtime_PACKAGE_NAME "${PACKAGE_NAME}")
set(CPACK_RPM_runtime_PACKAGE_SUGGESTS "${PACKAGE_NAME}-utils")

include(CPack)
