From 6a8228603c924f8e091c52b98f8043e02843c358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 14 Apr 2025 21:01:25 +0200 Subject: [PATCH] zig cc: Respect Clang's -static and -dynamic flags. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: ❯ zig cc main.c -target x86_64-linux-musl && musl-ldd ./a.out musl-ldd: ./a.out: Not a valid dynamic program ❯ zig cc main.c -target x86_64-linux-musl -static && musl-ldd ./a.out musl-ldd: ./a.out: Not a valid dynamic program ❯ zig cc main.c -target x86_64-linux-musl -dynamic && musl-ldd ./a.out musl-ldd: ./a.out: Not a valid dynamic program After: ❯ zig cc main.c -target x86_64-linux-musl && musl-ldd ./a.out musl-ldd: ./a.out: Not a valid dynamic program ❯ zig cc main.c -target x86_64-linux-musl -static && musl-ldd ./a.out musl-ldd: ./a.out: Not a valid dynamic program ❯ zig cc main.c -target x86_64-linux-musl -dynamic && musl-ldd ./a.out /lib/ld-musl-x86_64.so.1 (0x72c10019e000) libc.so => /lib/ld-musl-x86_64.so.1 (0x72c10019e000) Closes #11909. --- src/clang_options_data.zig | 11 +++++++++-- src/main.zig | 12 ++++++++++++ tools/update_clang_options.zig | 8 ++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/clang_options_data.zig b/src/clang_options_data.zig index 6f636e90a3..0431b155bd 100644 --- a/src/clang_options_data.zig +++ b/src/clang_options_data.zig @@ -2610,7 +2610,14 @@ flagpd1("dwarf-ext-refs"), }, sepd1("dylib_file"), flagpd1("dylinker"), -flagpd1("dynamic"), +.{ + .name = "dynamic", + .syntax = .flag, + .zig_equivalent = .dynamic, + .pd1 = true, + .pd2 = false, + .psl = false, +}, .{ .name = "dynamiclib", .syntax = .flag, @@ -5698,7 +5705,7 @@ flagpd1("startfiles"), .{ .name = "static", .syntax = .flag, - .zig_equivalent = .other, + .zig_equivalent = .static, .pd1 = true, .pd2 = true, .psl = false, diff --git a/src/main.zig b/src/main.zig index 3c02f8964c..09dfe7a016 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2338,6 +2338,16 @@ fn buildOutputType( fatal("unsupported -rtlib option '{s}'", .{it.only_arg}); } }, + .static => { + create_module.opts.link_mode = .static; + lib_preferred_mode = .static; + lib_search_strategy = .no_fallback; + }, + .dynamic => { + create_module.opts.link_mode = .dynamic; + lib_preferred_mode = .dynamic; + lib_search_strategy = .mode_first; + }, } } // Parse linker args. @@ -5954,6 +5964,8 @@ pub const ClangArgIterator = struct { san_cov, no_san_cov, rtlib, + static, + dynamic, }; const Args = struct { diff --git a/tools/update_clang_options.zig b/tools/update_clang_options.zig index 5b8d5ae4f7..ed5acf13ac 100644 --- a/tools/update_clang_options.zig +++ b/tools/update_clang_options.zig @@ -572,6 +572,14 @@ const known_options = [_]KnownOpt{ .name = "rtlib=", .ident = "rtlib", }, + .{ + .name = "static", + .ident = "static", + }, + .{ + .name = "dynamic", + .ident = "dynamic", + }, }; const blacklisted_options = [_][]const u8{};