summary refs log tree commit diff stats
path: root/compiler/extccomp.nim
diff options
context:
space:
mode:
authorrockcavera <rockcavera@gmail.com>2022-12-27 23:40:17 -0300
committerGitHub <noreply@github.com>2022-12-28 10:40:17 +0800
commit9efa56a8bbacab2075a4c2fe4c5424d57b6eab46 (patch)
tree3ab0ccab2376f03ef51a4eed2151061aaf87e6e6 /compiler/extccomp.nim
parent9e35631191ad67994bb45cfad4d9452f790534e0 (diff)
downloadNim-9efa56a8bbacab2075a4c2fe4c5424d57b6eab46.tar.gz
[backport: 2.0] prevents the jsonscript command from exceeding the maximum length of a command line during linking (#21186)
Diffstat (limited to 'compiler/extccomp.nim')
-rw-r--r--compiler/extccomp.nim22
1 files changed, 13 insertions, 9 deletions
diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim
index 66de46556..6515f6968 100644
--- a/compiler/extccomp.nim
+++ b/compiler/extccomp.nim
@@ -851,6 +851,17 @@ proc displayProgressCC(conf: ConfigRef, path, compileCmd: string): string =
     else:
       result = MsgKindToStr[hintCC] % demangleModuleName(path.splitFile.name)
 
+proc preventLinkCmdMaxCmdLen(conf: ConfigRef, linkCmd: string) =
+  # Prevent linkcmd from exceeding the maximum command line length.
+  # 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
+  if linkCmd.len > MaxCmdLen:
+    linkViaResponseFile(conf, linkCmd)
+  else:
+    execLinkCmd(conf, linkCmd)
+
 proc callCCompiler*(conf: ConfigRef) =
   var
     linkCmd: string
@@ -927,14 +938,7 @@ proc callCCompiler*(conf: ConfigRef) =
       linkCmd = getLinkCmd(conf, mainOutput, objfiles, removeStaticFile = true)
       extraCmds = getExtraCmds(conf, mainOutput)
       if optCompileOnly notin conf.globalOptions:
-        const MaxCmdLen = when defined(windows): 8_000 else: 32_000
-        if linkCmd.len > MaxCmdLen:
-          # Windows's command line limit is about 8K (don't laugh...) so C compilers on
-          # Windows support a feature where the command line can be passed via ``@linkcmd``
-          # to them.
-          linkViaResponseFile(conf, linkCmd)
-        else:
-          execLinkCmd(conf, linkCmd)
+        preventLinkCmdMaxCmdLen(conf, linkCmd)
         for cmd in extraCmds:
           execExternalProgram(conf, cmd, hintExecuting)
   else:
@@ -1035,7 +1039,7 @@ proc runJsonBuildInstructions*(conf: ConfigRef; jsonFile: AbsoluteFile) =
     cmds.add cmd
     prettyCmds.add displayProgressCC(conf, name, cmd)
   execCmdsInParallel(conf, cmds, prettyCb)
-  execLinkCmd(conf, bcache.linkcmd)
+  preventLinkCmdMaxCmdLen(conf, bcache.linkcmd)
   for cmd in bcache.extraCmds: execExternalProgram(conf, cmd, hintExecuting)
 
 proc genMappingFiles(conf: ConfigRef; list: CfileList): Rope =