authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-09-22 23:33:55+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-09-24 06:57:11+01:00
logfb6fff2561b5a56917e5efee4c374130189ab8b0
tree6865ebfe9c792e1e12ace61307cd81e68af80fac
parent8eff0a0a669dbdacf9cebbc96fdf20536f3073ee

resinator: do not include in only_core_functionality builds

This prevents resinator from being included in zig1 and zig2.

4 files changed, 76 insertions(+), 45 deletions(-)

src/Compilation.zig+52-36
...@@ -47,7 +47,8 @@ gpa: Allocator,...@@ -47,7 +47,8 @@ gpa: Allocator,
47arena_state: std.heap.ArenaAllocator.State,47arena_state: std.heap.ArenaAllocator.State,
48bin_file: *link.File,48bin_file: *link.File,
49c_object_table: std.AutoArrayHashMapUnmanaged(*CObject, void) = .{},49c_object_table: std.AutoArrayHashMapUnmanaged(*CObject, void) = .{},
50win32_resource_table: std.AutoArrayHashMapUnmanaged(*Win32Resource, void) = .{},50win32_resource_table: if (build_options.only_core_functionality) void else std.AutoArrayHashMapUnmanaged(*Win32Resource, void) =
51 if (build_options.only_core_functionality) {} else .{},
51/// This is a pointer to a local variable inside `update()`.52/// This is a pointer to a local variable inside `update()`.
52whole_cache_manifest: ?*Cache.Manifest = null,53whole_cache_manifest: ?*Cache.Manifest = null,
53whole_cache_manifest_mutex: std.Thread.Mutex = .{},54whole_cache_manifest_mutex: std.Thread.Mutex = .{},
...@@ -64,7 +65,7 @@ c_object_work_queue: std.fifo.LinearFifo(*CObject, .Dynamic),...@@ -64,7 +65,7 @@ c_object_work_queue: std.fifo.LinearFifo(*CObject, .Dynamic),
6465
65/// These jobs are to invoke the RC compiler to create a compiled resource file (.res), which66/// These jobs are to invoke the RC compiler to create a compiled resource file (.res), which
66/// gets linked with the Compilation.67/// gets linked with the Compilation.
67win32_resource_work_queue: std.fifo.LinearFifo(*Win32Resource, .Dynamic),68win32_resource_work_queue: if (build_options.only_core_functionality) void else std.fifo.LinearFifo(*Win32Resource, .Dynamic),
6869
69/// These jobs are to tokenize, parse, and astgen files, which may be outdated70/// These jobs are to tokenize, parse, and astgen files, which may be outdated
70/// since the last compilation, as well as scan for `@import` and queue up71/// since the last compilation, as well as scan for `@import` and queue up
...@@ -81,7 +82,8 @@ failed_c_objects: std.AutoArrayHashMapUnmanaged(*CObject, *CObject.ErrorMsg) = ....@@ -81,7 +82,8 @@ failed_c_objects: std.AutoArrayHashMapUnmanaged(*CObject, *CObject.ErrorMsg) = .
8182
82/// The ErrorBundle memory is owned by the `Win32Resource`, using Compilation's general purpose allocator.83/// The ErrorBundle memory is owned by the `Win32Resource`, using Compilation's general purpose allocator.
83/// This data is accessed by multiple threads and is protected by `mutex`.84/// This data is accessed by multiple threads and is protected by `mutex`.
84failed_win32_resources: std.AutoArrayHashMapUnmanaged(*Win32Resource, ErrorBundle) = .{},85failed_win32_resources: if (build_options.only_core_functionality) void else std.AutoArrayHashMapUnmanaged(*Win32Resource, ErrorBundle) =
86 if (build_options.only_core_functionality) {} else .{},
8587
86/// Miscellaneous things that can fail.88/// Miscellaneous things that can fail.
87misc_failures: std.AutoArrayHashMapUnmanaged(MiscTask, MiscError) = .{},89misc_failures: std.AutoArrayHashMapUnmanaged(MiscTask, MiscError) = .{},
...@@ -1671,7 +1673,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1671,7 +1673,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
1671 .work_queue = std.fifo.LinearFifo(Job, .Dynamic).init(gpa),1673 .work_queue = std.fifo.LinearFifo(Job, .Dynamic).init(gpa),
1672 .anon_work_queue = std.fifo.LinearFifo(Job, .Dynamic).init(gpa),1674 .anon_work_queue = std.fifo.LinearFifo(Job, .Dynamic).init(gpa),
1673 .c_object_work_queue = std.fifo.LinearFifo(*CObject, .Dynamic).init(gpa),1675 .c_object_work_queue = std.fifo.LinearFifo(*CObject, .Dynamic).init(gpa),
1674 .win32_resource_work_queue = std.fifo.LinearFifo(*Win32Resource, .Dynamic).init(gpa),1676 .win32_resource_work_queue = if (build_options.only_core_functionality) {} else std.fifo.LinearFifo(*Win32Resource, .Dynamic).init(gpa),
1675 .astgen_work_queue = std.fifo.LinearFifo(*Module.File, .Dynamic).init(gpa),1677 .astgen_work_queue = std.fifo.LinearFifo(*Module.File, .Dynamic).init(gpa),
1676 .embed_file_work_queue = std.fifo.LinearFifo(*Module.EmbedFile, .Dynamic).init(gpa),1678 .embed_file_work_queue = std.fifo.LinearFifo(*Module.EmbedFile, .Dynamic).init(gpa),
1677 .keep_source_files_loaded = options.keep_source_files_loaded,1679 .keep_source_files_loaded = options.keep_source_files_loaded,
...@@ -1731,16 +1733,18 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1731,16 +1733,18 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
1731 }1733 }
17321734
1733 // Add a `Win32Resource` for each `rc_source_files`.1735 // Add a `Win32Resource` for each `rc_source_files`.
1734 try comp.win32_resource_table.ensureTotalCapacity(gpa, options.rc_source_files.len);1736 if (!build_options.only_core_functionality) {
1735 for (options.rc_source_files) |rc_source_file| {1737 try comp.win32_resource_table.ensureTotalCapacity(gpa, options.rc_source_files.len);
1736 const win32_resource = try gpa.create(Win32Resource);1738 for (options.rc_source_files) |rc_source_file| {
1737 errdefer gpa.destroy(win32_resource);1739 const win32_resource = try gpa.create(Win32Resource);
17381740 errdefer gpa.destroy(win32_resource);
1739 win32_resource.* = .{1741
1740 .status = .{ .new = {} },1742 win32_resource.* = .{
1741 .src = rc_source_file,1743 .status = .{ .new = {} },
1742 };1744 .src = rc_source_file,
1743 comp.win32_resource_table.putAssumeCapacityNoClobber(win32_resource, {});1745 };
1746 comp.win32_resource_table.putAssumeCapacityNoClobber(win32_resource, {});
1747 }
1744 }1748 }
17451749
1746 const have_bin_emit = comp.bin_file.options.emit != null or comp.whole_bin_sub_path != null;1750 const have_bin_emit = comp.bin_file.options.emit != null or comp.whole_bin_sub_path != null;
...@@ -1900,7 +1904,9 @@ pub fn destroy(self: *Compilation) void {...@@ -1900,7 +1904,9 @@ pub fn destroy(self: *Compilation) void {
1900 self.work_queue.deinit();1904 self.work_queue.deinit();
1901 self.anon_work_queue.deinit();1905 self.anon_work_queue.deinit();
1902 self.c_object_work_queue.deinit();1906 self.c_object_work_queue.deinit();
1903 self.win32_resource_work_queue.deinit();1907 if (!build_options.only_core_functionality) {
1908 self.win32_resource_work_queue.deinit();
1909 }
1904 self.astgen_work_queue.deinit();1910 self.astgen_work_queue.deinit();
1905 self.embed_file_work_queue.deinit();1911 self.embed_file_work_queue.deinit();
19061912
...@@ -1949,15 +1955,17 @@ pub fn destroy(self: *Compilation) void {...@@ -1949,15 +1955,17 @@ pub fn destroy(self: *Compilation) void {
1949 }1955 }
1950 self.failed_c_objects.deinit(gpa);1956 self.failed_c_objects.deinit(gpa);
19511957
1952 for (self.win32_resource_table.keys()) |key| {1958 if (!build_options.only_core_functionality) {
1953 key.destroy(gpa);1959 for (self.win32_resource_table.keys()) |key| {
1954 }1960 key.destroy(gpa);
1955 self.win32_resource_table.deinit(gpa);1961 }
1962 self.win32_resource_table.deinit(gpa);
19561963
1957 for (self.failed_win32_resources.values()) |*value| {1964 for (self.failed_win32_resources.values()) |*value| {
1958 value.deinit(gpa);1965 value.deinit(gpa);
1966 }
1967 self.failed_win32_resources.deinit(gpa);
1959 }1968 }
1960 self.failed_win32_resources.deinit(gpa);
19611969
1962 for (self.lld_errors.items) |*lld_error| {1970 for (self.lld_errors.items) |*lld_error| {
1963 lld_error.deinit(gpa);1971 lld_error.deinit(gpa);
...@@ -2123,9 +2131,11 @@ pub fn update(comp: *Compilation, main_progress_node: *std.Progress.Node) !void...@@ -2123,9 +2131,11 @@ pub fn update(comp: *Compilation, main_progress_node: *std.Progress.Node) !void
21232131
2124 // For compiling Win32 resources, we rely on the cache hash system to avoid duplicating work.2132 // For compiling Win32 resources, we rely on the cache hash system to avoid duplicating work.
2125 // Add a Job for each Win32 resource file.2133 // Add a Job for each Win32 resource file.
2126 try comp.win32_resource_work_queue.ensureUnusedCapacity(comp.win32_resource_table.count());2134 if (!build_options.only_core_functionality) {
2127 for (comp.win32_resource_table.keys()) |key| {2135 try comp.win32_resource_work_queue.ensureUnusedCapacity(comp.win32_resource_table.count());
2128 comp.win32_resource_work_queue.writeItemAssumeCapacity(key);2136 for (comp.win32_resource_table.keys()) |key| {
2137 comp.win32_resource_work_queue.writeItemAssumeCapacity(key);
2138 }
2129 }2139 }
21302140
2131 if (comp.bin_file.options.module) |module| {2141 if (comp.bin_file.options.module) |module| {
...@@ -2450,9 +2460,11 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes...@@ -2450,9 +2460,11 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes
2450 man.hash.addListOfBytes(key.src.extra_flags);2460 man.hash.addListOfBytes(key.src.extra_flags);
2451 }2461 }
24522462
2453 for (comp.win32_resource_table.keys()) |key| {2463 if (!build_options.only_core_functionality) {
2454 _ = try man.addFile(key.src.src_path, null);2464 for (comp.win32_resource_table.keys()) |key| {
2455 man.hash.addListOfBytes(key.src.extra_flags);2465 _ = try man.addFile(key.src.src_path, null);
2466 man.hash.addListOfBytes(key.src.extra_flags);
2467 }
2456 }2468 }
24572469
2458 man.hash.addListOfBytes(comp.rc_include_dir_list);2470 man.hash.addListOfBytes(comp.rc_include_dir_list);
...@@ -2697,8 +2709,10 @@ pub fn totalErrorCount(self: *Compilation) u32 {...@@ -2697,8 +2709,10 @@ pub fn totalErrorCount(self: *Compilation) u32 {
2697 @intFromBool(self.alloc_failure_occurred) +2709 @intFromBool(self.alloc_failure_occurred) +
2698 self.lld_errors.items.len;2710 self.lld_errors.items.len;
26992711
2700 for (self.failed_win32_resources.values()) |errs| {2712 if (!build_options.only_core_functionality) {
2701 total += errs.errorMessageCount();2713 for (self.failed_win32_resources.values()) |errs| {
2714 total += errs.errorMessageCount();
2715 }
2702 }2716 }
27032717
2704 if (self.bin_file.options.module) |module| {2718 if (self.bin_file.options.module) |module| {
...@@ -2791,7 +2805,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !ErrorBundle {...@@ -2791,7 +2805,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !ErrorBundle {
2791 }2805 }
2792 }2806 }
27932807
2794 {2808 if (!build_options.only_core_functionality) {
2795 var it = self.failed_win32_resources.iterator();2809 var it = self.failed_win32_resources.iterator();
2796 while (it.next()) |entry| {2810 while (it.next()) |entry| {
2797 try bundle.addBundleAsRoots(entry.value_ptr.*);2811 try bundle.addBundleAsRoots(entry.value_ptr.*);
...@@ -3268,11 +3282,13 @@ pub fn performAllTheWork(...@@ -3268,11 +3282,13 @@ pub fn performAllTheWork(
3268 });3282 });
3269 }3283 }
32703284
3271 while (comp.win32_resource_work_queue.readItem()) |win32_resource| {3285 if (!build_options.only_core_functionality) {
3272 comp.work_queue_wait_group.start();3286 while (comp.win32_resource_work_queue.readItem()) |win32_resource| {
3273 try comp.thread_pool.spawn(workerUpdateWin32Resource, .{3287 comp.work_queue_wait_group.start();
3274 comp, win32_resource, &win32_resource_prog_node, &comp.work_queue_wait_group,3288 try comp.thread_pool.spawn(workerUpdateWin32Resource, .{
3275 });3289 comp, win32_resource, &win32_resource_prog_node, &comp.work_queue_wait_group,
3290 });
3291 }
3276 }3292 }
3277 }3293 }
32783294
src/link.zig+10-5
...@@ -1027,8 +1027,10 @@ pub const File = struct {...@@ -1027,8 +1027,10 @@ pub const File = struct {
1027 for (comp.c_object_table.keys()) |key| {1027 for (comp.c_object_table.keys()) |key| {
1028 _ = try man.addFile(key.status.success.object_path, null);1028 _ = try man.addFile(key.status.success.object_path, null);
1029 }1029 }
1030 for (comp.win32_resource_table.keys()) |key| {1030 if (!build_options.only_core_functionality) {
1031 _ = try man.addFile(key.status.success.res_path, null);1031 for (comp.win32_resource_table.keys()) |key| {
1032 _ = try man.addFile(key.status.success.res_path, null);
1033 }
1032 }1034 }
1033 try man.addOptionalFile(module_obj_path);1035 try man.addOptionalFile(module_obj_path);
1034 try man.addOptionalFile(compiler_rt_path);1036 try man.addOptionalFile(compiler_rt_path);
...@@ -1059,7 +1061,8 @@ pub const File = struct {...@@ -1059,7 +1061,8 @@ pub const File = struct {
1059 };1061 };
1060 }1062 }
10611063
1062 const num_object_files = base.options.objects.len + comp.c_object_table.count() + comp.win32_resource_table.count() + 2;1064 const win32_resource_table_len = if (build_options.only_core_functionality) 0 else comp.win32_resource_table.count();
1065 const num_object_files = base.options.objects.len + comp.c_object_table.count() + win32_resource_table_len + 2;
1063 var object_files = try std.ArrayList([*:0]const u8).initCapacity(base.allocator, num_object_files);1066 var object_files = try std.ArrayList([*:0]const u8).initCapacity(base.allocator, num_object_files);
1064 defer object_files.deinit();1067 defer object_files.deinit();
10651068
...@@ -1069,8 +1072,10 @@ pub const File = struct {...@@ -1069,8 +1072,10 @@ pub const File = struct {
1069 for (comp.c_object_table.keys()) |key| {1072 for (comp.c_object_table.keys()) |key| {
1070 object_files.appendAssumeCapacity(try arena.dupeZ(u8, key.status.success.object_path));1073 object_files.appendAssumeCapacity(try arena.dupeZ(u8, key.status.success.object_path));
1071 }1074 }
1072 for (comp.win32_resource_table.keys()) |key| {1075 if (!build_options.only_core_functionality) {
1073 object_files.appendAssumeCapacity(try arena.dupeZ(u8, key.status.success.res_path));1076 for (comp.win32_resource_table.keys()) |key| {
1077 object_files.appendAssumeCapacity(try arena.dupeZ(u8, key.status.success.res_path));
1078 }
1074 }1079 }
1075 if (module_obj_path) |p| {1080 if (module_obj_path) |p| {
1076 object_files.appendAssumeCapacity(try arena.dupeZ(u8, p));1081 object_files.appendAssumeCapacity(try arena.dupeZ(u8, p));
src/link/Coff/lld.zig+8-4
...@@ -72,8 +72,10 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod...@@ -72,8 +72,10 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
72 for (comp.c_object_table.keys()) |key| {72 for (comp.c_object_table.keys()) |key| {
73 _ = try man.addFile(key.status.success.object_path, null);73 _ = try man.addFile(key.status.success.object_path, null);
74 }74 }
75 for (comp.win32_resource_table.keys()) |key| {75 if (!build_options.only_core_functionality) {
76 _ = try man.addFile(key.status.success.res_path, null);76 for (comp.win32_resource_table.keys()) |key| {
77 _ = try man.addFile(key.status.success.res_path, null);
78 }
77 }79 }
78 try man.addOptionalFile(module_obj_path);80 try man.addOptionalFile(module_obj_path);
79 man.hash.addOptionalBytes(self.base.options.entry);81 man.hash.addOptionalBytes(self.base.options.entry);
...@@ -271,8 +273,10 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod...@@ -271,8 +273,10 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
271 try argv.append(key.status.success.object_path);273 try argv.append(key.status.success.object_path);
272 }274 }
273275
274 for (comp.win32_resource_table.keys()) |key| {276 if (!build_options.only_core_functionality) {
275 try argv.append(key.status.success.res_path);277 for (comp.win32_resource_table.keys()) |key| {
278 try argv.append(key.status.success.res_path);
279 }
276 }280 }
277281
278 if (module_obj_path) |p| {282 if (module_obj_path) |p| {
src/resinator.zig+6
...@@ -1,3 +1,9 @@...@@ -1,3 +1,9 @@
1comptime {
2 if (@import("build_options").only_core_functionality) {
3 @compileError("resinator included in only_core_functionality build");
4 }
5}
6
1pub const ani = @import("resinator/ani.zig");7pub const ani = @import("resinator/ani.zig");
2pub const ast = @import("resinator/ast.zig");8pub const ast = @import("resinator/ast.zig");
3pub const bmp = @import("resinator/bmp.zig");9pub const bmp = @import("resinator/bmp.zig");