1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-12-24 21:33:51 +03:00

meson: Initial commit

This commit is contained in:
Vincent Torri 2024-04-04 12:14:46 +02:00 committed by Nick Wellnhofer
parent 650f842dbe
commit 5732ce56f3
23 changed files with 1647 additions and 9 deletions

View File

@ -274,6 +274,18 @@ cmake:msvc:v141:x86:static:
BUILD_SHARED_LIBS: "OFF" BUILD_SHARED_LIBS: "OFF"
SUFFIX: static SUFFIX: static
meson:
image: registry.gitlab.gnome.org/gnome/libxml2
script:
- sh .gitlab-ci/test_meson.sh
cmake:linux:gcc:shared:
extends: .cmake:linux
variables:
BUILD_SHARED_LIBS: "ON"
CC: gcc
SUFFIX: linux-gcc-shared
pages: pages:
script: script:
- mkdir -p public - mkdir -p public

17
.gitlab-ci/test_meson.sh Normal file
View File

@ -0,0 +1,17 @@
#!/bin/sh
set -e
# compile with the following warnings:
# --warnlevel 3 : passes to the compiler -Wall -Wextra -Wpedantic
# --werror : passes to the compiler -Werror
# --default-library : can be 'shared', 'static' or 'both'
meson setup \
--warnlevel 3 \
--werror \
--buildtype=debugoptimized \
--default-library shared \
builddir
ninja -C builddir test

View File

@ -387,7 +387,8 @@ EXTRA_DIST = Copyright check-xml-test-suite.py gentest.py \
dbgen.pl dbgenattr.pl \ dbgen.pl dbgenattr.pl \
libxml2.syms timsort.h \ libxml2.syms timsort.h \
README.zOS README.md \ README.zOS README.md \
CMakeLists.txt config.h.cmake.in libxml2-config.cmake.cmake.in CMakeLists.txt config.h.cmake.in libxml2-config.cmake.cmake.in \
meson.build meson_options.txt
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig

View File

@ -21,8 +21,8 @@ This code is released under the MIT License, see the Copyright file.
## Build instructions ## Build instructions
libxml2 can be built with GNU Autotools, CMake, or several other build libxml2 can be built with GNU Autotools, CMake, meson or several other
systems in platform-specific subdirectories. build systems in platform-specific subdirectories.
### Autotools (for POSIX systems like Linux, BSD, macOS) ### Autotools (for POSIX systems like Linux, BSD, macOS)
@ -121,6 +121,25 @@ Common CMake options include:
You can also open the libxml source directory with its CMakeLists.txt You can also open the libxml source directory with its CMakeLists.txt
directly in various IDEs such as CLion, QtCreator, or Visual Studio. directly in various IDEs such as CLion, QtCreator, or Visual Studio.
### Meson
Libxml can also be built with meson. Without option, simply call
meson setup builddir
ninja -C builddir
To add options, see the meson_options.txt file. For example:
meson setup -Dprefix=$prefix -Dftp=true -Dhistory=true -Dicu=true -Dhttp=true builddir
To install libxml:
ninja -C builddir install
To launch tests:
meson test -C builddir
## Dependencies ## Dependencies
Libxml does not require any other libraries. A platform with somewhat Libxml does not require any other libraries. A platform with somewhat

View File

@ -60,7 +60,8 @@ EXTRA_DIST = \
apibuild.py \ apibuild.py \
libxml2-api.xml \ libxml2-api.xml \
xmlcatalog.xml \ xmlcatalog.xml \
xmllint.xml xmllint.xml \
meson.build
DOCBOOK_HTML = http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl DOCBOOK_HTML = http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl

View File

@ -65,7 +65,7 @@ EXTRA_FORMAT= \
up.png \ up.png \
style.css style.css
EXTRA_DIST = devhelp2.xsl html.xsl EXTRA_DIST = devhelp2.xsl html.xsl meson.build
rebuild: rebuild:
(cd $(srcdir) && $(XSLTPROC) -o libxml2.devhelp2 devhelp2.xsl ../libxml2-api.xml) (cd $(srcdir) && $(XSLTPROC) -o libxml2.devhelp2 devhelp2.xsl ../libxml2-api.xml)

61
doc/devhelp/meson.build Normal file
View File

@ -0,0 +1,61 @@
html_files = files(
'general.html',
'index.html',
)
html_modules = files(
'libxml2-HTMLparser.html',
'libxml2-HTMLtree.html',
'libxml2-SAX.html',
'libxml2-SAX2.html',
'libxml2-c14n.html',
'libxml2-catalog.html',
'libxml2-chvalid.html',
'libxml2-debugXML.html',
'libxml2-dict.html',
'libxml2-encoding.html',
'libxml2-entities.html',
'libxml2-globals.html',
'libxml2-hash.html',
'libxml2-list.html',
'libxml2-nanoftp.html',
'libxml2-nanohttp.html',
'libxml2-parser.html',
'libxml2-parserInternals.html',
'libxml2-pattern.html',
'libxml2-relaxng.html',
'libxml2-schemasInternals.html',
'libxml2-schematron.html',
'libxml2-threads.html',
'libxml2-tree.html',
'libxml2-uri.html',
'libxml2-valid.html',
'libxml2-xinclude.html',
'libxml2-xlink.html',
'libxml2-xmlIO.html',
'libxml2-xmlautomata.html',
'libxml2-xmlerror.html',
'libxml2-xmlexports.html',
'libxml2-xmlmemory.html',
'libxml2-xmlmodule.html',
'libxml2-xmlreader.html',
'libxml2-xmlregexp.html',
'libxml2-xmlsave.html',
'libxml2-xmlschemas.html',
'libxml2-xmlschemastypes.html',
'libxml2-xmlstring.html',
'libxml2-xmlunicode.html',
'libxml2-xmlversion.html',
'libxml2-xmlwriter.html',
'libxml2-xpath.html',
'libxml2-xpathInternals.html',
'libxml2-xpointer.html',
'libxml2.devhelp2',
)
extra_files = files('home.png', 'left.png', 'right.png', 'style.css', 'up.png')
devhelp = [files('libxml2.devhelp2'), html_files, html_modules, extra_files]
install_data(devhelp, install_dir: dir_data / 'gtk-doc' / 'html' / 'libxml2')

