fediglam/build.zig

172 lines
6.3 KiB
Zig

const std = @import("std");
const Pkg = std.build.Pkg;
const Packages = struct {
opts: Pkg,
util: Pkg,
http: Pkg,
sql: Pkg,
api: Pkg,
template: Pkg,
main: Pkg,
};
fn makePkgs(b: *std.build.Builder, build_options: Pkg) Packages {
const opt = b.dupePkg(build_options);
const util_pkg = b.dupePkg(.{
.name = "util",
.source = std.build.FileSource.relative("src/util/lib.zig"),
.dependencies = &.{opt},
});
const http_pkg = b.dupePkg(.{
.name = "http",
.source = std.build.FileSource.relative("src/http/lib.zig"),
.dependencies = &.{ util_pkg, opt },
});
const sql_pkg = b.dupePkg(.{
.name = "sql",
.source = std.build.FileSource.relative("src/sql/lib.zig"),
.dependencies = &.{ util_pkg, opt },
});
const api_pkg = b.dupePkg(.{
.name = "api",
.source = std.build.FileSource.relative("src/api/lib.zig"),
.dependencies = &.{ util_pkg, sql_pkg, opt },
});
const template_pkg = b.dupePkg(.{
.name = "template",
.source = std.build.FileSource.relative("src/template/lib.zig"),
.dependencies = &.{opt},
});
const main_pkg = b.dupePkg(.{
.name = "main",
.source = std.build.FileSource.relative("src/main/main.zig"),
.dependencies = &.{ util_pkg, http_pkg, sql_pkg, api_pkg, template_pkg, opt },
});
return Packages{
.opts = opt,
.util = util_pkg,
.http = http_pkg,
.sql = sql_pkg,
.api = api_pkg,
.template = template_pkg,
.main = main_pkg,
};
}
pub fn build(b: *std.build.Builder) !void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const options = b.addOptions();
const enable_sqlite = b.option(bool, "sqlite", "Enable the use of sqlite as a database engine") orelse true;
const enable_postgres = b.option(bool, "postgres", "Enable the use of postgres as a database engine") orelse true;
options.addOption(bool, "enable_sqlite", enable_sqlite);
options.addOption(bool, "enable_postgres", enable_postgres);
if (!enable_sqlite and !enable_postgres) {
std.log.err("No database engine enabled", .{});
return error.InvalidBuildOptions;
}
const pkgs = makePkgs(b, options.getPackage("build_options"));
const exe = b.addExecutable("fediglam", "src/main/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.addPackage(pkgs.opts);
exe.addPackage(pkgs.sql);
exe.addPackage(pkgs.util);
exe.addPackage(pkgs.http);
exe.addPackage(pkgs.api);
exe.addPackage(pkgs.template);
if (enable_sqlite) exe.linkSystemLibrary("sqlite3");
if (enable_postgres) exe.linkSystemLibrary("pq");
exe.linkLibC();
exe.addSystemIncludePath("/usr/include/");
exe.addSystemIncludePath("/usr/include/postgresql"); // HACK
const unittest_options = b.addOptions();
unittest_options.addOption(bool, "enable_sqlite", false);
unittest_options.addOption(bool, "enable_postgres", false);
const unittest_pkgs = makePkgs(b, unittest_options.getPackage("build_options"));
const unittest_http_cmd = b.step("unit:http", "Run tests for http package");
const unittest_http = b.addTest("src/http/lib.zig");
unittest_http_cmd.dependOn(&unittest_http.step);
unittest_http.addPackage(unittest_pkgs.util);
const unittest_util_cmd = b.step("unit:util", "Run tests for util package");
const unittest_util = b.addTest("src/util/lib.zig");
unittest_util_cmd.dependOn(&unittest_util.step);
const unittest_sql_cmd = b.step("unit:sql", "Run tests for sql package");
const unittest_sql = b.addTest("src/sql/lib.zig");
unittest_sql_cmd.dependOn(&unittest_sql.step);
unittest_sql.addPackage(unittest_pkgs.util);
//unittest_sql.linkLibC();
const unittest_template_cmd = b.step("unit:template", "Run tests for template package");
const unittest_template = b.addTest("src/template/lib.zig");
unittest_template_cmd.dependOn(&unittest_template.step);
const unittest_api_cmd = b.step("unit:api", "Run tests for api package");
const unittest_api = b.addTest("src/api/lib.zig");
unittest_api_cmd.dependOn(&unittest_api.step);
unittest_api.addPackage(unittest_pkgs.util);
unittest_api.addPackage(unittest_pkgs.sql);
//unittest_api.linkLibC();
//const util_tests = b.addTest("src/util/lib.zig");
//const sql_tests = b.addTest("src/sql/lib.zig");
//http_tests.addPackage(pkgs.util);
//sql_tests.addPackage(pkgs.util);
//const unit_tests = b.step("unit-tests", "Run tests");
const unittest_all = b.step("unit", "Run unit tests");
unittest_all.dependOn(unittest_http_cmd);
unittest_all.dependOn(unittest_util_cmd);
unittest_all.dependOn(unittest_sql_cmd);
unittest_all.dependOn(unittest_template_cmd);
unittest_all.dependOn(unittest_api_cmd);
const api_integration = b.addTest("./tests/api_integration/lib.zig");
api_integration.addPackage(pkgs.opts);
api_integration.addPackage(pkgs.sql);
api_integration.addPackage(pkgs.util);
api_integration.addPackage(pkgs.http);
api_integration.addPackage(pkgs.main);
api_integration.addPackage(pkgs.api);
api_integration.linkLibC();
api_integration.addSystemIncludePath("/usr/include/");
api_integration.addSystemIncludePath("/usr/include/postgresql"); // HACK
if (enable_sqlite) api_integration.linkSystemLibrary("sqlite3");
if (enable_postgres) api_integration.linkSystemLibrary("pq");
const integration_tests = b.step("integration-tests", "run tests");
integration_tests.dependOn(&api_integration.step);
const run_cmd = exe.run();
//run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the server");
run_step.dependOn(&run_cmd.step);
}