Skip to content

Commit d2c63d4

Browse files
committed
update upstream to 2.14.3
1 parent d01929f commit d2c63d4

File tree

4 files changed

+107
-157
lines changed

4 files changed

+107
-157
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ jobs:
3333
run: zig fmt --ast-check --check .
3434

3535
- name: Build
36-
run: zig build -Diconv=false --summary all
36+
run: zig build --summary all

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ You can then import `libxml2` in your `build.zig` with:
2020
const libxml2_dependency = b.dependency("libxml2", .{
2121
.target = target,
2222
.optimize = optimize,
23-
.iconv = false, // This would link to `libiconv` otherwise
2423
});
2524
your_exe.linkLibrary(libxml2_dependency.artifact("libxml2"));
2625
```

build.zig

Lines changed: 98 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -15,134 +15,70 @@ pub fn build(b: *std.Build) void {
1515

1616
const minimum = b.option(bool, "minimum", "build a minimally sized library (default=false)") orelse false;
1717
const legacy = b.option(bool, "legacy", "maximum ABI compatibility (default=false)") orelse false;
18+
19+
const http = b.option(bool, "http", "HTTP support (default=false)") orelse false;
20+
const icu = b.option(bool, "icu", "ICU support (default=false)") orelse false;
21+
const lzma = b.option(bool, "lzma", "use liblzma in DIR (default=false)") orelse false;
22+
// const python = b.option(bool, "python", "Python bindings (default=false)") orelse false;
23+
const thread_alloc = b.option(bool, "thread-alloc", "per-thread malloc hooks (default=false)") orelse false;
1824
const tls = b.option(bool, "tls", "thread-local storage (default=false)") orelse false;
1925

20-
var c14n = b.option(bool, "c14n", "Canonical XML 1.0 support (default=true)") orelse !minimum;
2126
const catalog = b.option(bool, "catalog", "XML Catalogs support (default=true)") orelse !minimum;
2227
const debug = b.option(bool, "debug", "debugging module (default=true)") orelse !minimum;
23-
const ftp = b.option(bool, "ftp", "FTP support (default=false)") orelse false;
24-
const history = b.option(bool, "history", "history support for xmllint shell (default=false)") orelse false;
25-
var readline = b.option(bool, "readline", "use readline in DIR for shell (default=off)") orelse !minimum and history;
2628
const html = b.option(bool, "html", "HTML parser (default=true)") orelse !minimum;
27-
const http = b.option(bool, "http", "HTTP support (default=false)") orelse legacy;
28-
const iconv = b.option(bool, "iconv", "iconv support (default=on)") orelse !minimum;
29-
const icu = b.option(bool, "icu", "ICU support (default=false)") orelse false;
29+
const iconv = b.option(bool, "iconv", "iconv support (default=true)") orelse !minimum;
3030
const iso8859x = b.option(bool, "iso8859x", "ISO-8859-X support if no iconv (default=true)") orelse !minimum;
31-
const lzma = b.option(bool, "lzma", "use liblzma in DIR (default=off)") orelse legacy;
3231
// const modules = b.option(bool, "modules", "dynamic modules support (default=true)") orelse !minimum;
33-
var output = b.option(bool, "output", "serialization support (default=true)") orelse !minimum;
34-
var pattern = b.option(bool, "pattern", "xmlPattern selection interface (default=true)") orelse !minimum;
35-
var push = b.option(bool, "push", "push parser interfaces (default=true)") orelse !minimum;
36-
// const python = b.option(bool, "python", "Python bindings (default=true)") orelse !minimum;
37-
var reader = b.option(bool, "reader", "xmlReader parsing interface (default=true)") orelse !minimum;
38-
var regexps = b.option(bool, "regexps", "regular expressions support (default=true)") orelse !minimum;
3932
const sax1 = b.option(bool, "sax1", "older SAX1 interface (default=true)") orelse !minimum;
40-
var schemas = b.option(bool, "schemas", "XML Schemas 1.0 and RELAX NG support (default=true)") orelse !minimum;
41-
var schematron = b.option(bool, "schematron", "Schematron support (default=true)") orelse !minimum;
4233
const threads = b.option(bool, "threads", "multithreading support (default=true)") orelse !minimum;
43-
const thread_alloc = b.option(bool, "thread-alloc", "per-thread malloc hooks (default=false)") orelse false;
4434
const valid = b.option(bool, "valid", "DTD validation support (default=true)") orelse !minimum;
45-
var writer = b.option(bool, "writer", "xmlWriter serialization interface (default=true)") orelse !minimum;
46-
var xinclude = b.option(bool, "xinclude", "XInclude 1.0 support (default=true)") orelse !minimum;
47-
var xpath = b.option(bool, "xpath", "XPath 1.0 support (default=true)") orelse !minimum;
48-
var xptr = b.option(bool, "xptr", "XPointer support (default=true)") orelse !minimum;
49-
const xptr_locs = b.option(bool, "xptr-locs", "XPointer ranges and points (default=false)") orelse false;
35+
const xinclude = b.option(bool, "xinclude", "XInclude 1.0 support (default=true)") orelse !minimum;
36+
5037
const zlib = b.option(bool, "zlib", "use libz in DIR") orelse legacy;
5138

52-
if (c14n) {
53-
if (!output) {
54-
std.log.warn("-Dc14n overrides -Doutput=false", .{});
55-
output = true;
56-
}
57-
if (!xpath) {
58-
std.log.warn("-Dc14n overrides -Dxpath=false", .{});
59-
xpath = true;
60-
}
61-
}
62-
if (schemas) {
63-
if (!pattern) {
64-
std.log.warn("-Dschemas overrides -Dpattern=false", .{});
65-
pattern = true;
66-
}
67-
if (!regexps) {
68-
std.log.warn("-Dschemas overrides -Dregexps=false", .{});
69-
regexps = true;
70-
}
71-
}
72-
if (schematron) {
73-
if (!pattern) {
74-
std.log.warn("-Dschematron overrides -Dpattern=false", .{});
75-
pattern = true;
76-
}
77-
if (!xpath) {
78-
std.log.warn("-Dschematron overrides -Dxpath=false", .{});
79-
xpath = true;
80-
}
81-
}
82-
if (reader) {
83-
if (!push) {
84-
std.log.warn("-Dreader overrides -Dpush=false", .{});
85-
push = true;
86-
}
87-
}
88-
if (writer) {
89-
if (!output) {
90-
std.log.warn("-Dwriter overrides -Doutput=false", .{});
91-
output = true;
92-
}
93-
if (!push) {
94-
std.log.warn("-Dwriter overrides -Dpush=false", .{});
95-
push = true;
96-
}
97-
}
98-
if (xinclude) {
99-
if (!xpath) {
100-
std.log.warn("-Dxinclude overrides -Dxpath=false", .{});
101-
xpath = true;
102-
}
103-
}
104-
if (xptr_locs) {
105-
if (!xpath) {
106-
std.log.warn("-Dxptr-locs overrides -Dxptr=false", .{});
107-
xpath = true;
108-
}
109-
}
110-
if (xptr) {
111-
if (!xpath) {
112-
std.log.warn("-Dxptr overrides -Dxpath=false", .{});
113-
xpath = true;
114-
}
115-
}
116-
if (history) {
117-
if (!readline) {
118-
std.log.warn("-Dhistory overrides -Dreadline=false", .{});
119-
readline = true;
120-
}
121-
}
39+
const want_c14n = b.option(bool, "c14n", "Canonical XML 1.0 support (default=true)");
40+
const want_history = b.option(bool, "history", "history support for xmllint shell (default=false)");
41+
const want_readline = b.option(bool, "readline", "use readline in DIR for shell (default=false)");
42+
const want_output = b.option(bool, "output", "serialization support (default=true)");
43+
const want_pattern = b.option(bool, "pattern", "xmlPattern selection interface (default=true)");
44+
const want_push = b.option(bool, "push", "push parser interfaces (default=true)");
45+
const want_reader = b.option(bool, "reader", "xmlReader parsing interface (default=true)");
46+
const want_regexps = b.option(bool, "regexps", "regular expressions support (default=true)");
47+
const want_relaxng = b.option(bool, "relaxng", "RELAX NG support (default=true)");
48+
const want_schemas = b.option(bool, "schemas", "XML Schemas 1.0 and RELAX NG support (default=true)");
49+
const want_schematron = b.option(bool, "schematron", "Schematron support (default=true)");
50+
const want_writer = b.option(bool, "writer", "xmlWriter serialization interface (default=true)");
51+
const want_xpath = b.option(bool, "xpath", "XPath 1.0 support (default=true)");
52+
const want_xptr = b.option(bool, "xptr", "XPointer support (default=true)");
12253

123-
if (!minimum) {
124-
if (!output) {
125-
c14n = false;
126-
writer = false;
127-
}
128-
if (!pattern) {
129-
schemas = false;
130-
schematron = false;
131-
}
132-
if (!push) {
133-
reader = false;
134-
writer = false;
135-
}
136-
if (!regexps) {
137-
schemas = false;
138-
}
139-
if (!xpath) {
140-
c14n = false;
141-
schematron = false;
142-
xinclude = false;
143-
xptr = false;
144-
}
145-
}
54+
const output = want_output orelse (!minimum or want_c14n == true or want_writer == true);
55+
const pattern = want_pattern orelse (!minimum or want_schemas == true or want_schematron == true);
56+
const regexps = want_regexps orelse (!minimum or want_relaxng == true or want_schemas == true);
57+
const push = want_push orelse (!minimum or want_reader == true or want_writer == true);
58+
const readline = want_readline orelse (want_history == true);
59+
const xpath = want_xpath orelse (!minimum or want_c14n == true or want_schematron == true or want_xptr == true);
60+
61+
const c14n = want_c14n orelse (!minimum and output and xpath);
62+
const history = want_history orelse false;
63+
const reader = want_reader orelse (!minimum and push);
64+
const schemas = want_schemas orelse (!minimum and pattern and regexps);
65+
const relaxng = want_relaxng orelse (!minimum and schemas);
66+
const schematron = want_schematron orelse (!minimum and pattern and xpath);
67+
const writer = want_writer orelse (!minimum and output and push);
68+
const xptr = want_xptr orelse (!minimum and xpath);
69+
70+
if (c14n and !output) std.debug.panic("c14n requires output", .{});
71+
if (c14n and !xpath) std.debug.panic("c14n requires xpath", .{});
72+
if (history and !readline) std.debug.panic("history requires readline", .{});
73+
if (reader and !push) std.debug.panic("reader requires push", .{});
74+
if (schemas and !pattern) std.debug.panic("schemas requires pattern", .{});
75+
if (schemas and !regexps) std.debug.panic("schemas requires regexps", .{});
76+
if (relaxng and !schemas) std.debug.panic("relaxng requires schemas", .{});
77+
if (schematron and !pattern) std.debug.panic("schematron requires pattern", .{});
78+
if (schematron and !xpath) std.debug.panic("schematron requires xpath", .{});
79+
if (writer and !output) std.debug.panic("writer requires output", .{});
80+
if (writer and !push) std.debug.panic("writer requires push", .{});
81+
if (xptr and !xpath) std.debug.panic("xptr requires xpath", .{});
14682

14783
const xml_version_header = b.addConfigHeader(.{
14884
.include_path = "libxml/xmlversion.h",
@@ -152,15 +88,13 @@ pub fn build(b: *std.Build) void {
15288
.LIBXML_VERSION_NUMBER = @as(i64, version.major * 10000 + version.major * 100 + version.patch),
15389
.LIBXML_VERSION_EXTRA = "",
15490
.WITH_THREADS = threads,
155-
.WITH_THREAD_ALLOC = threads and thread_alloc,
156-
.WITH_TREE = true,
91+
.WITH_THREAD_ALLOC = thread_alloc,
15792
.WITH_OUTPUT = output,
15893
.WITH_PUSH = push,
15994
.WITH_READER = reader,
16095
.WITH_PATTERN = pattern,
16196
.WITH_WRITER = writer,
16297
.WITH_SAX1 = sax1,
163-
.WITH_FTP = ftp,
16498
.WITH_HTTP = http,
16599
.WITH_VALID = valid,
166100
.WITH_HTML = html,
@@ -169,13 +103,13 @@ pub fn build(b: *std.Build) void {
169103
.WITH_CATALOG = catalog,
170104
.WITH_XPATH = xpath,
171105
.WITH_XPTR = xptr,
172-
.WITH_XPTR_LOCS = xptr_locs,
173106
.WITH_XINCLUDE = xinclude,
174107
.WITH_ICONV = iconv,
175108
.WITH_ICU = icu,
176109
.WITH_ISO8859X = iso8859x,
177110
.WITH_DEBUG = debug,
178111
.WITH_REGEXPS = regexps,
112+
.WITH_RELAXNG = relaxng,
179113
.WITH_SCHEMAS = schemas,
180114
.WITH_SCHEMATRON = schematron,
181115
.WITH_MODULES = false,
@@ -185,23 +119,33 @@ pub fn build(b: *std.Build) void {
185119
});
186120

187121
const config_header = b.addConfigHeader(.{}, .{
122+
.HAVE_DECL_GETENTROPY = switch (target.result.os.tag) {
123+
.linux => target.result.isGnuLibC() and target.result.os.version_range.linux.glibc.order(.{ .major = 2, .minor = 25, .patch = 0 }) != .lt,
124+
.freebsd, .openbsd => true,
125+
else => target.result.os.tag.isDarwin(),
126+
},
127+
.HAVE_DECL_GLOB = target.result.os.tag != .windows,
128+
.HAVE_DECL_MMAP = target.result.os.tag != .windows and target.result.os.tag != .wasi,
129+
.HAVE_DLFCN_H = target.result.os.tag != .windows,
130+
.HAVE_DLOPEN = false, // only present if `WITH_MODULES`
131+
.HAVE_FUNC_ATTRIBUTE_DESTRUCTOR = true,
132+
.HAVE_INTTYPES_H = true,
133+
.HAVE_LIBHISTORY = history,
134+
.HAVE_LIBREADLINE = readline,
135+
.HAVE_LZMA_H = lzma,
136+
.HAVE_POLL_H = http and target.result.os.tag != .windows,
137+
.HAVE_PTHREAD_H = target.result.os.tag != .windows,
138+
.HAVE_SHLLOAD = false, // only present if `WITH_MODULES`
188139
.HAVE_STDINT_H = true,
189-
.HAVE_FCNTL_H = true,
190-
.HAVE_UNISTD_H = true,
140+
.HAVE_STDIO_H = target.result.os.tag != .wasi,
141+
.HAVE_STDLIB_H = target.result.os.tag != .wasi,
142+
.HAVE_STRINGS_H = target.result.os.tag != .wasi,
143+
.HAVE_STRING_H = target.result.os.tag != .wasi,
191144
.HAVE_SYS_STAT_H = true,
192-
.HAVE_SYS_MMAN_H = true,
193-
.HAVE_SYS_TIME_H = true,
194-
.HAVE_SYS_TIMEB_H = true,
195-
.HAVE_SYS_RANDOM_H = true,
196-
.HAVE_DL_H = true,
197-
.HAVE_DLFCN_H = true,
198-
.HAVE_GLOB_H = true,
199-
.HAVE_DECL_GETENTROPY = true,
200-
.HAVE_DECL_GLOB = true,
201-
.HAVE_DECL_MMAP = true,
202-
.HAVE_POLL_H = true,
203-
.HAVE_ATTRIBUTE_DESTRUCTOR = true,
204-
.ATTRIBUTE_DESTRUCTOR = .@"__attribute__((destructor))",
145+
.HAVE_SYS_TYPES_H = target.result.os.tag != .wasi,
146+
.HAVE_UNISTD_H = target.result.os.tag != .wasi,
147+
.HAVE_ZLIB_H = zlib,
148+
.XML_SYSCONFDIR = if (catalog) "" else null, // TODO
205149
});
206150
if (tls) {
207151
config_header.addValues(.{ .XML_THREAD_LOCAL = ._Thread_local });
@@ -220,47 +164,49 @@ pub fn build(b: *std.Build) void {
220164
}),
221165
});
222166
b.installArtifact((xml_lib));
167+
xml_lib.installHeader(xml_version_header.getOutput(), "libxml/xmlversion.h");
168+
xml_lib.installHeadersDirectory(upstream.path("include/libxml"), "libxml", .{});
223169
xml_lib.root_module.addConfigHeader(config_header);
224170
xml_lib.root_module.addConfigHeader(xml_version_header);
225-
xml_lib.installHeader(xml_version_header.getOutput(), "libxml/xmlversion.h");
226171
xml_lib.root_module.addIncludePath(upstream.path("include"));
227172
xml_lib.root_module.addCSourceFiles(.{ .files = xml_src, .root = upstream.path(""), .flags = xml_flags });
228-
xml_lib.installHeadersDirectory(upstream.path("include/libxml"), "libxml", .{});
229-
if (target.result.os.tag != .windows) xml_lib.root_module.addCMacro("HAVE_PTHREAD_H", "1");
230-
if (target.result.os.tag == .windows) xml_lib.root_module.addCMacro("LIBXML_STATIC", "1");
173+
if (target.result.os.tag == .windows and linkage == .static) xml_lib.root_module.addCMacro("LIBXML_STATIC", "1");
231174
if (c14n) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("c14n.c"), .flags = xml_flags });
232175
if (catalog) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("catalog.c"), .flags = xml_flags });
233176
if (debug) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("debugXML.c"), .flags = xml_flags });
234-
if (ftp) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("nanoftp.c"), .flags = xml_flags });
235177
if (html) xml_lib.root_module.addCSourceFiles(.{ .files = &.{ "HTMLparser.c", "HTMLtree.c" }, .root = upstream.path(""), .flags = xml_flags });
236178
if (http) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("nanohttp.c"), .flags = xml_flags });
237-
if (legacy) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("legacy.c"), .flags = xml_flags });
238179
if (lzma) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xzlib.c"), .flags = xml_flags });
239180
// if (modules) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xmlmodule.c"), .flags = xml_flags });
240181
if (output) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xmlsave.c"), .flags = xml_flags });
241182
if (pattern) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("pattern.c"), .flags = xml_flags });
242183
if (reader) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xmlreader.c"), .flags = xml_flags });
243-
if (regexps) xml_lib.root_module.addCSourceFiles(.{ .files = &.{ "xmlregexp.c", "xmlunicode.c" }, .root = upstream.path(""), .flags = xml_flags });
244-
if (schemas) xml_lib.root_module.addCSourceFiles(.{ .files = &.{ "relaxng.c", "xmlschemas.c", "xmlschemastypes.c" }, .root = upstream.path(""), .flags = xml_flags });
184+
if (regexps) xml_lib.root_module.addCSourceFiles(.{ .files = &.{"xmlregexp.c"}, .root = upstream.path(""), .flags = xml_flags });
185+
if (relaxng) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("relaxng.c"), .flags = xml_flags });
186+
if (schemas) xml_lib.root_module.addCSourceFiles(.{ .files = &.{ "xmlschemas.c", "xmlschemastypes.c" }, .root = upstream.path(""), .flags = xml_flags });
245187
if (schematron) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("schematron.c"), .flags = xml_flags });
246188
if (writer) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xmlwriter.c"), .flags = xml_flags });
247189
if (xinclude) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xinclude.c"), .flags = xml_flags });
248190
if (xpath) xml_lib.root_module.addCSourceFile(.{ .file = upstream.path("xpath.c"), .flags = xml_flags });
249191
if (xptr) xml_lib.root_module.addCSourceFiles(.{ .files = &.{ "xlink.c", "xpointer.c" }, .root = upstream.path(""), .flags = xml_flags });
250-
if (readline) {
251-
xml_lib.root_module.linkSystemLibrary("readline", .{});
252-
xml_lib.root_module.addCMacro("HAVE_LIBREADLINE", "1");
253-
}
254-
if (history) {
255-
xml_lib.root_module.linkSystemLibrary("history", .{});
256-
xml_lib.root_module.addCMacro("HAVE_LIBHISTORY", "1");
257-
}
258-
if (zlib) xml_lib.root_module.linkSystemLibrary("zlib", .{});
192+
if (readline) xml_lib.root_module.linkSystemLibrary("readline", .{});
193+
if (history) xml_lib.root_module.linkSystemLibrary("history", .{});
259194
if (lzma) xml_lib.root_module.linkSystemLibrary("lzma", .{});
260195
if (icu) xml_lib.root_module.linkSystemLibrary("icu-i18n", .{});
261-
if (iconv) xml_lib.root_module.linkSystemLibrary("iconv", .{});
196+
// if (iconv) xml_lib.root_module.linkSystemLibrary("iconv", .{});
262197
if (target.result.os.tag == .windows) xml_lib.root_module.linkSystemLibrary("bcrypt", .{});
263198
if (http and target.result.os.tag == .windows) xml_lib.root_module.linkSystemLibrary("ws2_32", .{});
199+
200+
if (zlib) {
201+
if (b.systemIntegrationOption("zlib", .{})) {
202+
xml_lib.root_module.linkSystemLibrary("zlib", .{});
203+
} else if (b.lazyDependency("zlib", .{
204+
.target = target,
205+
.optimize = optimize,
206+
})) |zlib_dependency| {
207+
xml_lib.root_module.linkLibrary(zlib_dependency.artifact("z"));
208+
}
209+
}
264210
}
265211

266212
pub const xml_src: []const []const u8 = &.{

build.zig.zon

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
.{
22
.name = .libxml2,
3-
.version = "2.13.5-1",
3+
.version = "2.14.3",
44
.minimum_zig_version = "0.14.0",
55
.dependencies = .{
66
.libxml2 = .{
7-
.url = "git+https://gitlab.gnome.org/GNOME/libxml2.git?ref=v2.13.5#de918d45e1b2276a28a4cd32bcf556bef65284e4",
8-
.hash = "N-V-__8AALhJnQFEyD-r67NUdrbzKo_FzIluLJQg1-mTCpuY",
7+
.url = "git+https://gitlab.gnome.org/GNOME/libxml2.git?ref=v2.14.3#8d509f483dd5ce268b2fded9c738132c47d820d8",
8+
.hash = "N-V-__8AAKECgwELybeTt28_dzxwziqdrHDrIiadVpfYeFbx",
9+
},
10+
.zlib = .{
11+
.url = "git+https://github.com/allyourcodebase/zlib#6c72830882690c1eb2567a537525c3f432c1da50",
12+
.hash = "zlib-1.3.1-ZZQ7lVgMAACwO4nUUd8GLhsuQ5JQq_VAhlEiENJTUv6h",
13+
.lazy = true,
914
},
1015
},
1116
.paths = .{

0 commit comments

Comments
 (0)