View File

@ -28,7 +28,8 @@ EXTRA_DIST = \
index.py \ index.py \
test1.xml \ test1.xml \
test2.xml \ test2.xml \
test3.xml test3.xml \
meson.build
check_PROGRAMS = \ check_PROGRAMS = \
io1 \ io1 \

59
doc/examples/meson.build Normal file
View File

@ -0,0 +1,59 @@
## tests
example_checks = [
['io1', ''],
['io2', ''],
['parse1', 'test1.xml'],
['parse2', 'test2.xml'],
['parse3', ''],
['parse4', 'test3.xml'],
['reader1', 'test2.xml'],
['reader2', 'test2.xml'],
['reader3', ''],
['reader4', ['test1.xml', 'test2.xml', 'test3.xml']],
['testWriter', ''],
['tree1', 'test2.xml'],
['tree2', ''],
['xpath1', ['test3.xml', '//child2']],
['xpath2', ['test3.xml', '//discarded', 'discarded']],
]
foreach check : example_checks
exe = executable(
check[0],
files(check[0] + '.c'),
dependencies: xml_dep,
include_directories: config_dir,
)
test(
check[0],
exe,
args: check[1],
timeout: 0,
workdir: meson.current_source_dir(),
)
endforeach
## example files
example_files = files(
'index.html',
'io1.c',
'io2.c',
'parse1.c',
'parse2.c',
'parse3.c',
'parse4.c',
'reader1.c',
'reader2.c',
'reader3.c',
'reader4.c',
'testWriter.c',
'tree1.c',
'tree2.c',
'xpath1.c',
'xpath2.c',
)
install_data(example_files, install_dir: dir_doc / 'examples')

14
doc/meson.build Normal file
View File

@ -0,0 +1,14 @@
install_man(files(['xml2-config.1', 'xmlcatalog.1', 'xmllint.1']))
tutorial_files = files(
'xmlcatalog.html',
'xmllint.html',
)
install_data(tutorial_files, install_dir: dir_doc)
subdir('devhelp')
subdir('examples')
subdir('tutorial')

82
doc/tutorial/meson.build Normal file
View File

@ -0,0 +1,82 @@
tutorial_files = files(
'apa.html',
'apb.html',
'apc.html',
'apd.html',
'ape.html',
'apf.html',
'apg.html',
'aph.html',
'api.html',
'ar01s02.html',
'ar01s03.html',
'ar01s04.html',
'ar01s05.html',
'ar01s06.html',
'ar01s07.html',
'ar01s08.html',
'ar01s09.html',
'includeaddattribute.c',
'includeaddkeyword.c',
'includeconvert.c',
'includegetattribute.c',
'includekeyword.c',
'includexpath.c',
'index.html',
'ix01.html',
)
install_data(tutorial_files, install_dir: dir_doc / 'tutorial')
tutorial_image_files = files(
'images/blank.png',
'images/caution.png',
'images/draft.png',
'images/home.png',
'images/important.png',
'images/next.png',
'images/note.png',
'images/prev.png',
'images/tip.png',
'images/toc-blank.png',
'images/toc-minus.png',
'images/toc-plus.png',
'images/up.png',
'images/warning.png',
)
install_data(tutorial_image_files, install_dir: dir_doc / 'tutorial' / 'images')
tutorial_image_files = files(
'images/blank.png',
'images/caution.png',
'images/draft.png',
'images/home.png',
'images/important.png',
'images/next.png',
'images/note.png',
'images/prev.png',
'images/tip.png',
'images/toc-blank.png',
'images/toc-minus.png',
'images/toc-plus.png',
'images/up.png',
'images/warning.png',
)
install_data(tutorial_image_files, install_dir: dir_doc / 'tutorial' / 'images')
tutorial_image_files = files(
'images/callouts/1.png',
'images/callouts/10.png',
'images/callouts/2.png',
'images/callouts/3.png',
'images/callouts/4.png',
'images/callouts/5.png',
'images/callouts/6.png',
'images/callouts/7.png',
'images/callouts/8.png',
'images/callouts/9.png',
)
install_data(tutorial_image_files, install_dir: dir_doc / 'tutorial' / 'images' / 'callouts')

View File

@ -4,3 +4,5 @@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
LDADD = $(top_builddir)/libxml2.la LDADD = $(top_builddir)/libxml2.la
gjobread_SOURCES=gjobread.c gjobread_SOURCES=gjobread.c
EXTRA_DIST = meson.build

8
example/meson.build Normal file
View File

@ -0,0 +1,8 @@
exe = executable(
'gjobread',
files('gjobread.c'),
dependencies: xml_dep,
include_directories: config_dir,
)
test('gjobread', exe, timeout: 0)

View File

@ -1,5 +1,5 @@
## Process this file with automake to produce Makefile.in ## Process this file with automake to produce Makefile.in
SUBDIRS=libxml private SUBDIRS=libxml private
EXTRA_DIST = win32config.h wsockcompat.h EXTRA_DIST = win32config.h wsockcompat.h meson.build

