From 34f88722cd6c206cbbc312377563340f3c3ab2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 5 Dec 2025 07:25:51 +0100 Subject: [PATCH] compiler: support --dependency-file linker option closes https://github.com/ziglang/zig/issues/22213 --- src/Compilation.zig | 50 +++++++++++++++++++++++++++++++++++++++++++++ src/main.zig | 4 ++++ 2 files changed, 54 insertions(+) diff --git a/src/Compilation.zig b/src/Compilation.zig index 687525cbf3..01ab281c14 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -173,6 +173,7 @@ verbose_llvm_bc: ?[]const u8, verbose_cimport: bool, verbose_llvm_cpu_features: bool, verbose_link: bool, +link_depfile: ?[]const u8, disable_c_depfile: bool, stack_report: bool, debug_compiler_runtime_libs: bool, @@ -1403,6 +1404,7 @@ pub const MiscTask = enum { compiler_rt, libzigc, analyze_mod, + link_depfile, docs_copy, docs_wasm, @@ -1732,6 +1734,7 @@ pub const CreateOptions = struct { verbose_generic_instances: bool = false, verbose_llvm_ir: ?[]const u8 = null, verbose_llvm_bc: ?[]const u8 = null, + link_depfile: ?[]const u8 = null, verbose_cimport: bool = false, verbose_llvm_cpu_features: bool = false, debug_compiler_runtime_libs: bool = false, @@ -2247,6 +2250,7 @@ pub fn create(gpa: Allocator, arena: Allocator, io: Io, diag: *CreateDiagnostic, .verbose_generic_instances = options.verbose_generic_instances, .verbose_llvm_ir = options.verbose_llvm_ir, .verbose_llvm_bc = options.verbose_llvm_bc, + .link_depfile = options.link_depfile, .verbose_cimport = options.verbose_cimport, .verbose_llvm_cpu_features = options.verbose_llvm_cpu_features, .verbose_link = options.verbose_link, @@ -3099,6 +3103,15 @@ pub fn update(comp: *Compilation, main_progress_node: std.Progress.Node) UpdateE } } + if (comp.link_depfile) |depfile_path| if (comp.bin_file) |lf| { + assert(comp.file_system_inputs != null); + comp.createDepFile(depfile_path, lf.emit) catch |err| comp.setMiscFailure( + .link_depfile, + "unable to write linker dependency file: {t}", + .{err}, + ); + }; + if (anyErrors(comp)) { // Skip flushing and keep source files loaded for error reporting. return; @@ -5208,6 +5221,43 @@ pub fn separateCodegenThreadOk(comp: *const Compilation) bool { return zcu.backendSupportsFeature(.separate_thread); } +fn createDepFile( + comp: *Compilation, + depfile: []const u8, + binfile: Cache.Path, +) anyerror!void { + var buf: [4096]u8 = undefined; + var af = try std.fs.cwd().atomicFile(depfile, .{ .write_buffer = &buf }); + defer af.deinit(); + + comp.writeDepFile(binfile, &af.file_writer.interface) catch return af.file_writer.err.?; + + try af.finish(); +} + +fn writeDepFile( + comp: *Compilation, + binfile: Cache.Path, + w: *std.Io.Writer, +) std.Io.Writer.Error!void { + const prefixes = comp.cache_parent.prefixes(); + const fsi = comp.file_system_inputs.?.items; + + try w.print("{f}:", .{binfile}); + + { + var it = std.mem.splitScalar(u8, fsi, 0); + while (it.next()) |input| try w.print(" \\\n {f}{s}", .{ prefixes[input[0] - 1], input[1..] }); + } + + { + var it = std.mem.splitScalar(u8, fsi, 0); + while (it.next()) |input| try w.print("\n\n{f}{s}:", .{ prefixes[input[0] - 1], input[1..] }); + } + + try w.writeByte('\n'); +} + fn workerDocsCopy(comp: *Compilation) void { docsCopyFallible(comp) catch |err| return comp.lockAndSetMiscFailure( .docs_copy, diff --git a/src/main.zig b/src/main.zig index c08e9da449..8112e760df 100644 --- a/src/main.zig +++ b/src/main.zig @@ -821,6 +821,7 @@ fn buildOutputType( var verbose_generic_instances = false; var verbose_llvm_ir: ?[]const u8 = null; var verbose_llvm_bc: ?[]const u8 = null; + var link_depfile: ?[]const u8 = null; var verbose_cimport = false; var verbose_llvm_cpu_features = false; var time_report = false; @@ -2704,6 +2705,8 @@ fn buildOutputType( { emit_implib = .{ .yes = linker_args_it.nextOrFatal() }; emit_implib_arg_provided = true; + } else if (mem.eql(u8, arg, "--dependency-file")) { + link_depfile = linker_args_it.nextOrFatal(); } else if (mem.eql(u8, arg, "-Brepro") or mem.eql(u8, arg, "/Brepro")) { linker_repro = true; } else if (mem.eql(u8, arg, "-undefined")) { @@ -3479,6 +3482,7 @@ fn buildOutputType( .verbose_generic_instances = verbose_generic_instances, .verbose_llvm_ir = verbose_llvm_ir, .verbose_llvm_bc = verbose_llvm_bc, + .link_depfile = link_depfile, .verbose_cimport = verbose_cimport, .verbose_llvm_cpu_features = verbose_llvm_cpu_features, .time_report = time_report,