From 80d5b663d93f6784f8769479f969ae2569c1a7d2 Mon Sep 17 00:00:00 2001 From: Tudor Andrei Dicu <69104075+tact1m4n3@users.noreply.github.com> Date: Fri, 22 Nov 2024 18:41:18 +0200 Subject: [PATCH] Build system bug fix (#292) * fix build system bug * fixed examples and package-test * fix `package-test` compile errors * better comments --- build.zig | 48 +++++++++++++++++++++------ examples/build.zig | 2 +- examples/gigadevice/gd32/build.zig | 2 +- examples/microchip/atsam/build.zig | 2 +- examples/microchip/avr/build.zig | 2 +- examples/nordic/nrf5x/build.zig | 2 +- examples/nxp/lpc/build.zig | 2 +- examples/raspberrypi/rp2xxx/build.zig | 2 +- examples/stmicro/stm32/build.zig | 2 +- tools/package-test/build.zig | 6 ++-- tools/package-test/build.zig.zon | 1 + 11 files changed, 50 insertions(+), 21 deletions(-) diff --git a/build.zig b/build.zig index b243d2ff..9d5e1adf 100644 --- a/build.zig +++ b/build.zig @@ -2,7 +2,7 @@ const std = @import("std"); const Build = std.Build; const LazyPath = Build.LazyPath; -const internals = @import("microzig/build-internals"); +const internals = @import("build-internals"); pub const Target = internals.Target; pub const Chip = internals.Chip; pub const HardwareAbstractionLayer = internals.HardwareAbstractionLayer; @@ -10,7 +10,7 @@ pub const Board = internals.Board; pub const BinaryFormat = internals.BinaryFormat; pub const MemoryRegion = internals.MemoryRegion; -const regz = @import("microzig/tools/regz"); +const regz = @import("tools/regz"); const port_list: []const struct { name: [:0]const u8, @@ -102,6 +102,31 @@ pub const PortCache = blk: { var port_cache: PortCache = .{}; /// The MicroZig build system. +/// +/// # Example usage: +/// ```zig +/// const std = @import("std"); +/// const microzig = @import("microzig"); +/// +/// const MicroBuild = microzig.MicroBuild(.{ +/// .rp2xxx = true, +/// }); +/// +/// pub fn build(b: *std.Build) void { +/// const optimize = b.standardOptimizeOption(.{}); +/// +/// const mz_dep = b.dependency("microzig", .{}); +/// const mb = MicroBuild.init(b, mz_dep) orelse return; +/// +/// const fw = mb.add_firmware(.{ +/// .name = "test", +/// .root_source_file = b.path("src/main.zig"), +/// .target = mb.ports.rp2xxx.boards.raspberrypi.pico, +/// .optimize = optimize, +/// }); +/// mb.install_firmware(fw, .{}); +/// } +/// ``` pub fn MicroBuild(port_select: PortSelect) type { return struct { const SelectedPorts = blk: { @@ -141,6 +166,9 @@ pub fn MicroBuild(port_select: PortSelect) type { ports: SelectedPorts, const InitReturnType = blk: { + // TODO: idk if this is idiomatic + @setEvalBranchQuota(2000); + var ok = true; for (port_list) |port| { if (@field(port_select, port.name)) { @@ -154,16 +182,16 @@ pub fn MicroBuild(port_select: PortSelect) type { } }; - /// Initializes the microzig build system. - // TODO: should we call this `create`? - pub fn init(b: *Build, dep: *Build.Dependency) InitReturnType { + /// Initializes the microzig build system. Returns null when there are ports + /// that haven't been fetched yet (it uses lazy dependencies internally). + pub fn init(b: *Build, dep: *Build.Dependency) ?InitReturnType { if (InitReturnType == noreturn) { inline for (port_list) |port| { if (@field(port_select, port.name)) { _ = dep.builder.lazyDependency(port.dep_name, .{}); } } - std.process.exit(0); + return null; } var ports: SelectedPorts = undefined; @@ -234,7 +262,7 @@ pub fn MicroBuild(port_select: PortSelect) type { /// Additional patches the user may apply to the generated register /// code. This does not override the chip's existing patches. - patches: []const regz.Patch = .{}, + patches: []const regz.patch.Patch = &.{}, }; fn serialize_patches(b: *Build, patches: []const regz.patch.Patch) []const u8 { @@ -302,7 +330,7 @@ pub fn MicroBuild(port_select: PortSelect) type { regz_run.addArg("--output_path"); // Write to a file const zig_file = regz_run.addOutputFileArg("chip.zig"); - var patches = std.ArrayList(regz.Patch).init(b.allocator); + var patches = std.ArrayList(regz.patch.Patch).init(b.allocator); // From chip definition patches.appendSlice(target.chip.patches) catch @panic("OOM"); @@ -310,9 +338,9 @@ pub fn MicroBuild(port_select: PortSelect) type { // From user invoking `add_firmware` patches.appendSlice(options.patches) catch @panic("OOM"); - if (patches.len > 0) { + if (patches.items.len > 0) { // write patches to file - const patch_ndjson = serialize_patches(b, patches); + const patch_ndjson = serialize_patches(b, patches.items); const write_file_step = b.addWriteFiles(); const patch_file = write_file_step.add("patch.ndjson", patch_ndjson); diff --git a/examples/build.zig b/examples/build.zig index 7564e875..fa9b5d95 100644 --- a/examples/build.zig +++ b/examples/build.zig @@ -9,7 +9,7 @@ const example_dep_names: []const []const u8 = &.{ "nxp/lpc", "raspberrypi/rp2xxx", "stmicro/stm32", - "wch/ch32", + // "wch/ch32", }; pub fn build(b: *std.Build) void { diff --git a/examples/gigadevice/gd32/build.zig b/examples/gigadevice/gd32/build.zig index f1b359cf..7dd1500b 100644 --- a/examples/gigadevice/gd32/build.zig +++ b/examples/gigadevice/gd32/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const available_examples = [_]Example{ .{ .target = mb.ports.gd32.chips.gd32vf103xb, .name = "gd32vf103xb", .file = "src/empty.zig" }, diff --git a/examples/microchip/atsam/build.zig b/examples/microchip/atsam/build.zig index 836af1f6..fba4e6d3 100644 --- a/examples/microchip/atsam/build.zig +++ b/examples/microchip/atsam/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const available_examples = [_]Example{ .{ .target = mb.ports.atsam.chips.atsamd51j19, .name = "atsamd51j19-blinky", .file = "src/blinky.zig" }, diff --git a/examples/microchip/avr/build.zig b/examples/microchip/avr/build.zig index 10688d61..e52a4706 100644 --- a/examples/microchip/avr/build.zig +++ b/examples/microchip/avr/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const available_examples = [_]Example{ .{ .target = mb.ports.avr.boards.arduino.nano, .name = "arduino-nano_blinky", .file = "src/blinky.zig" }, diff --git a/examples/nordic/nrf5x/build.zig b/examples/nordic/nrf5x/build.zig index afb557c8..3bd15f92 100644 --- a/examples/nordic/nrf5x/build.zig +++ b/examples/nordic/nrf5x/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const available_examples = [_]Example{ .{ .target = mb.ports.nrf5x.boards.nordic.nrf52840_dongle, .name = "nrf52480-dongle_blinky", .file = "src/blinky.zig" }, diff --git a/examples/nxp/lpc/build.zig b/examples/nxp/lpc/build.zig index 963b87e6..250f6724 100644 --- a/examples/nxp/lpc/build.zig +++ b/examples/nxp/lpc/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const available_examples = [_]Example{ .{ .target = mb.ports.lpc.boards.mbed.lpc1768, .name = "mbed-lpc1768_blinky", .file = "src/blinky.zig" }, diff --git a/examples/raspberrypi/rp2xxx/build.zig b/examples/raspberrypi/rp2xxx/build.zig index ccb7d52c..4109b800 100644 --- a/examples/raspberrypi/rp2xxx/build.zig +++ b/examples/raspberrypi/rp2xxx/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const rp2040_only_examples: []const Example = &.{ // RaspberryPi Boards: diff --git a/examples/stmicro/stm32/build.zig b/examples/stmicro/stm32/build.zig index 48a80a93..1493be78 100644 --- a/examples/stmicro/stm32/build.zig +++ b/examples/stmicro/stm32/build.zig @@ -9,7 +9,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const available_examples = [_]Example{ .{ .target = mb.ports.stm32.chips.STM32F103C8, .name = "STM32F103C8", .file = "src/blinky.zig" }, diff --git a/tools/package-test/build.zig b/tools/package-test/build.zig index f7338af1..f99cb04a 100644 --- a/tools/package-test/build.zig +++ b/tools/package-test/build.zig @@ -15,7 +15,7 @@ pub fn build(b: *std.Build) void { const optimize = b.standardOptimizeOption(.{}); const mz_dep = b.dependency("microzig", .{}); - const mb = MicroBuild.init(b, mz_dep); + const mb = MicroBuild.init(b, mz_dep) orelse return; const examples: []const Example = &.{ .{ .target = mb.ports.rp2xxx.boards.raspberrypi.pico, .name = "rp2xxx" }, @@ -23,7 +23,7 @@ pub fn build(b: *std.Build) void { .{ .target = mb.ports.atsam.chips.atsamd51j19, .name = "atsam" }, .{ .target = mb.ports.avr.boards.arduino.nano, .name = "avr" }, .{ .target = mb.ports.nrf5x.boards.nordic.nrf52840_dongle, .name = "nrf5x" }, - .{ .target = mb.ports.lpc.boards.nordic.mbed.lpc1768, .name = "lpc" }, + .{ .target = mb.ports.lpc.boards.mbed.lpc1768, .name = "lpc" }, .{ .target = mb.ports.stm32.boards.stm32f3discovery, .name = "stm32" }, }; @@ -40,6 +40,6 @@ pub fn build(b: *std.Build) void { } const Example = struct { - target: *microzig.Target, + target: *const microzig.Target, name: []const u8, }; diff --git a/tools/package-test/build.zig.zon b/tools/package-test/build.zig.zon index b1911a0f..6d0e2802 100644 --- a/tools/package-test/build.zig.zon +++ b/tools/package-test/build.zig.zon @@ -4,5 +4,6 @@ .paths = .{ "build.zig", "build.zig.zon", + "src", }, }