Skip to content

Commit 68c248b

Browse files
committed
use build.zig to release
1 parent c3af65f commit 68c248b

File tree

4 files changed

+182
-133
lines changed

4 files changed

+182
-133
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ jobs:
3333
GITHUB_TOKEN: ${{ github.token }}
3434
MINISIGN_KEY: ${{ secrets.MINISIGN_KEY }}
3535
MINISIGN_PASSWORD: ${{ secrets.MINISIGN_PASSWORD }}
36-
run: nix run .#release
36+
run: nix develop -c zig build gh-release -Ddate=$(date +%Y-%m-%d) -Drun-number=${{ github.run_number }} -Drun-attempt=${{ github.run_attempt }}

build.zig

Lines changed: 180 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
const std = @import("std");
22
const builtin = @import("builtin");
33

4-
pub fn build(b: *std.Build) void {
4+
pub fn build(b: *std.Build) !void {
5+
const minisign_key_ = std.posix.getenv("MINISIGN_KEY");
6+
const minisign_password_ = std.posix.getenv("MINISIGN_PASSWORD");
7+
const date = b.option([]const u8, "date", "date") orelse "1970-01-01";
8+
const run_number = b.option([]const u8, "run-number", "run-rumber") orelse "0";
9+
const run_attempt = b.option([]const u8, "run-attempt", "run-attempt") orelse "0";
10+
const version = b.fmt("{s}-{s}-{s}", .{ date, run_number, run_attempt });
11+
512
const gobject_codegen_dep = b.dependency(
613
"gobject_codegen",
714
.{},
@@ -11,7 +18,7 @@ pub fn build(b: *std.Build) void {
1118

1219
const translate_gir_run = b.addRunArtifact(translate_gir_exe);
1320

14-
const output = translate_gir_run.addPrefixedOutputDirectoryArg("--output-dir=", "bindings");
21+
const bindings = translate_gir_run.addPrefixedOutputDirectoryArg("--output-dir=", "bindings");
1522

1623
translate_gir_run.addPrefixedDirectoryArg("--gir-fixes-dir=", b.path("gir-fixes"));
1724
{
@@ -33,13 +40,32 @@ pub fn build(b: *std.Build) void {
3340
translate_gir_run.addPrefixedDirectoryArg("--bindings-dir=", gobject_codegen_dep.path("binding-overrides"));
3441
translate_gir_run.addPrefixedDirectoryArg("--extensions-dir=", gobject_codegen_dep.path("extensions"));
3542

36-
if (std.posix.getenv("GIR_PATH")) |gir_path| {
37-
var it = std.mem.splitScalar(u8, gir_path, ':');
38-
while (it.next()) |path| {
39-
translate_gir_run.addPrefixedDirectoryArg("--gir-dir=", std.Build.LazyPath{ .cwd_relative = path });
43+
const gir_files = b.addWriteFiles();
44+
45+
if (std.posix.getenv("GIR_PATH")) |gir_paths| {
46+
var gir_path_iterator = std.mem.splitScalar(u8, gir_paths, ':');
47+
while (gir_path_iterator.next()) |gir_path| {
48+
var gir_dir = try std.fs.cwd().openDir(gir_path, .{ .iterate = true });
49+
defer gir_dir.close();
50+
var gir_dir_iterator = gir_dir.iterate();
51+
while (try gir_dir_iterator.next()) |entry| {
52+
const ext = std.fs.path.extension(entry.name);
53+
54+
if (!std.mem.eql(u8, ext, ".gir")) continue;
55+
56+
_ = gir_files.addCopyFile(
57+
std.Build.LazyPath{ .cwd_relative = b.pathJoin(&.{ gir_path, entry.name }) },
58+
entry.name,
59+
);
60+
}
4061
}
4162
}
4263

64+
translate_gir_run.addPrefixedDirectoryArg(
65+
"--gir-dir=",
66+
gir_files.getDirectory(),
67+
);
68+
4369
translate_gir_run.addArg("Adw-1");
4470
translate_gir_run.addArg("GLib-2.0");
4571
translate_gir_run.addArg("GObject-2.0");
@@ -56,9 +82,152 @@ pub fn build(b: *std.Build) void {
5682
translate_gir_run.addArg("Xdp-1.0");
5783
translate_gir_run.addArg("XdpGtk4-1.0");
5884

59-
b.installDirectory(.{
60-
.source_dir = output,
61-
.install_dir = .{ .custom = "" },
62-
.install_subdir = "",
63-
});
85+
var artifacts: std.ArrayList(std.Build.LazyPath) = .empty;
86+
var files_to_sign: std.ArrayList(struct { name: []const u8, lp: std.Build.LazyPath }) = .empty;
87+
88+
{
89+
const gobject_output = b.addWriteFiles();
90+
_ = gobject_output.addCopyDirectory(bindings, b.fmt("ghostty-gobject-{s}", .{version}), .{});
91+
92+
b.installDirectory(.{
93+
.source_dir = gobject_output.getDirectory(),
94+
.install_dir = .{ .custom = "" },
95+
.install_subdir = "",
96+
});
97+
98+
const create_gobject_tar = b.addSystemCommand(&.{
99+
"tar",
100+
"--create",
101+
"--dereference",
102+
"--mtime=1970-01-01-T00:00:00+00:00",
103+
"--mode=u=rwX,og=rX",
104+
"--owner=root:0",
105+
"--group=root:0",
106+
});
107+
create_gobject_tar.addPrefixedDirectoryArg("--directory=", gobject_output.getDirectory());
108+
const gobject_tar = create_gobject_tar.addPrefixedOutputFileArg("--file=", b.fmt("ghostty-gobject-{s}.tar", .{version}));
109+
create_gobject_tar.addArg(b.fmt("ghostty-gobject-{s}", .{version}));
110+
111+
const install_gobject_tarfile = b.addInstallFile(gobject_tar, b.fmt("ghostty-gobject-{s}.tar", .{version}));
112+
b.getInstallStep().dependOn(&install_gobject_tarfile.step);
113+
114+
{
115+
const name = b.fmt("ghostty-gobject-{s}.tar.gz", .{version});
116+
const create_gobject_targz = b.addSystemCommand(&.{ "gzip", "-c" });
117+
create_gobject_targz.addFileArg(gobject_tar);
118+
const stdout = create_gobject_targz.captureStdOut();
119+
const wf = b.addWriteFiles();
120+
const gobject_targz = wf.addCopyFile(stdout, name);
121+
const install_gobject_targz = b.addInstallFile(gobject_targz, name);
122+
b.getInstallStep().dependOn(&install_gobject_targz.step);
123+
try files_to_sign.append(b.allocator, .{ .name = name, .lp = gobject_targz });
124+
try artifacts.append(b.allocator, gobject_targz);
125+
}
126+
127+
{
128+
const name = b.fmt("ghostty-gobject-{s}.tar.zstd", .{version});
129+
const create_gobject_tarzstd = b.addSystemCommand(&.{ "zstd", "-c" });
130+
create_gobject_tarzstd.addFileArg(gobject_tar);
131+
const stdout = create_gobject_tarzstd.captureStdOut();
132+
const wf = b.addWriteFiles();
133+
const gobject_tarzstd = wf.addCopyFile(stdout, name);
134+
const install_gobject_tarzstd = b.addInstallFile(gobject_tarzstd, name);
135+
b.getInstallStep().dependOn(&install_gobject_tarzstd.step);
136+
try files_to_sign.append(b.allocator, .{ .name = name, .lp = gobject_tarzstd });
137+
try artifacts.append(b.allocator, gobject_tarzstd);
138+
}
139+
}
140+
141+
{
142+
const gir_output = b.addWriteFiles();
143+
_ = gir_output.addCopyDirectory(gir_files.getDirectory(), b.fmt("ghostty-gir-{s}", .{version}), .{});
144+
145+
b.installDirectory(.{
146+
.source_dir = gir_output.getDirectory(),
147+
.install_dir = .{ .custom = "" },
148+
.install_subdir = "",
149+
});
150+
151+
const create_gir_tar = b.addSystemCommand(&.{
152+
"tar",
153+
"--create",
154+
"--dereference",
155+
"--mtime=1970-01-01-T00:00:00+00:00",
156+
"--mode=u=rwX,og=rX",
157+
"--owner=root:0",
158+
"--group=root:0",
159+
});
160+
create_gir_tar.addPrefixedDirectoryArg("--directory=", gir_output.getDirectory());
161+
const gir_tar = create_gir_tar.addPrefixedOutputFileArg(
162+
"--file=",
163+
b.fmt("ghostty-gir-{s}.tar", .{version}),
164+
);
165+
create_gir_tar.addArg(b.fmt("ghostty-gir-{s}", .{version}));
166+
167+
{
168+
const name = b.fmt("ghostty-gir-{s}.tar.gz", .{version});
169+
const create_gir_targz = b.addSystemCommand(&.{ "gzip", "-c" });
170+
create_gir_targz.addFileArg(gir_tar);
171+
const stdout = create_gir_targz.captureStdOut();
172+
const wf = b.addWriteFiles();
173+
const gir_targz = wf.addCopyFile(stdout, name);
174+
const install_gir_targz = b.addInstallFile(gir_targz, name);
175+
b.getInstallStep().dependOn(&install_gir_targz.step);
176+
try files_to_sign.append(b.allocator, .{ .name = name, .lp = gir_targz });
177+
try artifacts.append(b.allocator, gir_targz);
178+
}
179+
180+
{
181+
const name = b.fmt("ghostty-gir-{s}.tar.zstd", .{version});
182+
const create_gir_tarzstd = b.addSystemCommand(&.{ "zstd", "-c" });
183+
create_gir_tarzstd.addFileArg(gir_tar);
184+
const stdout = create_gir_tarzstd.captureStdOut();
185+
const wf = b.addWriteFiles();
186+
const gir_tarzstd = wf.addCopyFile(stdout, name);
187+
const install_gir_tarzstd = b.addInstallFile(gir_tarzstd, name);
188+
b.getInstallStep().dependOn(&install_gir_tarzstd.step);
189+
try files_to_sign.append(b.allocator, .{ .name = name, .lp = gir_tarzstd });
190+
try artifacts.append(b.allocator, gir_tarzstd);
191+
}
192+
}
193+
194+
minisign: {
195+
const wf = b.addWriteFiles();
196+
const minisign_key = wf.add("minisign.key", b.fmt("\n{s}\n", .{minisign_key_ orelse break :minisign}));
197+
const minisign_password = wf.add("minisign.password", b.fmt("{s}", .{minisign_password_ orelse break :minisign}));
198+
199+
for (files_to_sign.items) |item| {
200+
const name = b.fmt("{s}.minisig", .{item.name});
201+
const minisign = b.addSystemCommand(&.{ "minisign", "-S" });
202+
minisign.addArg("-m");
203+
minisign.addFileArg(item.lp);
204+
minisign.addArg("-x");
205+
const minisig = minisign.addOutputFileArg(name);
206+
minisign.addArg("-s");
207+
minisign.addFileArg(minisign_key);
208+
minisign.setStdIn(.{ .lazy_path = minisign_password });
209+
const install_minisig = b.addInstallFile(minisig, name);
210+
b.getInstallStep().dependOn(&install_minisig.step);
211+
try artifacts.append(b.allocator, minisig);
212+
}
213+
}
214+
215+
const gh = b.addSystemCommand(
216+
&.{
217+
"gh",
218+
"release",
219+
"create",
220+
version,
221+
"--latest",
222+
"--title",
223+
version,
224+
"--notes",
225+
version,
226+
},
227+
);
228+
for (artifacts.items) |lp| {
229+
gh.addFileArg(lp);
230+
}
231+
const release_step = b.step("gh-release", "create a GitHub release");
232+
release_step.dependOn(&gh.step);
64233
}

flake.nix

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
pkgs.gnutar
5353
pkgs.libxml2
5454
pkgs.libxslt
55+
pkgs.minisign
5556
pkgs.nodePackages.prettier
5657
pkgs.pinact
5758
pkgs.pkg-config
@@ -62,66 +63,6 @@
6263
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath gir_path;
6364
GIR_PATH = pkgs.lib.strings.makeSearchPathOutput "dev" "share/gir-1.0" gir_path;
6465
};
65-
packages.default = let
66-
zig_hook = pkgs.zig_0_15.hook.overrideAttrs {
67-
zig_default_flags = "--color off";
68-
};
69-
in
70-
pkgs.stdenv.mkDerivation (finalAttrs: {
71-
pname = "ghostty-gobject";
72-
version = "0.5.0";
73-
src = pkgs.lib.fileset.toSource {
74-
root = ./.;
75-
fileset = pkgs.lib.fileset.intersection (pkgs.lib.fileset.fromSource (pkgs.lib.sources.cleanSource ./.)) (
76-
pkgs.lib.fileset.unions [
77-
./build.zig
78-
./build.zig.zon
79-
./build.zig.zon.nix
80-
./gir-fixes
81-
]
82-
);
83-
};
84-
deps = pkgs.callPackage ./build.zig.zon.nix {
85-
name = "${finalAttrs.pname}-cache-${finalAttrs.version}";
86-
};
87-
GIR_PATH = pkgs.lib.strings.makeSearchPathOutput "dev" "share/gir-1.0" gir_path;
88-
nativeBuildInputs = [
89-
zig_hook
90-
pkgs.libxslt
91-
];
92-
zigBuildFlags = [
93-
"--system"
94-
"${finalAttrs.deps}"
95-
];
96-
});
97-
apps.release = let
98-
release = pkgs.writeTextFile {
99-
name = "release";
100-
destination = "/bin/release";
101-
text = pkgs.lib.concatStringsSep "\n" [
102-
''
103-
#!${pkgs.lib.getExe pkgs.nushell}
104-
105-
alias zig = ^${pkgs.lib.getExe pkgs.zig_0_15}
106-
alias nix = ^${pkgs.lib.getExe pkgs.nix}
107-
alias tar = ^${pkgs.lib.getExe pkgs.gnutar}
108-
alias gh = ^${pkgs.lib.getExe pkgs.gh}
109-
alias ln = ^${pkgs.uutils-coreutils}/bin/uutils-ln
110-
alias readlink = ^${pkgs.uutils-coreutils}/bin/uutils-readlink
111-
alias gzip = ^${pkgs.lib.getExe pkgs.gzip}
112-
alias zstd = ^${pkgs.lib.getExe pkgs.zstd}
113-
alias minisign = ^${pkgs.lib.getExe pkgs.minisign}
114-
115-
let gir_path = [ ${builtins.replaceStrings [":"] [" "] (pkgs.lib.strings.makeSearchPathOutput "dev" "share/gir-1.0" gir_path)} ]
116-
''
117-
(builtins.readFile ./release.nu)
118-
];
119-
executable = true;
120-
};
121-
in {
122-
type = "app";
123-
program = "${pkgs.lib.getExe release}";
124-
};
12566
}
12667
);
12768
}

release.nu

Lines changed: 0 additions & 61 deletions
This file was deleted.

0 commit comments

Comments
 (0)