From dd15cb94fd522bd7c6dd48ff096e4b059a69dbd3 Mon Sep 17 00:00:00 2001
From: Manlio Perillo <manlio.perillo@gmail.com>
Date: Sun, 2 Apr 2023 14:59:22 +0200
Subject: [PATCH] build: make the logo a build step

Currently, the logo is always printed when the build script is executed,
resulting in the logo being printed twice with `zig build -h` and
`zig build -l`.

Make the logo a build step, so that the logo is printed to stderr only
when necessary.

Closes #211
---
 build.zig | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/build.zig b/build.zig
index 5ade0c4..035f0bb 100644
--- a/build.zig
+++ b/build.zig
@@ -572,7 +572,9 @@ pub fn build(b: *Builder) !void {
         \\
     ;
     const header_step = b.step("info", logo);
-    print("{s}\n", .{logo});
+
+    const logo_step = PrintStep.create(b, logo, std.io.getStdErr());
+    logo_step.step.dependOn(header_step);
 
     const verify_all = b.step("ziglings", "Check all ziglings");
     verify_all.dependOn(header_step);
@@ -804,3 +806,33 @@ const ZiglingStep = struct {
         });
     }
 };
+
+// Print a message to a file.
+const PrintStep = struct {
+    step: Step,
+    message: []const u8,
+    file: std.fs.File,
+
+    pub fn create(owner: *std.Build, message: []const u8, file: std.fs.File) *PrintStep {
+        const self = owner.allocator.create(PrintStep) catch @panic("OOM");
+        self.* = .{
+            .step = Step.init(.{
+                .id = .custom,
+                .name = "Print",
+                .owner = owner,
+                .makeFn = make,
+            }),
+            .message = message,
+            .file = file,
+        };
+
+        return self;
+    }
+
+    fn make(step: *Step, prog_node: *std.Progress.Node) !void {
+        _ = prog_node;
+        const p = @fieldParentPtr(PrintStep, "step", step);
+
+        try p.file.writeAll(p.message);
+    }
+};