2017-04-06 07:07:40 +08:00
cmake_minimum_required ( VERSION 3.8 )
project ( libxml2 C )
2021-03-23 06:52:17 +08:00
set ( WITH_TRIO 0 CACHE BOOL "Add trio support" )
set ( WITH_THREADS 1 CACHE BOOL "Add multithread support" )
set ( WITH_THREAD_ALLOC 0 CACHE BOOL "Add per-thread memory" )
set ( WITH_TREE 1 CACHE BOOL "Add the DOM like tree manipulation APIs" )
set ( WITH_OUTPUT 1 CACHE BOOL "Add the serialization support" )
set ( WITH_PUSH 1 CACHE BOOL "Add the PUSH parser interfaces" )
set ( WITH_READER 1 CACHE BOOL "Add the xmlReader parsing interface" )
set ( WITH_PATTERN 1 CACHE BOOL "Add the xmlPattern selection interface" )
set ( WITH_WRITER 1 CACHE BOOL "Add the xmlWriter saving interface" )
set ( WITH_SAX1 1 CACHE BOOL "Add the older SAX1 interface" )
set ( WITH_VALID 1 CACHE BOOL "Add the DTD validation support" )
set ( WITH_HTML 1 CACHE BOOL "Add the HTML support" )
set ( WITH_LEGACY 1 CACHE BOOL "Add deprecated APIs for compatibility" )
set ( WITH_C14N 1 CACHE BOOL "Add the Canonicalization support" )
set ( WITH_CATALOG 1 CACHE BOOL "Add the Catalog support" )
set ( WITH_DOCB 1 CACHE BOOL "Add Docbook SGML support" )
set ( WITH_XPATH 1 CACHE BOOL "Add the XPATH support" )
set ( WITH_XPTR 1 CACHE BOOL "Add the XPointer support" )
set ( WITH_XINCLUDE 1 CACHE BOOL "Add the XInclude support" )
set ( WITH_ICONV 1 CACHE BOOL "Add ICONV support" )
set ( WITH_ICU 0 CACHE BOOL "Add ICU support" )
set ( WITH_ISO8859X 1 CACHE BOOL "Add ISO8859X support if no iconv" )
set ( WITH_DEBUG 1 CACHE BOOL "Add the memory debugging module" )
set ( WITH_MEM_DEBUG 0 CACHE BOOL "Add the memory debugging module" )
set ( WITH_RUN_DEBUG 0 CACHE BOOL "Add the runtime debugging module" )
set ( WITH_REGEXPS 1 CACHE BOOL "Add Regular Expressions support" )
set ( WITH_SCHEMAS 1 CACHE BOOL "Add Relax-NG and Schemas support" )
set ( WITH_SCHEMATRON 1 CACHE BOOL "Add Schematron support" )
set ( WITH_MODULES 1 CACHE BOOL "Add the dynamic modules support" )
set ( WITH_ZLIB 1 CACHE BOOL "Add zlib support" )
set ( WITH_LZMA 1 CACHE BOOL "Add liblzma support" )
set ( WITH_HTTP 1 CACHE BOOL "Add the HTTP support" )
set ( WITH_FTP 1 CACHE BOOL "Add the FTP support" )
2017-04-06 07:07:40 +08:00
option ( INSTALL_HEADERS "Install public header files" ON )
2021-03-23 06:52:17 +08:00
set ( MODULE_EXTENSION ".so" )
2018-04-04 06:59:54 +08:00
set ( CMAKE_SHARED_LIBRARY_PREFIX )
set ( CMAKE_STATIC_LIBRARY_PREFIX )
2017-04-06 07:07:40 +08:00
find_package ( ZLIB REQUIRED )
find_package ( LibLZMA REQUIRED )
2020-11-18 01:18:59 +08:00
find_package ( Iconv REQUIRED )
2017-04-06 07:07:40 +08:00
2018-04-04 06:59:54 +08:00
file ( GLOB SOURCES *.c )
list ( FILTER SOURCES EXCLUDE REGEX "/(run|test|trio)[^/]*$" )
list ( FILTER SOURCES EXCLUDE REGEX "xml(lint|catalog).c$" )
2019-03-16 06:29:08 +08:00
list ( FILTER SOURCES EXCLUDE REGEX "rngparser\.c$" )
2017-04-06 07:07:40 +08:00
# Generate xmlexports with fixed definition of LIBXML_STATIC
file ( READ include/libxml/xmlexports.h XMLEXPORTS_H )
if ( BUILD_SHARED_LIBS )
string ( REPLACE "!defined(LIBXML_STATIC)" "1" XMLEXPORTS_H "${XMLEXPORTS_H}" )
else ( )
string ( REPLACE "!defined(LIBXML_STATIC)" "0" XMLEXPORTS_H "${XMLEXPORTS_H}" )
endif ( )
file ( WRITE ${ CMAKE_CURRENT_BINARY_DIR } /xmlexports.h "${XMLEXPORTS_H}" )
2019-03-16 06:29:08 +08:00
if ( CMAKE_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" )
2018-04-04 06:59:54 +08:00
configure_file ( include/win32config.h config.h COPYONLY )
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
configure_file ( "${PORT_DIR}/config.osx.h" config.h COPYONLY )
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Linux" )
configure_file ( "${PORT_DIR}/config.linux.h" config.h COPYONLY )
else ( )
message ( FATAL_ERROR "No config.h checked in for the target platform. Please run ./configure for libxml2 and add the resulting config.h into this port." )
endif ( )
2017-04-06 07:07:40 +08:00
2019-03-16 06:29:08 +08:00
message ( STATUS "Reading version info from configure.ac" )
file ( STRINGS "configure.ac"
_ l i b x m l _ v e r s i o n _ d e f i n e s R E G E X " LIBXML_ ( MAJOR|MINOR|MICRO ) _ V E R S I O N = ( [ 0 - 9 ] + ) $ " )
foreach ( ver ${ _libxml_version_defines } )
if ( ver MATCHES "LIBXML_(MAJOR|MINOR|MICRO)_VERSION=([0-9]+)$" )
set ( LIBXML_ ${ CMAKE_MATCH_1 } _VERSION "${CMAKE_MATCH_2}" CACHE INTERNAL "" )
endif ( )
endforeach ( )
set ( VERSION ${ LIBXML_MAJOR_VERSION } . ${ LIBXML_MINOR_VERSION } . ${ LIBXML_MICRO_VERSION } )
math ( EXPR LIBXML_VERSION_NUMBER
" $ { L I B X M L _ M A J O R _ V E R S I O N } * 1 0 0 0 0 + $ { L I B X M L _ M I N O R _ V E R S I O N } * 1 0 0 + $ { L I B X M L _ M I C R O _ V E R S I O N } " )
message ( STATUS "LIBXML_MAJOR_VERSION: ${LIBXML_MAJOR_VERSION}" )
message ( STATUS "LIBXML_MINOR_VERSION: ${LIBXML_MINOR_VERSION}" )
message ( STATUS "LIBXML_MICRO_VERSION: ${LIBXML_MICRO_VERSION}" )
message ( STATUS "VERSION: ${VERSION}" )
message ( STATUS "LIBXML_VERSION_NUMBER: ${LIBXML_VERSION_NUMBER}" )
if ( CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" )
set ( WITH_CATALOG 0 )
set ( WITH_MODULES 0 )
endif ( )
message ( STATUS "Generating xmlversion.h" )
configure_file ( include/libxml/xmlversion.h.in include/libxml/xmlversion.h )
2017-04-06 07:07:40 +08:00
add_library ( libxml2 ${ SOURCES } )
if ( INSTALL_HEADERS )
2019-03-16 06:29:08 +08:00
file ( GLOB PUBLIC_HEADERS include/libxml/*.h ${ CMAKE_CURRENT_BINARY_DIR } /include/libxml/xmlversion.h )
2018-04-04 06:59:54 +08:00
list ( FILTER PUBLIC_HEADERS EXCLUDE REGEX "xmlexports\\.h$" )
list ( APPEND PUBLIC_HEADERS ${ CMAKE_CURRENT_BINARY_DIR } /xmlexports.h )
2017-04-06 07:07:40 +08:00
set_target_properties ( libxml2 PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" )
endif ( )
2019-03-16 06:29:08 +08:00
target_include_directories ( libxml2 PRIVATE ${ CMAKE_CURRENT_BINARY_DIR } ${ CMAKE_CURRENT_BINARY_DIR } /include include ${ LIBLZMA_INCLUDE_DIRS } )
2020-12-10 03:58:59 +08:00
get_property ( LIBRARIES TARGET Iconv::Iconv PROPERTY INTERFACE_LINK_LIBRARIES )
if ( LIBRARIES )
set_property ( TARGET Iconv::Iconv PROPERTY INTERFACE_LINK_LIBRARIES "" )
foreach ( LIBRARY ${ LIBRARIES } )
# Since `libc.so` has no SONAME, CMake maps e.g. `/usr/lib/x86_64-linux-gnu/libc.so` to `-llibc`.
# This is not found: it should be mapped to `-lc`.
if ( LIBRARY MATCHES "/libc\\.so$" )
set_property ( TARGET Iconv::Iconv APPEND PROPERTY INTERFACE_LINK_LIBRARIES "c" )
else ( )
set_property ( TARGET Iconv::Iconv APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${LIBRARY}" )
endif ( )
endforeach ( )
endif ( )
2017-04-06 07:07:40 +08:00
target_link_libraries ( libxml2 PRIVATE
2020-11-18 01:18:59 +08:00
I c o n v : : I c o n v
2017-04-06 07:07:40 +08:00
Z L I B : : Z L I B
$ { L I B L Z M A _ L I B R A R I E S }
)
2019-03-16 06:29:08 +08:00
if ( CMAKE_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" )
2018-04-04 06:59:54 +08:00
target_include_directories ( libxml2 PRIVATE win32/vc10 )
2018-03-12 14:41:51 +08:00
target_link_libraries ( libxml2 PRIVATE
w s o c k 3 2 . l i b
w s 2 _ 3 2 . l i b
)
target_compile_definitions ( libxml2 PRIVATE
- D H A V E _ W I N 3 2 _ T H R E A D S
2019-03-16 06:29:08 +08:00
_ W I N S O C K _ D E P R E C A T E D _ N O _ W A R N I N G S
2018-03-12 14:41:51 +08:00
)
2020-01-17 05:33:22 +08:00
target_sources ( libxml2 PRIVATE win32/libxml2.rc )
set_source_files_properties ( win32/libxml2.rc PROPERTIES COMPILE_FLAGS "-DLIBXML_MAJOR_VERSION=${LIBXML_MAJOR_VERSION} -DLIBXML_MINOR_VERSION=${LIBXML_MINOR_VERSION} -DLIBXML_MICRO_VERSION=${LIBXML_MICRO_VERSION} -DLIBXML_DOTTED_VERSION=\\\" ${ VERSION } \\\"")
2018-03-12 14:41:51 +08:00
endif ( )
2017-04-06 07:07:40 +08:00
target_compile_definitions ( libxml2 PRIVATE
- D _ C R T _ S E C U R E _ N O _ D E P R E C A T E
- D _ C R T _ N O N S T D C _ N O _ D E P R E C A T E
- D _ R E E N T R A N T
- D N O L I B T O O L
- D H A V E _ Z L I B _ H
- D H A V E _ L Z M A _ H
)
if ( NOT BUILD_SHARED_LIBS )
target_compile_definitions ( libxml2 PRIVATE -DLIBXML_STATIC )
endif ( )
set ( TARGET_INSTALL_OPTIONS )
if ( INSTALL_HEADERS )
set ( TARGET_INSTALL_OPTIONS PUBLIC_HEADER DESTINATION include/libxml )
endif ( )
install ( TARGETS libxml2
R U N T I M E D E S T I N A T I O N b i n
L I B R A R Y D E S T I N A T I O N l i b
A R C H I V E D E S T I N A T I O N l i b
$ { T A R G E T _ I N S T A L L _ O P T I O N S }
)
2020-11-12 07:28:09 +08:00
# pkgconfig
set ( prefix ${ CMAKE_INSTALL_PREFIX } )
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_BINARY_DIR } /libxml-2.0.pc DESTINATION lib/pkgconfig )