View File

@ -51,4 +51,4 @@ xmlinc_HEADERS = \
nodist_xmlinc_HEADERS = xmlversion.h nodist_xmlinc_HEADERS = xmlversion.h
EXTRA_DIST = xmlversion.h.in EXTRA_DIST = xmlversion.h.in meson.build

102
include/libxml/meson.build Normal file
View File

@ -0,0 +1,102 @@
## xmlversion.h
xmlversion_h = configuration_data()
xmlversion_h.set('VERSION', meson.project_version())
xmlversion_h.set('LIBXML_VERSION_NUMBER', v_nbr.to_string())
xmlversion_h.set('LIBXML_VERSION_EXTRA', v_extra)
xmlversion_h.set10('WITH_C14N', want_c14n)
xmlversion_h.set10('WITH_CATALOG', want_catalog)
xmlversion_h.set10('WITH_DEBUG', want_debug)
xmlversion_h.set10('WITH_FTP', want_ftp)
xmlversion_h.set10('WITH_HTML', want_html)
xmlversion_h.set10('WITH_HTTP', want_http)
xmlversion_h.set10('WITH_ICONV', want_iconv)
xmlversion_h.set10('WITH_ICU', want_icu)
xmlversion_h.set10('WITH_ISO8859X', want_iso8859x)
xmlversion_h.set10('WITH_LEGACY', want_legacy)
xmlversion_h.set10('WITH_LZMA', want_lzma)
xmlversion_h.set10('WITH_MODULES', with_modules)
xmlversion_h.set('MODULE_EXTENSION', module_extension)
xmlversion_h.set10('WITH_MEM_DEBUG', want_mem_debug)
xmlversion_h.set10('WITH_OUTPUT', want_output)
xmlversion_h.set10('WITH_PATTERN', want_pattern)
xmlversion_h.set10('WITH_PUSH', want_push)
xmlversion_h.set10('WITH_READER', want_reader)
xmlversion_h.set10('WITH_REGEXPS', want_regexps)
xmlversion_h.set10('WITH_SAX1', want_sax1)
xmlversion_h.set10('WITH_SCHEMAS', want_schemas)
xmlversion_h.set10('WITH_SCHEMATRON', want_schematron)
xmlversion_h.set10('WITH_THREADS', want_threads)
xmlversion_h.set10('WITH_THREAD_ALLOC', want_thread_alloc)
xmlversion_h.set10('WITH_TREE', want_tree)
xmlversion_h.set10('WITH_VALID', want_valid)
xmlversion_h.set10('WITH_WRITER', want_writer)
xmlversion_h.set10('WITH_XINCLUDE', want_xinclude)
xmlversion_h.set10('WITH_XPATH', want_xpath)
xmlversion_h.set10('WITH_XPTR', want_xptr)
xmlversion_h.set10('WITH_XPTR_LOCS', want_xptr_locs)
xmlversion_h.set10('WITH_ZLIB', want_zlib)
configure_file(
input: 'xmlversion.h.in',
output: 'xmlversion.h',
configuration: xmlversion_h,
install_dir: dir_pkginclude + '/libxml',
)
#vcs_tag(
# command : [ 'git', 'describe', '2>/dev/null' ],
# input : 'xmlversion.h.in',
# output : 'xmlversion.h',
# replace_string : 'LIBXML_VERSION_EXTRA'
#)
libxml_headers = files(
'HTMLparser.h',
'HTMLtree.h',
'SAX.h',
'SAX2.h',
'c14n.h',
'catalog.h',
'chvalid.h',
'debugXML.h',
'dict.h',
'encoding.h',
'entities.h',
'globals.h',
'hash.h',
'list.h',
'nanoftp.h',
'nanohttp.h',
'parser.h',
'parserInternals.h',
'pattern.h',
'relaxng.h',
'schemasInternals.h',
'schematron.h',
'threads.h',
'tree.h',
'uri.h',
'valid.h',
'xinclude.h',
'xlink.h',
'xmlIO.h',
'xmlautomata.h',
'xmlerror.h',
'xmlexports.h',
'xmlmemory.h',
'xmlmodule.h',
'xmlreader.h',
'xmlregexp.h',
'xmlsave.h',
'xmlschemas.h',
'xmlschemastypes.h',
'xmlstring.h',
'xmlunicode.h',
'xmlwriter.h',
'xpath.h',
'xpathInternals.h',
'xpointer.h',
)
install_headers(libxml_headers, install_dir: dir_pkginclude / 'libxml')

2
include/meson.build Normal file
View File

@ -0,0 +1,2 @@
inc_dir = include_directories('.')

875
meson.build Normal file
View File

