mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-28 14:43:28 +00:00
Previously, the IO loop was doing three things: 1 - Managing timeouts (either from scripts or for our own needs) 2 - Handling browser IO events (page/script/xhr) 3 - Handling CDP events (accept, read, write, timeout) With the libcurl merge, 1 was moved to an in-process scheduler and 2 was moved to libcurl's own event loop. That means the entire loop code, including the dependency on tigerbeetle-io existed for handling a single TCP client. Not only is that a lot of code, there was also friction between the two loops (the libcurl one and our IO loop), which would result in latency - while one loop is waiting for the events, any events on the other loop go un-processed. This PR removes our IO loop. To accomplish this: 1 - The main accept loop is blocking. This is simpler and works perfectly well, given we only allow 1 active connection. 2 - The client socket is passed to libcurl - yes, libcurl's loop can take arbitrary FDs and poll them along with its own. In addition to having one less dependency, the CDP code is quite a bit simpler, especially around shutdowns and writes. This also removes _some_ of the latency caused by the friction between page process and CDP processing. Specifically, when CDP now blocks for input, http page events (script loading, xhr, ...) will still be processed. There's still friction. For one, the reverse isn't true: when the page is waiting for events, CDP events aren't going to be processed. But the page.wait already have some sensitivity to this (e.g. the page.request_intercepted flag). Also, when CDP waits, while we will process network events, page timeouts are still not processed. Because of both these remaining issues, we still need to jump between the two loops - but being able to block on CDP (even for a short time) WITHOUT stopping the page's network I/O, should reduce some latency.
818 lines
30 KiB
Zig
818 lines
30 KiB
Zig
// Copyright (C) 2023-2024 Lightpanda (Selecy SAS)
|
|
//
|
|
// Francis Bouvier <francis@lightpanda.io>
|
|
// Pierre Tachoire <pierre@lightpanda.io>
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
const std = @import("std");
|
|
const builtin = @import("builtin");
|
|
|
|
const Build = std.Build;
|
|
|
|
/// Do not rename this constant. It is scanned by some scripts to determine
|
|
/// which zig version to install.
|
|
const recommended_zig_version = "0.14.1";
|
|
|
|
pub fn build(b: *Build) !void {
|
|
switch (comptime builtin.zig_version.order(std.SemanticVersion.parse(recommended_zig_version) catch unreachable)) {
|
|
.eq => {},
|
|
.lt => {
|
|
@compileError("The minimum version of Zig required to compile is '" ++ recommended_zig_version ++ "', found '" ++ builtin.zig_version_string ++ "'.");
|
|
},
|
|
.gt => {
|
|
std.debug.print(
|
|
"WARNING: Recommended Zig version '{s}', but found '{s}', build may fail...\n\n",
|
|
.{ recommended_zig_version, builtin.zig_version_string },
|
|
);
|
|
},
|
|
}
|
|
|
|
var opts = b.addOptions();
|
|
opts.addOption(
|
|
[]const u8,
|
|
"git_commit",
|
|
b.option([]const u8, "git_commit", "Current git commit") orelse "dev",
|
|
);
|
|
|
|
const target = b.standardTargetOptions(.{});
|
|
const optimize = b.standardOptimizeOption(.{});
|
|
|
|
const lightpanda_module = b.addModule("lightpanda", .{
|
|
.root_source_file = b.path("src/main.zig"),
|
|
.target = target,
|
|
.optimize = optimize,
|
|
});
|
|
try addDependencies(b, lightpanda_module, opts);
|
|
|
|
{
|
|
// browser
|
|
// -------
|
|
|
|
// compile and install
|
|
const exe = b.addExecutable(.{
|
|
.name = "lightpanda",
|
|
.root_module = lightpanda_module,
|
|
});
|
|
b.installArtifact(exe);
|
|
|
|
// run
|
|
const run_cmd = b.addRunArtifact(exe);
|
|
if (b.args) |args| {
|
|
run_cmd.addArgs(args);
|
|
}
|
|
|
|
// step
|
|
const run_step = b.step("run", "Run the app");
|
|
run_step.dependOn(&run_cmd.step);
|
|
}
|
|
|
|
{
|
|
// tests
|
|
// ----
|
|
|
|
// compile
|
|
const tests = b.addTest(.{
|
|
.root_module = lightpanda_module,
|
|
.test_runner = .{ .path = b.path("src/test_runner.zig"), .mode = .simple },
|
|
});
|
|
|
|
const run_tests = b.addRunArtifact(tests);
|
|
if (b.args) |args| {
|
|
run_tests.addArgs(args);
|
|
}
|
|
|
|
// step
|
|
const tests_step = b.step("test", "Run unit tests");
|
|
tests_step.dependOn(&run_tests.step);
|
|
}
|
|
|
|
{
|
|
// wpt
|
|
// -----
|
|
const wpt_module = b.createModule(.{
|
|
.root_source_file = b.path("src/main_wpt.zig"),
|
|
.target = target,
|
|
.optimize = optimize,
|
|
});
|
|
try addDependencies(b, wpt_module, opts);
|
|
|
|
// compile and install
|
|
const wpt = b.addExecutable(.{
|
|
.name = "lightpanda-wpt",
|
|
.root_module = wpt_module,
|
|
});
|
|
|
|
// run
|
|
const wpt_cmd = b.addRunArtifact(wpt);
|
|
if (b.args) |args| {
|
|
wpt_cmd.addArgs(args);
|
|
}
|
|
// step
|
|
const wpt_step = b.step("wpt", "WPT tests");
|
|
wpt_step.dependOn(&wpt_cmd.step);
|
|
}
|
|
|
|
{
|
|
// get v8
|
|
// -------
|
|
const v8 = b.dependency("v8", .{ .target = target, .optimize = optimize });
|
|
const get_v8 = b.addRunArtifact(v8.artifact("get-v8"));
|
|
const get_step = b.step("get-v8", "Get v8");
|
|
get_step.dependOn(&get_v8.step);
|
|
}
|
|
|
|
{
|
|
// build v8
|
|
// -------
|
|
const v8 = b.dependency("v8", .{ .target = target, .optimize = optimize });
|
|
const build_v8 = b.addRunArtifact(v8.artifact("build-v8"));
|
|
const build_step = b.step("build-v8", "Build v8");
|
|
build_step.dependOn(&build_v8.step);
|
|
}
|
|
}
|
|
|
|
fn addDependencies(b: *Build, mod: *Build.Module, opts: *Build.Step.Options) !void {
|
|
try moduleNetSurf(b, mod);
|
|
mod.addImport("build_config", opts.createModule());
|
|
|
|
const target = mod.resolved_target.?;
|
|
const dep_opts = .{
|
|
.target = target,
|
|
.optimize = mod.optimize.?,
|
|
};
|
|
|
|
mod.addIncludePath(b.path("vendor/lightpanda"));
|
|
|
|
{
|
|
// v8
|
|
const v8_opts = b.addOptions();
|
|
v8_opts.addOption(bool, "inspector_subtype", false);
|
|
|
|
const v8_mod = b.dependency("v8", dep_opts).module("v8");
|
|
v8_mod.addOptions("default_exports", v8_opts);
|
|
mod.addImport("v8", v8_mod);
|
|
|
|
const release_dir = if (mod.optimize.? == .Debug) "debug" else "release";
|
|
const os = switch (target.result.os.tag) {
|
|
.linux => "linux",
|
|
.macos => "macos",
|
|
else => return error.UnsupportedPlatform,
|
|
};
|
|
var lib_path = try std.fmt.allocPrint(
|
|
mod.owner.allocator,
|
|
"v8/out/{s}/{s}/obj/zig/libc_v8.a",
|
|
.{ os, release_dir },
|
|
);
|
|
std.fs.cwd().access(lib_path, .{}) catch {
|
|
// legacy path
|
|
lib_path = try std.fmt.allocPrint(
|
|
mod.owner.allocator,
|
|
"v8/out/{s}/obj/zig/libc_v8.a",
|
|
.{release_dir},
|
|
);
|
|
};
|
|
mod.addObjectFile(mod.owner.path(lib_path));
|
|
|
|
switch (target.result.os.tag) {
|
|
.macos => {
|
|
// v8 has a dependency, abseil-cpp, which, on Mac, uses CoreFoundation
|
|
mod.addSystemFrameworkPath(.{ .cwd_relative = "/System/Library/Frameworks" });
|
|
mod.linkFramework("CoreFoundation", .{});
|
|
},
|
|
else => {},
|
|
}
|
|
}
|
|
|
|
{
|
|
//curl
|
|
{
|
|
const is_linux = target.result.os.tag == .linux;
|
|
if (is_linux) {
|
|
mod.addCMacro("HAVE_LINUX_TCP_H", "1");
|
|
mod.addCMacro("HAVE_MSG_NOSIGNAL", "1");
|
|
mod.addCMacro("HAVE_GETHOSTBYNAME_R", "1");
|
|
}
|
|
mod.addCMacro("_FILE_OFFSET_BITS", "64");
|
|
mod.addCMacro("BUILDING_LIBCURL", "1");
|
|
mod.addCMacro("CURL_DISABLE_AWS", "1");
|
|
mod.addCMacro("CURL_DISABLE_DICT", "1");
|
|
mod.addCMacro("CURL_DISABLE_DOH", "1");
|
|
mod.addCMacro("CURL_DISABLE_FILE", "1");
|
|
mod.addCMacro("CURL_DISABLE_FTP", "1");
|
|
mod.addCMacro("CURL_DISABLE_GOPHER", "1");
|
|
mod.addCMacro("CURL_DISABLE_KERBEROS", "1");
|
|
mod.addCMacro("CURL_DISABLE_IMAP", "1");
|
|
mod.addCMacro("CURL_DISABLE_IPFS", "1");
|
|
mod.addCMacro("CURL_DISABLE_LDAP", "1");
|
|
mod.addCMacro("CURL_DISABLE_LDAPS", "1");
|
|
mod.addCMacro("CURL_DISABLE_MQTT", "1");
|
|
mod.addCMacro("CURL_DISABLE_NTLM", "1");
|
|
mod.addCMacro("CURL_DISABLE_PROGRESS_METER", "1");
|
|
mod.addCMacro("CURL_DISABLE_POP3", "1");
|
|
mod.addCMacro("CURL_DISABLE_RTSP", "1");
|
|
mod.addCMacro("CURL_DISABLE_SMB", "1");
|
|
mod.addCMacro("CURL_DISABLE_SMTP", "1");
|
|
mod.addCMacro("CURL_DISABLE_TELNET", "1");
|
|
mod.addCMacro("CURL_DISABLE_TFTP", "1");
|
|
mod.addCMacro("CURL_EXTERN_SYMBOL", "__attribute__ ((__visibility__ (\"default\"))");
|
|
mod.addCMacro("CURL_OS", if (is_linux) "\"Linux\"" else "\"mac\"");
|
|
mod.addCMacro("CURL_STATICLIB", "1");
|
|
mod.addCMacro("ENABLE_IPV6", "1");
|
|
mod.addCMacro("HAVE_ALARM", "1");
|
|
mod.addCMacro("HAVE_ALLOCA_H", "1");
|
|
mod.addCMacro("HAVE_ARPA_INET_H", "1");
|
|
mod.addCMacro("HAVE_ARPA_TFTP_H", "1");
|
|
mod.addCMacro("HAVE_ASSERT_H", "1");
|
|
mod.addCMacro("HAVE_BASENAME", "1");
|
|
mod.addCMacro("HAVE_BOOL_T", "1");
|
|
mod.addCMacro("HAVE_BUILTIN_AVAILABLE", "1");
|
|
mod.addCMacro("HAVE_CLOCK_GETTIME_MONOTONIC", "1");
|
|
mod.addCMacro("HAVE_DLFCN_H", "1");
|
|
mod.addCMacro("HAVE_ERRNO_H", "1");
|
|
mod.addCMacro("HAVE_FCNTL", "1");
|
|
mod.addCMacro("HAVE_FCNTL_H", "1");
|
|
mod.addCMacro("HAVE_FCNTL_O_NONBLOCK", "1");
|
|
mod.addCMacro("HAVE_FREEADDRINFO", "1");
|
|
mod.addCMacro("HAVE_FSETXATTR", "1");
|
|
mod.addCMacro("HAVE_FSETXATTR_5", "1");
|
|
mod.addCMacro("HAVE_FTRUNCATE", "1");
|
|
mod.addCMacro("HAVE_GETADDRINFO", "1");
|
|
mod.addCMacro("HAVE_GETEUID", "1");
|
|
mod.addCMacro("HAVE_GETHOSTBYNAME", "1");
|
|
mod.addCMacro("HAVE_GETHOSTBYNAME_R_6", "1");
|
|
mod.addCMacro("HAVE_GETHOSTNAME", "1");
|
|
mod.addCMacro("HAVE_GETPEERNAME", "1");
|
|
mod.addCMacro("HAVE_GETPPID", "1");
|
|
mod.addCMacro("HAVE_GETPPID", "1");
|
|
mod.addCMacro("HAVE_GETPROTOBYNAME", "1");
|
|
mod.addCMacro("HAVE_GETPWUID", "1");
|
|
mod.addCMacro("HAVE_GETPWUID_R", "1");
|
|
mod.addCMacro("HAVE_GETRLIMIT", "1");
|
|
mod.addCMacro("HAVE_GETSOCKNAME", "1");
|
|
mod.addCMacro("HAVE_GETTIMEOFDAY", "1");
|
|
mod.addCMacro("HAVE_GMTIME_R", "1");
|
|
mod.addCMacro("HAVE_IDN2_H", "1");
|
|
mod.addCMacro("HAVE_IF_NAMETOINDEX", "1");
|
|
mod.addCMacro("HAVE_IFADDRS_H", "1");
|
|
mod.addCMacro("HAVE_INET_ADDR", "1");
|
|
mod.addCMacro("HAVE_INET_PTON", "1");
|
|
mod.addCMacro("HAVE_INTTYPES_H", "1");
|
|
mod.addCMacro("HAVE_IOCTL", "1");
|
|
mod.addCMacro("HAVE_IOCTL_FIONBIO", "1");
|
|
mod.addCMacro("HAVE_IOCTL_SIOCGIFADDR", "1");
|
|
mod.addCMacro("HAVE_LDAP_URL_PARSE", "1");
|
|
mod.addCMacro("HAVE_LIBGEN_H", "1");
|
|
mod.addCMacro("HAVE_LIBZ", "1");
|
|
mod.addCMacro("HAVE_LL", "1");
|
|
mod.addCMacro("HAVE_LOCALE_H", "1");
|
|
mod.addCMacro("HAVE_LOCALTIME_R", "1");
|
|
mod.addCMacro("HAVE_LONGLONG", "1");
|
|
mod.addCMacro("HAVE_MALLOC_H", "1");
|
|
mod.addCMacro("HAVE_MEMORY_H", "1");
|
|
mod.addCMacro("HAVE_NET_IF_H", "1");
|
|
mod.addCMacro("HAVE_NETDB_H", "1");
|
|
mod.addCMacro("HAVE_NETINET_IN_H", "1");
|
|
mod.addCMacro("HAVE_NETINET_TCP_H", "1");
|
|
mod.addCMacro("HAVE_PIPE", "1");
|
|
mod.addCMacro("HAVE_POLL", "1");
|
|
mod.addCMacro("HAVE_POLL_FINE", "1");
|
|
mod.addCMacro("HAVE_POLL_H", "1");
|
|
mod.addCMacro("HAVE_POSIX_STRERROR_R", "1");
|
|
mod.addCMacro("HAVE_PTHREAD_H", "1");
|
|
mod.addCMacro("HAVE_PWD_H", "1");
|
|
mod.addCMacro("HAVE_RECV", "1");
|
|
mod.addCMacro("HAVE_SA_FAMILY_T", "1");
|
|
mod.addCMacro("HAVE_SELECT", "1");
|
|
mod.addCMacro("HAVE_SEND", "1");
|
|
mod.addCMacro("HAVE_SETJMP_H", "1");
|
|
mod.addCMacro("HAVE_SETLOCALE", "1");
|
|
mod.addCMacro("HAVE_SETRLIMIT", "1");
|
|
mod.addCMacro("HAVE_SETSOCKOPT", "1");
|
|
mod.addCMacro("HAVE_SIGACTION", "1");
|
|
mod.addCMacro("HAVE_SIGINTERRUPT", "1");
|
|
mod.addCMacro("HAVE_SIGNAL", "1");
|
|
mod.addCMacro("HAVE_SIGNAL_H", "1");
|
|
mod.addCMacro("HAVE_SIGSETJMP", "1");
|
|
mod.addCMacro("HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID", "1");
|
|
mod.addCMacro("HAVE_SOCKET", "1");
|
|
mod.addCMacro("HAVE_STDBOOL_H", "1");
|
|
mod.addCMacro("HAVE_STDINT_H", "1");
|
|
mod.addCMacro("HAVE_STDIO_H", "1");
|
|
mod.addCMacro("HAVE_STDLIB_H", "1");
|
|
mod.addCMacro("HAVE_STRCASECMP", "1");
|
|
mod.addCMacro("HAVE_STRDUP", "1");
|
|
mod.addCMacro("HAVE_STRERROR_R", "1");
|
|
mod.addCMacro("HAVE_STRING_H", "1");
|
|
mod.addCMacro("HAVE_STRINGS_H", "1");
|
|
mod.addCMacro("HAVE_STRSTR", "1");
|
|
mod.addCMacro("HAVE_STRTOK_R", "1");
|
|
mod.addCMacro("HAVE_STRTOLL", "1");
|
|
mod.addCMacro("HAVE_STRUCT_SOCKADDR_STORAGE", "1");
|
|
mod.addCMacro("HAVE_STRUCT_TIMEVAL", "1");
|
|
mod.addCMacro("HAVE_SYS_IOCTL_H", "1");
|
|
mod.addCMacro("HAVE_SYS_PARAM_H", "1");
|
|
mod.addCMacro("HAVE_SYS_POLL_H", "1");
|
|
mod.addCMacro("HAVE_SYS_RESOURCE_H", "1");
|
|
mod.addCMacro("HAVE_SYS_SELECT_H", "1");
|
|
mod.addCMacro("HAVE_SYS_SOCKET_H", "1");
|
|
mod.addCMacro("HAVE_SYS_STAT_H", "1");
|
|
mod.addCMacro("HAVE_SYS_TIME_H", "1");
|
|
mod.addCMacro("HAVE_SYS_TYPES_H", "1");
|
|
mod.addCMacro("HAVE_SYS_UIO_H", "1");
|
|
mod.addCMacro("HAVE_SYS_UN_H", "1");
|
|
mod.addCMacro("HAVE_TERMIO_H", "1");
|
|
mod.addCMacro("HAVE_TERMIOS_H", "1");
|
|
mod.addCMacro("HAVE_TIME_H", "1");
|
|
mod.addCMacro("HAVE_UNAME", "1");
|
|
mod.addCMacro("HAVE_UNISTD_H", "1");
|
|
mod.addCMacro("HAVE_UTIME", "1");
|
|
mod.addCMacro("HAVE_UTIME_H", "1");
|
|
mod.addCMacro("HAVE_UTIMES", "1");
|
|
mod.addCMacro("HAVE_VARIADIC_MACROS_C99", "1");
|
|
mod.addCMacro("HAVE_VARIADIC_MACROS_GCC", "1");
|
|
mod.addCMacro("HAVE_ZLIB_H", "1");
|
|
mod.addCMacro("RANDOM_FILE", "\"/dev/urandom\"");
|
|
mod.addCMacro("RECV_TYPE_ARG1", "int");
|
|
mod.addCMacro("RECV_TYPE_ARG2", "void *");
|
|
mod.addCMacro("RECV_TYPE_ARG3", "size_t");
|
|
mod.addCMacro("RECV_TYPE_ARG4", "int");
|
|
mod.addCMacro("RECV_TYPE_RETV", "ssize_t");
|
|
mod.addCMacro("SEND_QUAL_ARG2", "const");
|
|
mod.addCMacro("SEND_TYPE_ARG1", "int");
|
|
mod.addCMacro("SEND_TYPE_ARG2", "void *");
|
|
mod.addCMacro("SEND_TYPE_ARG3", "size_t");
|
|
mod.addCMacro("SEND_TYPE_ARG4", "int");
|
|
mod.addCMacro("SEND_TYPE_RETV", "ssize_t");
|
|
mod.addCMacro("SIZEOF_CURL_OFF_T", "8");
|
|
mod.addCMacro("SIZEOF_INT", "4");
|
|
mod.addCMacro("SIZEOF_LONG", "8");
|
|
mod.addCMacro("SIZEOF_OFF_T", "8");
|
|
mod.addCMacro("SIZEOF_SHORT", "2");
|
|
mod.addCMacro("SIZEOF_SIZE_T", "8");
|
|
mod.addCMacro("SIZEOF_TIME_T", "8");
|
|
mod.addCMacro("STDC_HEADERS", "1");
|
|
mod.addCMacro("TIME_WITH_SYS_TIME", "1");
|
|
mod.addCMacro("USE_NGHTTP2", "1");
|
|
mod.addCMacro("USE_MBEDTLS", "1");
|
|
mod.addCMacro("USE_THREADS_POSIX", "1");
|
|
mod.addCMacro("USE_UNIX_SOCKETS", "1");
|
|
}
|
|
|
|
try buildZlib(b, mod);
|
|
try buildMbedtls(b, mod);
|
|
try buildNghttp2(b, mod);
|
|
try buildCurl(b, mod);
|
|
|
|
switch (target.result.os.tag) {
|
|
.macos => {
|
|
// needed for proxying on mac
|
|
mod.addSystemFrameworkPath(.{ .cwd_relative = "/System/Library/Frameworks" });
|
|
mod.linkFramework("CoreFoundation", .{});
|
|
mod.linkFramework("SystemConfiguration", .{});
|
|
},
|
|
else => {},
|
|
}
|
|
}
|
|
}
|
|
|
|
fn moduleNetSurf(b: *Build, mod: *Build.Module) !void {
|
|
const target = mod.resolved_target.?;
|
|
const os = target.result.os.tag;
|
|
const arch = target.result.cpu.arch;
|
|
|
|
// iconv
|
|
const libiconv_lib_path = try std.fmt.allocPrint(
|
|
b.allocator,
|
|
"vendor/libiconv/out/{s}-{s}/lib/libiconv.a",
|
|
.{ @tagName(os), @tagName(arch) },
|
|
);
|
|
const libiconv_include_path = try std.fmt.allocPrint(
|
|
b.allocator,
|
|
"vendor/libiconv/out/{s}-{s}/lib/libiconv.a",
|
|
.{ @tagName(os), @tagName(arch) },
|
|
);
|
|
mod.addObjectFile(b.path(libiconv_lib_path));
|
|
mod.addIncludePath(b.path(libiconv_include_path));
|
|
|
|
{
|
|
// mimalloc
|
|
const mimalloc = "vendor/mimalloc";
|
|
const lib_path = try std.fmt.allocPrint(
|
|
b.allocator,
|
|
mimalloc ++ "/out/{s}-{s}/lib/libmimalloc.a",
|
|
.{ @tagName(os), @tagName(arch) },
|
|
);
|
|
mod.addObjectFile(b.path(lib_path));
|
|
mod.addIncludePath(b.path(mimalloc ++ "/include"));
|
|
}
|
|
|
|
// netsurf libs
|
|
const ns = "vendor/netsurf";
|
|
const ns_include_path = try std.fmt.allocPrint(
|
|
b.allocator,
|
|
ns ++ "/out/{s}-{s}/include",
|
|
.{ @tagName(os), @tagName(arch) },
|
|
);
|
|
mod.addIncludePath(b.path(ns_include_path));
|
|
|
|
const libs: [4][]const u8 = .{
|
|
"libdom",
|
|
"libhubbub",
|
|
"libparserutils",
|
|
"libwapcaplet",
|
|
};
|
|
inline for (libs) |lib| {
|
|
const ns_lib_path = try std.fmt.allocPrint(
|
|
b.allocator,
|
|
ns ++ "/out/{s}-{s}/lib/" ++ lib ++ ".a",
|
|
.{ @tagName(os), @tagName(arch) },
|
|
);
|
|
mod.addObjectFile(b.path(ns_lib_path));
|
|
mod.addIncludePath(b.path(ns ++ "/" ++ lib ++ "/src"));
|
|
}
|
|
}
|
|
|
|
fn buildZlib(b: *Build, m: *Build.Module) !void {
|
|
const zlib = b.addLibrary(.{
|
|
.name = "zlib",
|
|
.root_module = m,
|
|
});
|
|
|
|
const root = "vendor/zlib/";
|
|
zlib.installHeader(b.path(root ++ "zlib.h"), "zlib.h");
|
|
zlib.installHeader(b.path(root ++ "zconf.h"), "zconf.h");
|
|
zlib.addCSourceFiles(.{ .flags = &.{
|
|
"-DHAVE_SYS_TYPES_H",
|
|
"-DHAVE_STDINT_H",
|
|
"-DHAVE_STDDEF_H",
|
|
}, .files = &.{
|
|
root ++ "adler32.c",
|
|
root ++ "compress.c",
|
|
root ++ "crc32.c",
|
|
root ++ "deflate.c",
|
|
root ++ "gzclose.c",
|
|
root ++ "gzlib.c",
|
|
root ++ "gzread.c",
|
|
root ++ "gzwrite.c",
|
|
root ++ "inflate.c",
|
|
root ++ "infback.c",
|
|
root ++ "inftrees.c",
|
|
root ++ "inffast.c",
|
|
root ++ "trees.c",
|
|
root ++ "uncompr.c",
|
|
root ++ "zutil.c",
|
|
} });
|
|
}
|
|
|
|
fn buildMbedtls(b: *Build, m: *Build.Module) !void {
|
|
const mbedtls = b.addLibrary(.{
|
|
.name = "mbedtls",
|
|
.root_module = m,
|
|
});
|
|
|
|
const root = "vendor/mbedtls/";
|
|
mbedtls.addIncludePath(b.path(root ++ "include"));
|
|
mbedtls.addIncludePath(b.path(root ++ "library"));
|
|
|
|
mbedtls.addCSourceFiles(.{ .flags = &.{}, .files = &.{
|
|
root ++ "library/aes.c",
|
|
root ++ "library/aesni.c",
|
|
root ++ "library/aesce.c",
|
|
root ++ "library/aria.c",
|
|
root ++ "library/asn1parse.c",
|
|
root ++ "library/asn1write.c",
|
|
root ++ "library/base64.c",
|
|
root ++ "library/bignum.c",
|
|
root ++ "library/bignum_core.c",
|
|
root ++ "library/bignum_mod.c",
|
|
root ++ "library/bignum_mod_raw.c",
|
|
root ++ "library/camellia.c",
|
|
root ++ "library/ccm.c",
|
|
root ++ "library/chacha20.c",
|
|
root ++ "library/chachapoly.c",
|
|
root ++ "library/cipher.c",
|
|
root ++ "library/cipher_wrap.c",
|
|
root ++ "library/constant_time.c",
|
|
root ++ "library/cmac.c",
|
|
root ++ "library/ctr_drbg.c",
|
|
root ++ "library/des.c",
|
|
root ++ "library/dhm.c",
|
|
root ++ "library/ecdh.c",
|
|
root ++ "library/ecdsa.c",
|
|
root ++ "library/ecjpake.c",
|
|
root ++ "library/ecp.c",
|
|
root ++ "library/ecp_curves.c",
|
|
root ++ "library/entropy.c",
|
|
root ++ "library/entropy_poll.c",
|
|
root ++ "library/error.c",
|
|
root ++ "library/gcm.c",
|
|
root ++ "library/hkdf.c",
|
|
root ++ "library/hmac_drbg.c",
|
|
root ++ "library/lmots.c",
|
|
root ++ "library/lms.c",
|
|
root ++ "library/md.c",
|
|
root ++ "library/md5.c",
|
|
root ++ "library/memory_buffer_alloc.c",
|
|
root ++ "library/nist_kw.c",
|
|
root ++ "library/oid.c",
|
|
root ++ "library/padlock.c",
|
|
root ++ "library/pem.c",
|
|
root ++ "library/pk.c",
|
|
root ++ "library/pk_ecc.c",
|
|
root ++ "library/pk_wrap.c",
|
|
root ++ "library/pkcs12.c",
|
|
root ++ "library/pkcs5.c",
|
|
root ++ "library/pkparse.c",
|
|
root ++ "library/pkwrite.c",
|
|
root ++ "library/platform.c",
|
|
root ++ "library/platform_util.c",
|
|
root ++ "library/poly1305.c",
|
|
root ++ "library/psa_crypto.c",
|
|
root ++ "library/psa_crypto_aead.c",
|
|
root ++ "library/psa_crypto_cipher.c",
|
|
root ++ "library/psa_crypto_client.c",
|
|
root ++ "library/psa_crypto_ffdh.c",
|
|
root ++ "library/psa_crypto_driver_wrappers_no_static.c",
|
|
root ++ "library/psa_crypto_ecp.c",
|
|
root ++ "library/psa_crypto_hash.c",
|
|
root ++ "library/psa_crypto_mac.c",
|
|
root ++ "library/psa_crypto_pake.c",
|
|
root ++ "library/psa_crypto_rsa.c",
|
|
root ++ "library/psa_crypto_se.c",
|
|
root ++ "library/psa_crypto_slot_management.c",
|
|
root ++ "library/psa_crypto_storage.c",
|
|
root ++ "library/psa_its_file.c",
|
|
root ++ "library/psa_util.c",
|
|
root ++ "library/ripemd160.c",
|
|
root ++ "library/rsa.c",
|
|
root ++ "library/rsa_alt_helpers.c",
|
|
root ++ "library/sha1.c",
|
|
root ++ "library/sha3.c",
|
|
root ++ "library/sha256.c",
|
|
root ++ "library/sha512.c",
|
|
root ++ "library/threading.c",
|
|
root ++ "library/timing.c",
|
|
root ++ "library/version.c",
|
|
root ++ "library/version_features.c",
|
|
root ++ "library/pkcs7.c",
|
|
root ++ "library/x509.c",
|
|
root ++ "library/x509_create.c",
|
|
root ++ "library/x509_crl.c",
|
|
root ++ "library/x509_crt.c",
|
|
root ++ "library/x509_csr.c",
|
|
root ++ "library/x509write.c",
|
|
root ++ "library/x509write_crt.c",
|
|
root ++ "library/x509write_csr.c",
|
|
root ++ "library/debug.c",
|
|
root ++ "library/mps_reader.c",
|
|
root ++ "library/mps_trace.c",
|
|
root ++ "library/net_sockets.c",
|
|
root ++ "library/ssl_cache.c",
|
|
root ++ "library/ssl_ciphersuites.c",
|
|
root ++ "library/ssl_client.c",
|
|
root ++ "library/ssl_cookie.c",
|
|
root ++ "library/ssl_debug_helpers_generated.c",
|
|
root ++ "library/ssl_msg.c",
|
|
root ++ "library/ssl_ticket.c",
|
|
root ++ "library/ssl_tls.c",
|
|
root ++ "library/ssl_tls12_client.c",
|
|
root ++ "library/ssl_tls12_server.c",
|
|
root ++ "library/ssl_tls13_keys.c",
|
|
root ++ "library/ssl_tls13_server.c",
|
|
root ++ "library/ssl_tls13_client.c",
|
|
root ++ "library/ssl_tls13_generic.c",
|
|
} });
|
|
}
|
|
|
|
fn buildNghttp2(b: *Build, m: *Build.Module) !void {
|
|
const nghttp2 = b.addLibrary(.{
|
|
.name = "nghttp2",
|
|
.root_module = m,
|
|
});
|
|
|
|
const root = "vendor/nghttp2/";
|
|
nghttp2.addIncludePath(b.path(root ++ "lib"));
|
|
nghttp2.addIncludePath(b.path(root ++ "lib/includes"));
|
|
nghttp2.addCSourceFiles(.{ .flags = &.{
|
|
"-DNGHTTP2_STATICLIB",
|
|
"-DHAVE_NETINET_IN",
|
|
"-DHAVE_TIME_H",
|
|
}, .files = &.{
|
|
root ++ "lib/sfparse.c",
|
|
root ++ "lib/nghttp2_alpn.c",
|
|
root ++ "lib/nghttp2_buf.c",
|
|
root ++ "lib/nghttp2_callbacks.c",
|
|
root ++ "lib/nghttp2_debug.c",
|
|
root ++ "lib/nghttp2_extpri.c",
|
|
root ++ "lib/nghttp2_frame.c",
|
|
root ++ "lib/nghttp2_hd.c",
|
|
root ++ "lib/nghttp2_hd_huffman.c",
|
|
root ++ "lib/nghttp2_hd_huffman_data.c",
|
|
root ++ "lib/nghttp2_helper.c",
|
|
root ++ "lib/nghttp2_http.c",
|
|
root ++ "lib/nghttp2_map.c",
|
|
root ++ "lib/nghttp2_mem.c",
|
|
root ++ "lib/nghttp2_option.c",
|
|
root ++ "lib/nghttp2_outbound_item.c",
|
|
root ++ "lib/nghttp2_pq.c",
|
|
root ++ "lib/nghttp2_priority_spec.c",
|
|
root ++ "lib/nghttp2_queue.c",
|
|
root ++ "lib/nghttp2_rcbuf.c",
|
|
root ++ "lib/nghttp2_session.c",
|
|
root ++ "lib/nghttp2_stream.c",
|
|
root ++ "lib/nghttp2_submit.c",
|
|
root ++ "lib/nghttp2_version.c",
|
|
root ++ "lib/nghttp2_ratelim.c",
|
|
root ++ "lib/nghttp2_time.c",
|
|
} });
|
|
}
|
|
|
|
fn buildCurl(b: *Build, m: *Build.Module) !void {
|
|
const curl = b.addLibrary(.{
|
|
.name = "curl",
|
|
.root_module = m,
|
|
});
|
|
|
|
const root = "vendor/curl/";
|
|
|
|
curl.addIncludePath(b.path(root ++ "lib"));
|
|
curl.addIncludePath(b.path(root ++ "include"));
|
|
curl.addCSourceFiles(.{
|
|
.flags = &.{},
|
|
.files = &.{
|
|
root ++ "lib/altsvc.c",
|
|
root ++ "lib/amigaos.c",
|
|
root ++ "lib/asyn-ares.c",
|
|
root ++ "lib/asyn-base.c",
|
|
root ++ "lib/asyn-thrdd.c",
|
|
root ++ "lib/bufq.c",
|
|
root ++ "lib/bufref.c",
|
|
root ++ "lib/cf-h1-proxy.c",
|
|
root ++ "lib/cf-h2-proxy.c",
|
|
root ++ "lib/cf-haproxy.c",
|
|
root ++ "lib/cf-https-connect.c",
|
|
root ++ "lib/cf-socket.c",
|
|
root ++ "lib/cfilters.c",
|
|
root ++ "lib/conncache.c",
|
|
root ++ "lib/connect.c",
|
|
root ++ "lib/content_encoding.c",
|
|
root ++ "lib/cookie.c",
|
|
root ++ "lib/cshutdn.c",
|
|
root ++ "lib/curl_addrinfo.c",
|
|
root ++ "lib/curl_des.c",
|
|
root ++ "lib/curl_endian.c",
|
|
root ++ "lib/curl_fnmatch.c",
|
|
root ++ "lib/curl_get_line.c",
|
|
root ++ "lib/curl_gethostname.c",
|
|
root ++ "lib/curl_gssapi.c",
|
|
root ++ "lib/curl_memrchr.c",
|
|
root ++ "lib/curl_ntlm_core.c",
|
|
root ++ "lib/curl_range.c",
|
|
root ++ "lib/curl_rtmp.c",
|
|
root ++ "lib/curl_sasl.c",
|
|
root ++ "lib/curl_sha512_256.c",
|
|
root ++ "lib/curl_sspi.c",
|
|
root ++ "lib/curl_threads.c",
|
|
root ++ "lib/curl_trc.c",
|
|
root ++ "lib/cw-out.c",
|
|
root ++ "lib/cw-pause.c",
|
|
root ++ "lib/dict.c",
|
|
root ++ "lib/doh.c",
|
|
root ++ "lib/dynhds.c",
|
|
root ++ "lib/easy.c",
|
|
root ++ "lib/easygetopt.c",
|
|
root ++ "lib/easyoptions.c",
|
|
root ++ "lib/escape.c",
|
|
root ++ "lib/fake_addrinfo.c",
|
|
root ++ "lib/file.c",
|
|
root ++ "lib/fileinfo.c",
|
|
root ++ "lib/fopen.c",
|
|
root ++ "lib/formdata.c",
|
|
root ++ "lib/ftp.c",
|
|
root ++ "lib/ftplistparser.c",
|
|
root ++ "lib/getenv.c",
|
|
root ++ "lib/getinfo.c",
|
|
root ++ "lib/gopher.c",
|
|
root ++ "lib/hash.c",
|
|
root ++ "lib/headers.c",
|
|
root ++ "lib/hmac.c",
|
|
root ++ "lib/hostip.c",
|
|
root ++ "lib/hostip4.c",
|
|
root ++ "lib/hostip6.c",
|
|
root ++ "lib/hsts.c",
|
|
root ++ "lib/http.c",
|
|
root ++ "lib/http1.c",
|
|
root ++ "lib/http2.c",
|
|
root ++ "lib/http_aws_sigv4.c",
|
|
root ++ "lib/http_chunks.c",
|
|
root ++ "lib/http_digest.c",
|
|
root ++ "lib/http_negotiate.c",
|
|
root ++ "lib/http_ntlm.c",
|
|
root ++ "lib/http_proxy.c",
|
|
root ++ "lib/httpsrr.c",
|
|
root ++ "lib/idn.c",
|
|
root ++ "lib/if2ip.c",
|
|
root ++ "lib/imap.c",
|
|
root ++ "lib/krb5.c",
|
|
root ++ "lib/ldap.c",
|
|
root ++ "lib/llist.c",
|
|
root ++ "lib/macos.c",
|
|
root ++ "lib/md4.c",
|
|
root ++ "lib/md5.c",
|
|
root ++ "lib/memdebug.c",
|
|
root ++ "lib/mime.c",
|
|
root ++ "lib/mprintf.c",
|
|
root ++ "lib/mqtt.c",
|
|
root ++ "lib/multi.c",
|
|
root ++ "lib/multi_ev.c",
|
|
root ++ "lib/netrc.c",
|
|
root ++ "lib/noproxy.c",
|
|
root ++ "lib/openldap.c",
|
|
root ++ "lib/parsedate.c",
|
|
root ++ "lib/pingpong.c",
|
|
root ++ "lib/pop3.c",
|
|
root ++ "lib/progress.c",
|
|
root ++ "lib/psl.c",
|
|
root ++ "lib/rand.c",
|
|
root ++ "lib/rename.c",
|
|
root ++ "lib/request.c",
|
|
root ++ "lib/rtsp.c",
|
|
root ++ "lib/select.c",
|
|
root ++ "lib/sendf.c",
|
|
root ++ "lib/setopt.c",
|
|
root ++ "lib/sha256.c",
|
|
root ++ "lib/share.c",
|
|
root ++ "lib/slist.c",
|
|
root ++ "lib/smb.c",
|
|
root ++ "lib/smtp.c",
|
|
root ++ "lib/socketpair.c",
|
|
root ++ "lib/socks.c",
|
|
root ++ "lib/socks_gssapi.c",
|
|
root ++ "lib/socks_sspi.c",
|
|
root ++ "lib/speedcheck.c",
|
|
root ++ "lib/splay.c",
|
|
root ++ "lib/strcase.c",
|
|
root ++ "lib/strdup.c",
|
|
root ++ "lib/strequal.c",
|
|
root ++ "lib/strerror.c",
|
|
root ++ "lib/system_win32.c",
|
|
root ++ "lib/telnet.c",
|
|
root ++ "lib/tftp.c",
|
|
root ++ "lib/transfer.c",
|
|
root ++ "lib/uint-bset.c",
|
|
root ++ "lib/uint-hash.c",
|
|
root ++ "lib/uint-spbset.c",
|
|
root ++ "lib/uint-table.c",
|
|
root ++ "lib/url.c",
|
|
root ++ "lib/urlapi.c",
|
|
root ++ "lib/version.c",
|
|
root ++ "lib/ws.c",
|
|
root ++ "lib/curlx/base64.c",
|
|
root ++ "lib/curlx/dynbuf.c",
|
|
root ++ "lib/curlx/inet_ntop.c",
|
|
root ++ "lib/curlx/nonblock.c",
|
|
root ++ "lib/curlx/strparse.c",
|
|
root ++ "lib/curlx/timediff.c",
|
|
root ++ "lib/curlx/timeval.c",
|
|
root ++ "lib/curlx/wait.c",
|
|
root ++ "lib/curlx/warnless.c",
|
|
root ++ "lib/vquic/curl_ngtcp2.c",
|
|
root ++ "lib/vquic/curl_osslq.c",
|
|
root ++ "lib/vquic/curl_quiche.c",
|
|
root ++ "lib/vquic/vquic.c",
|
|
root ++ "lib/vquic/vquic-tls.c",
|
|
root ++ "lib/vauth/cleartext.c",
|
|
root ++ "lib/vauth/cram.c",
|
|
root ++ "lib/vauth/digest.c",
|
|
root ++ "lib/vauth/digest_sspi.c",
|
|
root ++ "lib/vauth/gsasl.c",
|
|
root ++ "lib/vauth/krb5_gssapi.c",
|
|
root ++ "lib/vauth/krb5_sspi.c",
|
|
root ++ "lib/vauth/ntlm.c",
|
|
root ++ "lib/vauth/ntlm_sspi.c",
|
|
root ++ "lib/vauth/oauth2.c",
|
|
root ++ "lib/vauth/spnego_gssapi.c",
|
|
root ++ "lib/vauth/spnego_sspi.c",
|
|
root ++ "lib/vauth/vauth.c",
|
|
root ++ "lib/vtls/cipher_suite.c",
|
|
root ++ "lib/vtls/mbedtls.c",
|
|
root ++ "lib/vtls/mbedtls_threadlock.c",
|
|
root ++ "lib/vtls/vtls.c",
|
|
root ++ "lib/vtls/vtls_scache.c",
|
|
root ++ "lib/vtls/x509asn1.c",
|
|
},
|
|
});
|
|
}
|