summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/extccomp.nim16
1 files changed, 14 insertions, 2 deletions
diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim
index 6515f6968..db97de65c 100644
--- a/compiler/extccomp.nim
+++ b/compiler/extccomp.nim
@@ -834,6 +834,15 @@ proc linkViaResponseFile(conf: ConfigRef; cmd: string) =
   finally:
     removeFile(linkerArgs)
 
+proc linkViaShellScript(conf: ConfigRef; cmd: string) =
+  let linkerScript = conf.projectName & "_" & "linkerScript.sh"
+  writeFile(linkerScript, cmd)
+  let shell = getEnv("SHELL")
+  try:
+    execLinkCmd(conf, shell & " " & linkerScript)
+  finally:
+    removeFile(linkerScript)
+
 proc getObjFilePath(conf: ConfigRef, f: Cfile): string =
   if noAbsolutePaths(conf): f.obj.extractFilename
   else: f.obj.string
@@ -856,9 +865,12 @@ proc preventLinkCmdMaxCmdLen(conf: ConfigRef, linkCmd: string) =
   # Windows's command line limit is about 8K (8191 characters) so C compilers on
   # Windows support a feature where the command line can be passed via ``@linkcmd``
   # to them.
-  const MaxCmdLen = when defined(windows): 8_000 else: 32_000
+  const MaxCmdLen = when defined(windows): 8_000 elif defined(macosx): 260_000 else: 32_000
   if linkCmd.len > MaxCmdLen:
-    linkViaResponseFile(conf, linkCmd)
+    when defined(macosx):
+      linkViaShellScript(conf, linkCmd)
+    else:
+      linkViaResponseFile(conf, linkCmd)
   else:
     execLinkCmd(conf, linkCmd)