@ -0,0 +1,875 @@
project(
'libxml2',
'c',
version: '2.13.0',
license: 'MIT',
default_options: ['buildtype=debug', 'warning_level=3'],
meson_version: '>= 0.61',
)
v_array = meson.project_version().split('.')
v_maj = v_array[0]
v_min = v_array[1]
v_mic = v_array[2]
v_nbr = v_maj.to_int() * 10000 + v_min.to_int() * 100 + v_mic.to_int()
v_extra = ''
r = run_command('git', 'describe', check: false)
if (r.returncode() == 0)
v_extra = '-GIT' + r.stdout().strip()
endif
# install paths
dir_prefix = get_option('prefix')
dir_bin = dir_prefix / get_option('bindir')
dir_include = dir_prefix / get_option('includedir')
dir_pkginclude = dir_include / meson.project_name()
dir_lib = dir_prefix / get_option('libdir')
dir_data = dir_prefix / get_option('datadir')
dir_doc = dir_data / 'doc' / 'libxml2'
dir_locale = dir_prefix / get_option('localedir')
# host
host_os = host_machine.system()
cygwin = 'cygwin'
windows = 'windows'
sys_cygwin = cygwin.contains(host_os)
sys_windows = windows.contains(host_os)
libxml2_cflags = []
xml_cflags = ''
if sys_cygwin or sys_windows
if get_option('default_library') == 'static'
xml_cflags = '-DLIBXML_STATIC'
libxml2_cflags += '-DLIBXML_STATIC'
endif
endif
# binaries
cc = meson.get_compiler('c')
cc.has_type('uint32_t', prefix: '#include <stdint.h>')
# options
want_c14n = get_option('c14n')
want_catalog = get_option('catalog')
want_debug = get_option('debuging')
want_fexceptions = get_option('fexceptions')
want_ftp = get_option('ftp')
want_history = get_option('history')
want_html = get_option('html')
want_http = get_option('http')
want_iconv = get_option('iconv')
want_icu = get_option('icu')
want_ipv6 = get_option('ipv6')
want_iso8859x = get_option('iso8859x')
want_legacy = get_option('legacy')
want_lzma = get_option('lzma')
want_mem_debug = get_option('mem-debug')
want_modules = get_option('modules')
want_output = get_option('output')
want_pattern = get_option('pattern')
want_push = get_option('push')
want_python = get_option('python')
want_reader = get_option('reader')
want_readline = get_option('readline')
want_regexps = get_option('regexps')
want_run_debug = get_option('run-debug')
want_sax1 = get_option('sax1')
want_schemas = get_option('schemas')
want_schematron = get_option('schematron')
want_threads = get_option('threads')
want_thread_alloc = get_option('thread-alloc')
want_tls = get_option('tls')
want_tree = get_option('tree')
want_valid = get_option('valid')
want_writer = get_option('writer')
want_xinclude = get_option('xinclude')
want_xpath = get_option('xpath')
want_xptr = get_option('xptr')
want_xptr_locs = get_option('xptr-locs')
want_zlib = get_option('zlib')
# hard dependencies on options
if want_c14n == true
if want_output == false
message('-Dc14n=true overrides -Doutput')
endif
want_output = true
if want_xpath == false
message('-Dc14n=true overrides -Dxpath')
endif
want_xpath = true
endif
if want_schemas == true
if want_pattern == false
message('-Dschemas=true overrides -Dpattern')
endif
want_pattern = true
if want_regexps == false
message('-Dschemas=true overrides -Dregexps')
endif
want_regexps = true
endif
if want_schematron == true
if want_pattern == false
message('-Dschematron=true overrides -Dpattern')
endif
want_pattern = true
if want_tree == false
message('-Dschematron=true overrides -Dtree')
endif
want_tree = true
if want_xpath == false
message('-Dschematron=true overrides -Dxpath')
endif
want_xpath = true
endif
if want_reader == true
if want_push == false
message('-Dreader=true overrides -Dpush')
endif
want_push = true
if want_tree == false
message('-Dreader=true overrides -Dtree')
endif
want_tree = true
endif
if want_writer == true
if want_output == false
message('-Dwriter=true overrides -Doutput')
endif
want_output = true
if want_push == false
message('-Dwriter=true overrides -Dpush')
endif
want_push = true
endif
if want_xinclude == true
if want_xpath == false
message('-Dxinclude=true overrides -Dxpath')
endif
want_xpath = true
endif
if want_xptr_locs == true
if want_xptr == false
message('-Dxptr-locs=true overrides -Dxptr')
endif
want_xptr = true
endif
if want_xptr == true
if want_xpath == false
message('-Dxptr=true overrides -Dxpath')
endif
want_xpath = true
endif
# minimum dependencies
if get_option('minimum')
want_c14n = false
want_catalog = false
want_debug = false
want_fexceptions = false
want_history = false
want_html = false
want_http = false
want_iconv = false
want_ipv6 = false
want_iso8859x = false
want_lzma = false
want_mem_debug = false
want_modules = false
want_output = false
want_pattern = false
want_push = false
want_python = false
want_reader = false
want_readline = false
want_regexps = false
want_run_debug = false
want_sax1 = false
want_schemas = false
want_schematron = false
want_threads = false
want_thread_alloc = false
want_tree = false
want_valid = false
want_writer = false
want_xinclude = false
want_xpath = false
want_xptr = false
want_xptr_locs = false
want_zlib = false
else
# Disable dependent modules
if want_output == false
want_c14n = false
want_writer = false
endif
if want_pattern == false
want_schemas = false
want_schematron = false
endif
if want_push == false
want_reader = false
want_writer = false
endif
if want_regexps == false
want_schemas = false
endif
if want_tree == false
want_reader = false
want_schematron = false
endif
if want_xpath == false
want_c14n = false
want_schematron = false
want_xinclude = false
want_xptr = false
endif
endif
cflags_try = []
### workaround for native compilers, see configure.ac
if cc.get_argument_syntax() == 'gcc'
cflags_try += [
'-Wshadow',
'-Wpointer-arith',
'-Wcast-align',
'-Wwrite-strings',
'-Wstrict-prototypes',
'-Wmissing-prototypes',
'-Wno-long-long',
'-Wno-format-extra-args',
]
if want_fexceptions == true
cflags_try += '-fexceptions'
endif
if host_machine.cpu_family() == 'alpha'
cflags_try += '-mieee'
endif
else
if host_machine.cpu_family() == 'alpha'
cflags_try += '-ieee'
elif host_machine.cpu_family() == 'parisc'
cflags_try += '-Wp,-H30000'
endif
endif
foreach cf : cflags_try
if cc.has_argument(cf)
libxml2_cflags += cf
endif
endforeach
# configuration
#
# X : done
# N : not done
#
# [X] config.h.in
# [X] include/libxml/xmlversion.h.in
# [N] libxml-2.0-uninstalled.pc.in
# [X] libxml-2.0.pc.in
# [X] libxml2-config.cmake.in
# [X] python/setup.py.in
# [N] xml2-config.in
## config.h
config_h = configuration_data()
config_h.set_quoted('PACKAGE_NAME', meson.project_name())
config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
config_h.set_quoted('PACKAGE_BIN_DIR', dir_bin)
config_h.set_quoted('PACKAGE_LIB_DIR', dir_lib)
config_h.set_quoted('PACKAGE_DATA_DIR', dir_data)
config_h.set_quoted('LOCALEDIR', dir_locale)
# header files
xml_check_headers = [
'stdint.h',
'inttypes.h',
'fcntl.h',
'unistd.h',
'sys/stat.h',
'sys/mman.h',
'sys/socket.h',
'netinet/in.h',
'arpa/inet.h',
'netdb.h',
'sys/select.h',
'poll.h',
'sys/time.h',
'sys/timeb.h',
'dl.h',
'dlfcn.h',
'glob.h',
]
foreach header : xml_check_headers
if cc.has_header(header)
config_h.set10('HAVE_' + header.underscorify().to_upper(), true)
endif
endforeach
# library functions
xml_check_functions = [
# fct | header
['gettimeofday', 'sys/time.h'],
['ftime', 'sys/timeb.h'],
['stat', 'sys/stat.h'],
['isascii', 'ctype.h'],
['mmap', 'sys/mman.h'],
['munmap', 'sys/mman.h'],
]
foreach function : xml_check_functions
if cc.has_header_symbol(function[1], function[0])
config_h.set10('HAVE_' + function[0].to_upper(), true)
endif
endforeach
# library
config_dir = [include_directories('.'), include_directories('include')]
## dependencies
xml_deps = []
### math library
if sys_windows == false
m_dep = cc.find_library('m', required: false)
if m_dep.found()
xml_deps += m_dep
endif
endif
### thread local storage
support_tls = true
if want_tls == true
tls_src = '''
#include <threads.h>
int main()
{
_Thread_local int v;
return 0;
}
'''
res = cc.compiles(tls_src, name: '_Thread_local')
if res == true
config_h.set('XML_THREAD_LOCAL', '_Thread_local')
else
tls_src = '''
int main()
{
__thread int v;
return 0;
}
'''
res = cc.compiles(tls_src, name: '__thread')
if res == true
config_h.set('XML_THREAD_LOCAL', '__thread')
else
tls_src = '''
int main()
{
__declspec(thread) int v;
return 0;
}
'''
res = cc.compiles(tls_src, name: '__declspec(thread)')
if res == true
config_h.set('XML_THREAD_LOCAL', '__declspec(thread)')
else
want_tls = false
support_tls = false
endif
endif
endif
endif
### __attribute__((destructor))
if cc.has_function_attribute('destructor')
config_h.set10('HAVE_ATTRIBUTE_DESTRUCTOR', true)
config_h.set('ATTRIBUTE_DESTRUCTOR', '__attribute__((destructor))')
endif
### DSO support
with_modules = false
if want_modules == true
if sys_cygwin == true
module_extension = '.dll'
elif sys_windows == true
module_extension = '.dll'
with_modules = true
else
module_extension = '.so'
endif
if with_modules == false
dl_dep = dependency('dl', required: false)
if dl_dep.found()
config_h.set10('HAVE_DLOPEN', true)
xml_deps += dl_dep
with_modules = true
endif
endif
endif
### threads
if want_threads == true
if sys_windows == false
threads_dep = dependency('threads')
if threads_dep.found()
config_h.set10('HAVE_PTHREAD_H', true)
xml_deps += threads_dep
else
want_threads = false
endif
endif
endif
if want_threads == true
thread_cflags = '-D_REENTRANT'
libxml2_cflags += thread_cflags
endif
want_thread_alloc = (
(want_threads == true and want_threads == true) ? true : false
)
### xmllint shell history
xmllint_deps = []
if want_history == true and want_readline == true
termlib_lib = ['ncurses', 'curses', 'termcap', 'terminfo', 'termlib']
foreach tl : termlib_lib
termlib_dep = cc.find_library(tl)
if (
termlib_dep.found()
and cc.has_function('tputs', dependencies: termlib_dep)
)
xmllint_deps += termlib_dep
config_h.set10('HAVE_LIB' + tl.underscorify().to_upper(), true)
break
endif
endforeach
history_dep = dependency('history', required: false)
if history_dep.found()
xmllint_deps += history_dep
config_h.set10('HAVE_LIBHISTORY', true)
endif
readline_dep = dependency('readline', required: false)
if readline_dep.found()
xmllint_deps += readline_dep
config_h.set10('HAVE_LIBREADLINE', true)
endif
endif
### crypto
if sys_windows == true
bcrypt_dep = cc.find_library('bcrypt', required: true)
xml_deps += bcrypt_dep
endif
### inet
if want_http == true or want_ftp == true
if sys_windows == true
ws2_dep = cc.find_library('ws2_32', required: true)
xml_deps += ws2_dep
else
has_in_libc = cc.has_function('gethostbyname')
if has_in_libc == false
nsl_dep = cc.find_library('nsl', required: true)
if nsl_dep.found()
has_in_nsl = cc.has_function(
'gethostbyname',
dependencies: nsl_dep,
required: false,
)
if has_in_nsl == true
xml_deps += nsl_dep
endif
endif
endif
endif
### socket length
socklen_src = '''
#include <stddef.h>
#ifdef _WIN32
#include <ws2tcpip.h>
#else
#include <sys/socket.h>
#endif
int main()
{
(void)getsockopt (1, 1, 1, NULL, (socklen_t *)NULL);
return 0;
}
'''
res = cc.compiles(socklen_src, name: 'socket length as socklen_t')
if res == true
config_h.set('XML_SOCKLEN_T', 'socklen_t')
else
socklen_src = '''
#include <stddef.h>
#include <sys/socket.h>
int main()
{
(void)getsockopt (1, 1, 1, NULL, (size_t *)NULL);
return 0;
}
'''
res = cc.compiles(socklen_src, name: 'socket length as size_t')
if res == true
config_h.set('XML_SOCKLEN_T', 'size_t')
else
socklen_src = '''
#include <stddef.h>
#include <sys/socket.h>
int main()
{
(void)getsockopt (1, 1, 1, NULL, (int *)NULL);
return 0;
}
'''
res = cc.compiles(socklen_src, name: 'socket length as int')
if res == false
message('could not determine socket length type, use int')
endif
config_h.set('XML_SOCKLEN_T', 'int')
endif
endif
if want_ipv6 == true
### IPV6 on Windows has been supported since Windows XP SP1 (around 2003)
### see:
### https://learn.microsoft.com/en-us/windows/win32/winsock/ipv6-support-2
### nevertheless, we check it like autotools
ipv6_src = '''
#ifdef _WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#endif
int main()
{
struct sockaddr_storage ss;
socket(AF_INET6, SOCK_STREAM, 0);
getaddrinfo(0, 0, 0, 0);
return 0;
}
'''
res = cc.compiles(ipv6_src, name: 'support for IPV6')
if res == true
config_h.set10('SUPPORT_IP6', true)
endif
endif
endif
### zlib
if want_zlib == true
zlib_dep = dependency('zlib', required: false)
if zlib_dep.found()
xml_deps += zlib_dep
else
want_zlib = false
endif
endif
### lzma
if want_lzma == true
lzma_dep = dependency('liblzma', required: false)
if lzma_dep.found()
xml_deps += lzma_dep
else
want_lzma = false
endif
endif
### iconv
if want_iconv == true
iconv_dep = dependency('iconv', required: false)
if iconv_dep.found()
xml_deps += iconv_dep
else
want_iconv = false
endif
endif
if want_iconv == false and want_iso8859x == false
want_iso8859x = false
else
want_iso8859x = true
endif
# icu
if want_icu == true
icu_dep = dependency('icu-i18n', method: 'pkg-config', required: false)
if icu_dep.found()
def_var = icu_dep.get_variable(pkgconfig: 'DEFS')
config_dir += include_directories(def_var)
xml_deps += icu_dep
else
want_icu = false
endif
endif
subdir('include/libxml')
# Set config_h after all subdirs and dependencies have set values
configure_file(output: 'config.h', configuration: config_h)
## libxml2 library
xml_src = [
'buf.c',
'chvalid.c',
'dict.c',
'entities.c',
'encoding.c',
'error.c',
'globals.c',
'hash.c',
'list.c',
'parser.c',
'parserInternals.c',
'SAX2.c',
'threads.c',
'tree.c',
'uri.c',
'valid.c',
'xmlIO.c',
'xmlmemory.c',
'xmlstring.c',
]
xml_opt_src = [
[want_c14n, ['c14n.c']],
[want_catalog, ['catalog.c']],
[want_debug, ['debugXML.c']],
[want_ftp, ['nanoftp.c']],
[want_html, ['HTMLparser.c', 'HTMLtree.c']],
[want_http, ['nanohttp.c']],
[want_legacy, ['legacy.c']],
[want_lzma, ['xzlib.c']],
[with_modules, ['xmlmodule.c']],
[want_output, ['xmlsave.c']],
[want_pattern, ['pattern.c']],
[want_reader, ['xmlreader.c']],
[want_regexps, ['xmlregexp.c', 'xmlunicode.c']],
[want_sax1, ['SAX.c']],
[want_schemas, ['relaxng.c', 'xmlschemas.c', 'xmlschemastypes.c']],
[want_schemas and not want_xpath, ['xpath.c']],
[want_schematron, ['schematron.c']],
[want_writer, ['xmlwriter.c']],
[want_xinclude, ['xinclude.c']],
[want_xpath, ['xpath.c']],
[want_xptr, ['xlink.c', 'xpointer.c']],
]
foreach file : xml_opt_src
want = file[0]
src = file[1]
if want == true
if src.length() > 1
foreach s : src
xml_src += s
endforeach
else
xml_src += src
endif
endif
endforeach
xml_lib = library(
'xml2',
files(xml_src),
c_args: libxml2_cflags,
dependencies: xml_deps,
include_directories: config_dir,
install: true,
version: meson.project_version(),
)
xml_dep = declare_dependency(link_with: xml_lib)
## xmllint tool
executable(
'xmllint',
files('xmllint.c'),
dependencies: [xml_dep, xmllint_deps],
include_directories: config_dir,
install: true,
)
## xmlcatalog tool
executable(
'xmlcatalog',
files('xmlcatalog.c'),
dependencies: [xml_dep, xmllint_deps],
include_directories: config_dir,
install: true,
)
## testdso module
testdso_mod = shared_module(
'testdso',
files('testdso.c'),
build_rpath: get_option('libdir'),
include_directories: config_dir,
name_prefix: '',
)
## tests
checks = [
'runsuite',
'runtest',
'runxmlconf',
# Disabled for now, see #694
# 'testModule',
'testThreads',
'testapi',
'testchar',
'testdict',
'testlimits',
'testparser',
'testrecurse',
]
foreach check : checks
exe = executable(
check,
files(check + '.c'),
dependencies: xml_dep,
include_directories: config_dir,
)
if check != 'testlimits'
test(check, exe, timeout: 0, workdir: meson.current_source_dir())
endif
endforeach
subdir('example')
subdir('doc')
if want_python == true
subdir('python')
endif
## pc files
pkgmod = import('pkgconfig')
pkgmod.generate(
xml_lib,
description: 'libXML library version2.',
filebase: 'libxml-2.0',
name: 'libXML',
variables: 'modules=' + with_modules.to_string('1', '0'),
)
## libxml2-config.cmake file
config_cmake = configuration_data()
config_cmake.set('LIBXML_MAJOR_VERSION', v_maj)
config_cmake.set('LIBXML_MINOR_VERSION', v_min)
config_cmake.set('LIBXML_MICRO_VERSION', v_mic)
config_cmake.set('VERSION', meson.project_version())
config_cmake.set('WITH_ICONV', want_iconv.to_int().to_string())
config_cmake.set('WITH_ICU', want_icu.to_int().to_string())
config_cmake.set('WITH_LZMA', want_lzma.to_int().to_string())
config_cmake.set('WITH_MODULES', want_modules.to_int().to_string())
config_cmake.set('WITH_THREADS', want_threads.to_int().to_string())
config_cmake.set('WITH_ZLIB', want_zlib.to_int().to_string())
config_cmake.set('XML_CFLAGS', xml_cflags)
configure_file(
input: 'libxml2-config.cmake.in',
output: 'libxml2-config.cmake',
configuration: config_cmake,
install_dir: dir_lib / 'cmake' / 'libxml2',
)
install_data(files('libxml.m4'), install_dir: dir_data / 'aclocal')
install_data(files('xmllint.c'), install_dir: dir_doc / 'examples')
if support_tls == false
message('===============================================================')
message('WARNING: Your C compiler appears to not support thread-local')
message('storage. Future versions of libxml2 will require this feature')
message('for multi-threading.')
message('===============================================================\n',
)
endif
# summary
summary(
{
'OS': host_os,
'c14n': want_c14n,
'catalog': want_catalog,
'debug': want_debug,
'fexceptions': want_fexceptions,
'ftp': want_ftp,
'history': want_history,
'html': want_html,
'http': want_http,
'iconv': want_iconv,
'icu': want_icu,
'ipv6': want_ipv6,
'iso8859x': want_iso8859x,
'legacy': want_legacy,
'lzma': want_lzma,
'mem-debug': want_mem_debug,
'modules': want_modules,
'output': want_output,
'pattern': want_pattern,
'push': want_push,
'python': want_python,
'reader': want_reader,
'readline': want_readline,
'regexps': want_regexps,
'run-debug': want_run_debug,
'sax1': want_sax1,
'schemas': want_schemas,
'schematron': want_schematron,
'threads': want_threads,
'thread-alloc': want_thread_alloc,
'tls': want_tls,
'tree': want_tree,
'valid': want_valid,
'writer': want_writer,
'xinclude': want_xinclude,
'xpath': want_xpath,
'xptr': want_xptr,
'xptr-locs': want_xptr_locs,
'zlib': want_zlib,
},
section: 'Configuration Options Summary:',
)

