Commit 6a8228603c

Alex Rønne Petersen <alex@alexrp.com>
2025-04-14 21:01:25
zig cc: Respect Clang's -static and -dynamic flags.
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.
1 parent 7159843
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,
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 {
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{};