11const std = @import ("std" );
22const 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}
0 commit comments