280
meson_options.txt Normal file
View File

@ -0,0 +1,280 @@
# AC_ARG_WITH / AC_ARG_ENABLE in configure.ac
# [X] c14n
# [X] catalog
# [M] coverage - use meson, not minimum
# [X] debugging
# [X] fexceptions
# [X] ftp - not minimum
# [X] history
# [X] html
# [X] http
# [X] iconv
# [X] icu - not minimum
# [X] ipv6
# [X] iso8859x
# [X] legacy
# [X] lzma
# [X] mem-debug
# [X] modules
# [X] output
# [X] pattern
# [X] push
# [ ] python
# [X] reader
# [X] readline
# [X] regexps
# [ ] run-debug - not used
# [X] sax1
# [X] schemas
# [X] schematron
# [X] threads
# [X] thread-alloc
# [X] tls
# [X] tree
# [X] valid
# [X] writer
# [X] xinclude
# [X] xpath
# [X] xptr
# [X] xptr-locs
# [X] zlib
# [X] minimum
# [X] ipv6
option('c14n',
type: 'boolean',
value: true,
description: 'Canonical XML 1.0 support'
)
option('catalog',
type: 'boolean',
value: true,
description: 'XML Catalogs support'
)
option('debuging',
type: 'boolean',
value: true,
description: 'Debugging module and shell'
)
option('fexceptions',
type: 'boolean',
value: false,
description: 'add GCC flag -fexceptions for C++ exceptions'
)
option('ftp',
type: 'boolean',
value: false,
description: 'FTP support'
)
option('history',
type: 'boolean',
value: false,
description: 'History support for shell'
)
option('html',
type: 'boolean',
value: true,
description: 'HTML parser'
)
option('http',
type: 'boolean',
value: true,
description: 'HTTP support'
)
# TODO meson custom dependency
option('iconv',
type: 'boolean',
value: true,
description: 'iconv support'
)
option('icu',
type: 'boolean',
value: false,
description: 'ICU support'
)
option('ipv6',
type: 'boolean',
value: true,
description: 'Compilation of IPv6 code'
)
option('iso8859x',
type: 'boolean',
value: true,
description: 'ISO-8859-X support if no iconv'
)
option('legacy',
type: 'boolean',
value: false,
description: 'Maximum ABI compatibility'
)
option('lzma',
type: 'boolean',
value: false,
description: 'LZMA support'
)
option('mem-debug',
type: 'boolean',
value: false,
description: 'Memory debugging module'
)
option('modules',
type: 'boolean',
value: true,
description: 'Dynamic modules support'
)
option('output',
type: 'boolean',
value: true,
description: 'Serialization support'
)
option('pattern',
type: 'boolean',
value: true,
description: 'xmlPattern selection interface'
)
option('push',
type: 'boolean',
value: true,
description: 'push parser interfaces'
)
option('python',
type: 'boolean',
value: true,
description: 'Python bindings'
)
option('reader',
type: 'boolean',
value: true,
description: 'xmlReader parsing interface'
)
option('readline',
type: 'boolean',
value: true,
description: 'use readline in DIR (for shell history)'
)
option('regexps',
type: 'boolean',
value: true,
description: 'Regular expressions support'
)
option('run-debug',
type: 'boolean',
value: false,
description: 'Runtime debugging module'
)
option('sax1',
type: 'boolean',
value: true,
description: 'Older SAX1 interface'
)
option('schemas',
type: 'boolean',
value: true,
description: 'XML Schemas 1.0 and RELAX NG support'
)
option('schematron',
type: 'boolean',
value: true,
description: 'Schematron support'
)
option('threads',
type: 'boolean',
value: true,
description: 'Multithreading support'
)
option('thread-alloc',
type: 'boolean',
value: false,
description: 'per-thread malloc hooks'
)
option('tls',
type: 'boolean',
value: false,
description: 'thread-local storage'
)
option('tree',
type: 'boolean',
value: true,
description: 'DOM like tree manipulation APIs'
)
option('valid',
type: 'boolean',
value: true,
description: 'DTD validation support'
)
option('writer',
type: 'boolean',
value: true,
description: 'xmlWriter serialization interface'
)
option('xinclude',
type: 'boolean',
value: true,
description: 'XInclude 1.0 support'
)
option('xpath',
type: 'boolean',
value: true,
description: 'XPath 1.0 support'
)
option('xptr',
type: 'boolean',
value: true,
description: 'XPointer support'
)
option('xptr-locs',
type: 'boolean',
value: false,
description: 'XPointer ranges and points'
)
option('zlib',
type: 'boolean',
value: false,
description: 'ZLIB support'
)
option('minimum',
type: 'boolean',
value: false,
description: 'build a minimally sized library (default=false)'
)

