Commit e26f063b22

Andrew Kelley <andrew@ziglang.org>
2020-02-17 21:46:53
support the concept of a target not having a dynamic linker
1 parent 2f9c5c0
Changed files (5)
lib/std/target.zig
@@ -1227,6 +1227,7 @@ pub const Target = union(enum) {
     ) error{
         OutOfMemory,
         UnknownDynamicLinkerPath,
+        TargetHasNoDynamicLinker,
     }![:0]u8 {
         const a = allocator;
         if (self.isAndroid()) {
@@ -1300,6 +1301,10 @@ pub const Target = union(enum) {
                 .riscv32 => return mem.dupeZ(a, u8, "/lib/ld-linux-riscv32-ilp32.so.1"),
                 .riscv64 => return mem.dupeZ(a, u8, "/lib/ld-linux-riscv64-lp64.so.1"),
 
+                .wasm32,
+                .wasm64,
+                => return error.TargetHasNoDynamicLinker,
+
                 .arc,
                 .avr,
                 .bpfel,
@@ -1324,12 +1329,22 @@ pub const Target = union(enum) {
                 .kalimba,
                 .shave,
                 .lanai,
-                .wasm32,
-                .wasm64,
                 .renderscript32,
                 .renderscript64,
                 => return error.UnknownDynamicLinkerPath,
             },
+
+            .freestanding,
+            .ios,
+            .tvos,
+            .watchos,
+            .macosx,
+            .uefi,
+            .windows,
+            .emscripten,
+            .other,
+            => return error.TargetHasNoDynamicLinker,
+
             else => return error.UnknownDynamicLinkerPath,
         }
     }
src/codegen.cpp
@@ -8969,6 +8969,7 @@ static void detect_dynamic_linker(CodeGen *g) {
     char *dynamic_linker_ptr;
     size_t dynamic_linker_len;
     if ((err = stage2_detect_dynamic_linker(g->zig_target, &dynamic_linker_ptr, &dynamic_linker_len))) {
+        if (err == ErrorTargetHasNoDynamicLinker) return;
         fprintf(stderr, "Unable to detect dynamic linker: %s\n", err_str(err));
         exit(1);
     }
src/error.cpp
@@ -80,7 +80,8 @@ const char *err_str(Error err) {
         case ErrorLibCKernel32LibNotFound: return "kernel32 library not found";
         case ErrorUnsupportedArchitecture: return "unsupported architecture";
         case ErrorWindowsSdkNotFound: return "Windows SDK not found";
-        case ErrorUnknownDynamicLinkerPath: return "Windows SDK not found";
+        case ErrorUnknownDynamicLinkerPath: return "unknown dynamic linker path";
+        case ErrorTargetHasNoDynamicLinker: return "target has no dynamic linker";
     }
     return "(invalid error)";
 }
src/stage2.h
@@ -103,6 +103,7 @@ enum Error {
     ErrorUnsupportedArchitecture,
     ErrorWindowsSdkNotFound,
     ErrorUnknownDynamicLinkerPath,
+    ErrorTargetHasNoDynamicLinker,
 };
 
 // ABI warning
src-self-hosted/stage2.zig
@@ -110,6 +110,7 @@ const Error = extern enum {
     UnsupportedArchitecture,
     WindowsSdkNotFound,
     UnknownDynamicLinkerPath,
+    TargetHasNoDynamicLinker,
 };
 
 const FILE = std.c.FILE;
@@ -1101,6 +1102,7 @@ export fn stage2_detect_dynamic_linker(in_target: *const Stage2Target, out_ptr:
     ) catch |err| switch (err) {
         error.OutOfMemory => return .OutOfMemory,
         error.UnknownDynamicLinkerPath => return .UnknownDynamicLinkerPath,
+        error.TargetHasNoDynamicLinker => return .TargetHasNoDynamicLinker,
     };
     out_ptr.* = result.ptr;
     out_len.* = result.len;