cmake_minimum_required(VERSION 3.18)

file(STRINGS "configure.ac" CONFIGURE_AC_LINES)
foreach(line ${CONFIGURE_AC_LINES})
	if(line MATCHES [[^m4_define\(\[(MAJOR_VERSION|MINOR_VERSION|MICRO_VERSION)\],[ \t]*([0-9]+)\)$]])
		set(LIBXML_${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
	elseif(line MATCHES "^(LIBXML_MAJOR_VERSION|LIBXML_MINOR_VERSION|LIBXML_MICRO_VERSION)=([0-9]+)$")
		set(${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
	endif()
endforeach()
set(VERSION "${LIBXML_MAJOR_VERSION}.${LIBXML_MINOR_VERSION}.${LIBXML_MICRO_VERSION}")

project(libxml2 VERSION ${VERSION} LANGUAGES C)

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

option(BUILD_SHARED_LIBS "Build shared libraries" ON)
set(LIBXML2_WITH_AUTOMATA ON)
option(LIBXML2_WITH_C14N "Add the Canonicalization support" 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_FTP "Add the FTP support" OFF)
option(LIBXML2_WITH_HTML "Add the HTML support" ON)
option(LIBXML2_WITH_HTTP "Add the HTTP support" ON)
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" ON)
option(LIBXML2_WITH_MEM_DEBUG "Add the memory debugging module" 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_READER "Add the xmlReader parsing interface" ON)
option(LIBXML2_WITH_REGEXPS "Add Regular Expressions support" ON)
option(LIBXML2_WITH_SAX1 "Add the older SAX1 interface" ON)
option(LIBXML2_WITH_SCHEMAS "Add Relax-NG and Schemas support" ON)
option(LIBXML2_WITH_SCHEMATRON "Add Schematron support" ON)
option(LIBXML2_WITH_TESTS "Build tests" ON)
option(LIBXML2_WITH_THREADS "Add multithread support" ON)
option(LIBXML2_WITH_THREAD_ALLOC "Add per-thread memory" OFF)
option(LIBXML2_WITH_TREE "Add the DOM like tree manipulation APIs" ON)
set(LIBXML2_WITH_TRIO OFF)
set(LIBXML2_WITH_UNICODE ON)
option(LIBXML2_WITH_VALID "Add the DTD validation support" ON)
option(LIBXML2_WITH_WRITER "Add the xmlWriter saving interface" ON)
option(LIBXML2_WITH_XINCLUDE "Add the XInclude support" ON)
option(LIBXML2_WITH_XPATH "Add the XPATH support" ON)
option(LIBXML2_WITH_XPTR "Add the XPointer support" ON)
option(LIBXML2_WITH_XPTR_LOCS "Add support for XPointer locations" OFF)
option(LIBXML2_WITH_ZLIB "Use libz" ON)
set(LIBXML2_XMLCONF_WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Working directory for XML Conformance Test Suite")

if(LIBXML2_WITH_PYTHON)
	check_include_files(unistd.h HAVE_UNISTD_H)
	check_symbol_exists(F_GETFL fcntl.h HAVE_F_GETFL)
	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_FTP WITH_HTML WITH_HTTP WITH_ICONV WITH_ICU WITH_ISO8859X WITH_LEGACY WITH_LZMA WITH_MEM_DEBUG 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_TRIO WITH_UNICODE WITH_VALID WITH_WRITER WITH_XINCLUDE WITH_XPATH WITH_XPTR WITH_XPTR_LOCS 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_BUGREPORT "xml@gnome.org")
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()

if (NOT MSVC)
	check_c_source_compiles("
		void __attribute__((destructor))
		f(void) {}
		int main(void) { return 0; }
	" HAVE_ATTRIBUTE_DESTRUCTOR)
	if(HAVE_ATTRIBUTE_DESTRUCTOR)
		set(ATTRIBUTE_DESTRUCTOR "__attribute__((destructor))")
	endif()
	check_include_files(arpa/inet.h HAVE_ARPA_INET_H)
	check_function_exists(class HAVE_CLASS)
	check_include_files(dlfcn.h HAVE_DLFCN_H)
	check_library_exists(dl dlopen "" HAVE_DLOPEN)
	check_include_files(dl.h HAVE_DL_H)
	check_include_files(fcntl.h HAVE_FCNTL_H)
	check_function_exists(fpclass HAVE_FPCLASS)
	check_function_exists(ftime HAVE_FTIME)
	check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
	check_include_files(inttypes.h HAVE_INTTYPES_H)
	check_function_exists(isascii HAVE_ISASCII)
	check_library_exists(history append_history "" HAVE_LIBHISTORY)
	check_library_exists(readline readline "" HAVE_LIBREADLINE)
	check_function_exists(mmap HAVE_MMAP)
	check_function_exists(munmap HAVE_MUNMAP)
	check_include_files(netdb.h HAVE_NETDB_H)
	check_include_files(netinet/in.h HAVE_NETINET_IN_H)
	check_include_files(poll.h HAVE_POLL_H)
	check_library_exists(dld shl_load "" HAVE_SHLLOAD)
	check_function_exists(stat HAVE_STAT)
	check_include_files(stdint.h HAVE_STDINT_H)
	check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
	check_include_files(sys/select.h HAVE_SYS_SELECT_H)
	check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
	check_include_files(sys/stat.h HAVE_SYS_STAT_H)
	check_include_files(sys/timeb.h HAVE_SYS_TIMEB_H)
	check_include_files(sys/time.h HAVE_SYS_TIME_H)
	check_include_files(unistd.h HAVE_UNISTD_H)
	check_symbol_exists(va_copy stdarg.h HAVE_VA_COPY)
	check_symbol_exists(__va_copy stdarg.h HAVE___VA_COPY)
	set(LT_OBJDIR ".libs/")
	check_c_source_compiles("
		#include <stdarg.h>
		void a(va_list* ap) {};
		int main() { va_list ap1, ap2; a(&ap1); ap2 = (va_list) ap1; return 0; }
	" VA_LIST_IS_ARRAY_TEST)
	if(VA_LIST_IS_ARRAY_TEST)
		set(VA_LIST_IS_ARRAY FALSE)
	else()
		set(VA_LIST_IS_ARRAY TRUE)
	endif()
	check_c_source_compiles("
		#include <stddef.h>
		#include <sys/socket.h>
		int main() { (void) getsockopt(1, 1, 1, NULL, (socklen_t*) NULL); return 0; }
	" XML_SOCKLEN_T_SOCKLEN_T)
	if(XML_SOCKLEN_T_SOCKLEN_T)
		set(XML_SOCKLEN_T socklen_t)
	else()
		check_c_source_compiles("
			#include <stddef.h>
			#include <sys/socket.h>
			int main() { (void) getsockopt(1, 1, 1, NULL, (size_t*) NULL); return 0; }
		" XML_SOCKLEN_T_SIZE_T)
		if(XML_SOCKLEN_T_SIZE_T)
			set(XML_SOCKLEN_T size_t)
		else()
			check_c_source_compiles("
				#include <stddef.h>
				#include <sys/socket.h>
				int main() { (void) getsockopt (1, 1, 1, NULL, (int*) NULL); return 0; }
			" XML_SOCKLEN_T_INT)
			set(XML_SOCKLEN_T int)
		endif()
	endif()
endif()

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()

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
	nanoftp.c
	nanohttp.c
	parser.c
	parserInternals.c
	pattern.c
	relaxng.c
	SAX.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()

if(LIBXML2_WITH_TRIO)
	list(APPEND LIBXML2_SRCS trio.c triostr.c)
endif()

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

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

if(LIBXML2_WITH_THREADS)
	target_compile_definitions(LibXml2 PRIVATE _REENTRANT)
        if(NOT WIN32)
		check_include_files(pthread.h HAVE_PTHREAD_H)
	endif()
endif()

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)
	if(HAVE_DLOPEN)
		target_link_libraries(LibXml2 PRIVATE dl)
		set(MODULE_PLATFORM_LIBS "-ldl")
	endif()

	if(HAVE_SHLLOAD)
		target_link_libraries(LibXml2 PRIVATE dld)
		set(MODULE_PLATFORM_LIBS "-ldld")
	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")
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")

	if(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_target_properties(
	LibXml2
	PROPERTIES
	IMPORT_PREFIX lib
	OUTPUT_NAME xml2
	POSITION_INDEPENDENT_CODE ON
	PREFIX lib
	VERSION ${PROJECT_VERSION}
        SOVERSION ${LIBXML_MAJOR_VERSION}
)

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)
	set(
		PROGRAMS
		xmlcatalog
		xmllint
	)
	foreach(PROGRAM ${PROGRAMS})
		add_executable(${PROGRAM} ${PROGRAM}.c)
		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
		testThreads
	)
	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 testThreads)
			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)
	add_test(NAME testrecurse COMMAND testrecurse WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
	add_test(NAME testThreads COMMAND testThreads 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)
install(FILES doc/xmlcatalog.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
install(FILES doc/xmllint.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT documentation
	PATTERN "Makefile.*" 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
)

if(MSVC)
	configure_file(include/win32config.h config.h COPYONLY)
else()
	configure_file(config.h.cmake.in config.h)
endif()
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}")
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()
	target_compile_definitions(LibXml2 PUBLIC LIBXML_STATIC)
	set(XML_CFLAGS "-DLIBXML_STATIC")
	set(XML_PRIVATE_LIBS_NO_SHARED "${XML_PRIVATE_LIBS}")
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)

if(UNIX)
	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/libxml.m4 DESTINATION ${CMAKE_INSTALL_DATADIR}/aclocal)
endif()

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_CONTACT ${PACKAGE_BUGREPORT})
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)