View File

@ -10,7 +10,8 @@ EXTRA_DIST = \
generator.py \ generator.py \
libxml.py \ libxml.py \
libxml2-python-api.xml \ libxml2-python-api.xml \
pyproject.toml pyproject.toml \
meson.build
if WITH_PYTHON if WITH_PYTHON
AM_CPPFLAGS = \ AM_CPPFLAGS = \

36
python/meson.build Normal file
View File

@ -0,0 +1,36 @@
pymod = import('python')
py = pymod.find_installation('python3', required: false)
if py.found() == true
r = run_command(py, 'generator.py', meson.current_source_dir(), check: true)
libxml2mod_src = ['libxml.c', 'libxml2-py.c', 'types.c']
message(py.get_install_dir())
py.extension_module(
'libxml2mod',
files(libxml2mod_src),
dependencies: [py.dependency(), xml_dep],
include_directories: [config_dir],
install: true,
)
setup_py = configuration_data()
setup_py.set('prefix', get_option('prefix'))
setup_py.set('LIBXML_VERSION', meson.project_version())
setup_py.set('WITH_ICONV', want_iconv.to_int())
setup_py.set('WITH_ICU', want_icu.to_int())
setup_py.set('WITH_LZMA', want_lzma.to_int())
setup_py.set('WITH_ZLIB', want_zlib.to_int())
setup_py.set('WITH_THREADS', want_threads.to_int())
configure_file(
input: 'setup.py.in',
output: 'setup.py',
configuration: setup_py,
)
subdir('tests')
endif

