diff --git a/build.zig b/build.zig index c45924d..2017afc 100644 --- a/build.zig +++ b/build.zig @@ -1,40 +1,66 @@ const std = @import("std"); +const Pkg = std.build.Pkg; -const util_pkg = std.build.Pkg{ - .name = "util", - .source = std.build.FileSource.relative("src/util/lib.zig"), +const Packages = struct { + opts: Pkg, + util: Pkg, + http: Pkg, + sql: Pkg, + api: Pkg, + template: Pkg, + main: Pkg, }; -const http_pkg = std.build.Pkg{ - .name = "http", - .source = std.build.FileSource.relative("src/http/lib.zig"), - .dependencies = &.{util_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 sql_pkg = std.build.Pkg{ - .name = "sql", - .source = std.build.FileSource.relative("src/sql/lib.zig"), - .dependencies = &.{util_pkg}, -}; + const http_pkg = b.dupePkg(.{ + .name = "http", + .source = std.build.FileSource.relative("src/http/lib.zig"), + .dependencies = &.{ util_pkg, opt }, + }); -const api_pkg = std.build.Pkg{ - .name = "api", - .source = std.build.FileSource.relative("src/api/lib.zig"), - .dependencies = &.{ util_pkg, sql_pkg }, -}; + const sql_pkg = b.dupePkg(.{ + .name = "sql", + .source = std.build.FileSource.relative("src/sql/lib.zig"), + .dependencies = &.{ util_pkg, opt }, + }); -const template_pkg = std.build.Pkg{ - .name = "template", - .source = std.build.FileSource.relative("src/template/lib.zig"), -}; + const api_pkg = b.dupePkg(.{ + .name = "api", + .source = std.build.FileSource.relative("src/api/lib.zig"), + .dependencies = &.{ util_pkg, sql_pkg, opt }, + }); -const main_pkg = std.build.Pkg{ - .name = "main", - .source = std.build.FileSource.relative("src/main/main.zig"), - .dependencies = &.{ util_pkg, http_pkg, sql_pkg, api_pkg, template_pkg }, -}; + const template_pkg = b.dupePkg(.{ + .name = "template", + .source = std.build.FileSource.relative("src/template/lib.zig"), + .dependencies = &.{opt}, + }); -pub fn build(b: *std.build.Builder) void { + 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 @@ -44,26 +70,38 @@ pub fn build(b: *std.build.Builder) void { // 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("apub", "src/main/main.zig"); exe.setTarget(target); exe.setBuildMode(mode); - exe.addPackage(sql_pkg); - exe.addPackage(util_pkg); - exe.addPackage(http_pkg); - exe.addPackage(api_pkg); - exe.addPackage(template_pkg); + exe.addPackage(pkgs.opts); + exe.addPackage(pkgs.sql); + exe.addPackage(pkgs.util); + exe.addPackage(pkgs.http); + exe.addPackage(pkgs.api); + exe.addPackage(pkgs.template); - exe.linkSystemLibrary("sqlite3"); - exe.linkSystemLibrary("pq"); + if (enable_sqlite) exe.linkSystemLibrary("sqlite3"); + if (enable_postgres) exe.linkSystemLibrary("pq"); exe.linkLibC(); //const util_tests = b.addTest("src/util/lib.zig"); const http_tests = b.addTest("src/http/test.zig"); //const sql_tests = b.addTest("src/sql/lib.zig"); - http_tests.addPackage(util_pkg); - //sql_tests.addPackage(util_pkg); + http_tests.addPackage(pkgs.util); + //sql_tests.addPackage(pkgs.util); const unit_tests = b.step("unit-tests", "Run tests"); //unit_tests.dependOn(&util_tests.step); @@ -71,14 +109,15 @@ pub fn build(b: *std.build.Builder) void { //unit_tests.dependOn(&sql_tests.step); const api_integration = b.addTest("./tests/api_integration/lib.zig"); - api_integration.addPackage(sql_pkg); - api_integration.addPackage(util_pkg); - api_integration.addPackage(http_pkg); - api_integration.addPackage(main_pkg); - api_integration.addPackage(api_pkg); + 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.linkSystemLibrary("sqlite3"); - api_integration.linkSystemLibrary("pq"); + 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); diff --git a/src/sql/lib.zig b/src/sql/lib.zig index 88c2bf1..358a2d3 100644 --- a/src/sql/lib.zig +++ b/src/sql/lib.zig @@ -1,10 +1,16 @@ const std = @import("std"); const util = @import("util"); +const build_options = @import("build_options"); -const postgres = @import("./engines/postgres.zig"); -//const postgres = @import("./engines/null.zig"); -const sqlite = @import("./engines/sqlite.zig"); -//const sqlite = @import("./engines/null.zig"); +const postgres = if (build_options.enable_postgres) + @import("./engines/postgres.zig") +else + @import("./engines/null.zig"); + +const sqlite = if (build_options.enable_sqlite) + @import("./engines/sqlite.zig") +else + @import("./engines/null.zig"); const common = @import("./engines/common.zig"); const Allocator = std.mem.Allocator;