From de297890e399b83fe99182cc2f223117099f35b2 Mon Sep 17 00:00:00 2001 From: kcbanner Date: Fri, 5 Jun 2026 01:55:36 -0400 Subject: [PATCH] test/link: add emit-static-lib --- test/link.zig | 40 ++++++++++++++++++++- test/link/snapshots/emit-static-lib.lib.dmp | 9 +++++ test/src/Link.zig | 15 ++++++-- 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 test/link/snapshots/emit-static-lib.lib.dmp diff --git a/test/link.zig b/test/link.zig index 65ec8f4e7e2ea7f5f7b7bed6de646ed1a5b9a329..3faecc710feecb15376718833d151a4708b58d3b 100644 --- a/test/link.zig +++ b/test/link.zig @@ -1,4 +1,4 @@ -pub fn addCases(ctx: *@import("tests.zig").LinkContext) void { +pub fn addCases(ctx: *LinkContext) void { if (ctx.includeTest("exports-static")) |prefix| { const lib = ctx.addLibrary(.static, .{ .name = "lib", @@ -23,8 +23,46 @@ pub fn addCases(ctx: *@import("tests.zig").LinkContext) void { }, .{}); } + if (ctx.includeTest("emit-static-lib")) |prefix| { + const obj1 = ctx.addObject(.{ + .name = "obj1", + .use_llvm = true, + .use_lld = true, + .c_source_bytes = + \\int foo1 = 1; + \\int foo2 = 2; + \\int fooBar() { + \\ return foo1 + foo2; + \\} + , + }); + const obj2 = ctx.addObject(.{ + .name = "this_is_a_long_name", + .zig_source_bytes = + \\fn weakFoo() callconv(.c) usize { + \\ return 42; + \\} + \\export var strong_foo: usize = 100; + \\comptime { + \\ @export(&weakFoo, .{ .name = "weakFoo", .linkage = .weak }); + \\ @export(&strong_foo, .{ .name = "strong_foo_alias", .linkage = .strong }); + \\} + , + }); + const lib = ctx.addLibrary(.static, .{ .name = "lib" }); + lib.root_module.addObject(obj1); + lib.root_module.addObject(obj2); + ctx.verifyObjdump(prefix, lib, &.{ + "-s", + "--elements=file-type", + "--symbols", + "--only-symbol=foo", + "--only-symbol=Foo", + }, .{}); + } } +const LinkContext = @import("tests.zig").LinkContext; const std = @import("std"); diff --git a/test/link/snapshots/emit-static-lib.lib.dmp b/test/link/snapshots/emit-static-lib.lib.dmp new file mode 100644 index 0000000000000000000000000000000000000000..7f187063d02f8bb44c5574b0bf94ade24576c525 --- /dev/null +++ b/test/link/snapshots/emit-static-lib.lib.dmp @@ -0,0 +1,9 @@ +lib.lib: COFF archive +lib.lib(obj1.obj): COFF object +xxxx 00000000 1 NULL() EXTERNAL | fooBar +xxxx 00000000 2 NULL EXTERNAL | foo1 +xxxx 00000004 2 NULL EXTERNAL | foo2 +lib.lib(this_is_a_long_name.obj): COFF object +xxxx 00000000 4 NULL() EXTERNAL | weakFoo +xxxx 00000000 2 NULL EXTERNAL | strong_foo_alias +xxxx 00000000 2 NULL EXTERNAL | strong_foo diff --git a/test/src/Link.zig b/test/src/Link.zig index adcc329b6a98e54667002b3236dde144e39ba752..08ad3f228fbe2dd57fe9fe4fbaf0a7b80794184f 100644 --- a/test/src/Link.zig +++ b/test/src/Link.zig @@ -30,8 +30,17 @@ pub fn addLibrary( .linkage = linkage, .name = overlay.name, .root_module = self.createModule(overlay), - .use_llvm = self.use_llvm, - .use_lld = self.use_lld, + .use_llvm = overlay.use_llvm orelse self.use_llvm, + .use_lld = overlay.use_lld orelse self.use_lld, + }); +} + +pub fn addObject(self: *const Link, overlay: OverlayOptions) *Step.Compile { + return self.b.addObject(.{ + .name = overlay.name, + .root_module = self.createModule(overlay), + .use_llvm = overlay.use_llvm orelse self.use_llvm, + .use_lld = overlay.use_lld orelse self.use_lld, }); } @@ -169,6 +178,8 @@ const OverlayOptions = struct { zig_source_file: ?std.Build.LazyPath = null, pic: ?bool = null, strip: ?bool = null, + use_llvm: ?bool = null, + use_lld: ?bool = null, }; const std = @import("std"); -- 2.54.0