View File

@ -75,3 +75,5 @@ check-local:
fi ; \ fi ; \
done) done)
endif endif
EXTRA_DIST = meson.build

63
python/tests/meson.build Normal file
View File

@ -0,0 +1,63 @@
python_test_files = files(
'attribs.py',
'build.py',
'compareNodes.py',
'ctxterror.py',
'cutnpaste.py',
'dtdvalid.py',
'error.py',
'inbuf.py',
'indexes.py',
'input_callback.py',
'nsdel.py',
'outbuf.py',
'push.py',
'pushSAX.py',
'pushSAXhtml.py',
'reader.py',
'reader2.py',
'reader3.py',
'reader4.py',
'reader5.py',
'reader6.py',
'reader7.py',
'reader8.py',
'readererr.py',
'readernext.py',
'regexp.py',
'relaxng.py',
'resolver.py',
'schema.py',
'serialize.py',
'setup_test.py',
'sync.py',
'thread2.py',
'tst.py',
'tstLastError.py',
'tstURI.py',
'tstmem.py',
'tstxpath.py',
'validDTD.py',
'validRNG.py',
'validSchemas.py',
'validate.py',
'walker.py',
'xpath.py',
'xpathext.py',
'xpathleak.py',
'xpathns.py',
'xpathret.py',
)
xml_files = files(
'invalid.xml',
'test.dtd',
'tst.xml',
'valid.xml',
)
install_data(
[python_test_files, xml_files, files('setup_test.py')],
install_dir: dir_doc / 'python' / 'examples',
)