summary refs log tree commit diff stats
path: root/tools/vccexe
diff options
context:
space:
mode:
authorFredrik Høisæther Rasch <fredrik.rasch@gmail.com>2020-02-11 12:05:47 +0100
committerGitHub <noreply@github.com>2020-02-11 12:05:47 +0100
commit8100e2e9cdd653da7c3cf70ea84b0713daa3636d (patch)
treed1da58123c1801010ef6558d1b3a5bcb4a14a73c /tools/vccexe
parent84a71dad8797176e9b7ec4f9fefef9fbcd3d8fa4 (diff)
downloadNim-8100e2e9cdd653da7c3cf70ea84b0713daa3636d.tar.gz
Make vccexe parse response files (#13329)
Diffstat (limited to 'tools/vccexe')
-rw-r--r--tools/vccexe/vccexe.nim66
1 files changed, 43 insertions, 23 deletions
diff --git a/tools/vccexe/vccexe.nim b/tools/vccexe/vccexe.nim
index e78f9da5e..1b5b2fb82 100644
--- a/tools/vccexe/vccexe.nim
+++ b/tools/vccexe/vccexe.nim
@@ -32,7 +32,7 @@ proc discoverVccVcVarsAllPath*(version: VccVersion = vccUndefined): string =
 
   # All attempts to discover vcc failed
 
-const 
+const
   vccversionPrefix = "--vccversion"
   printPathPrefix = "--printPath"
   vcvarsallPrefix = "--vcvarsall"
@@ -49,7 +49,7 @@ const
   platformSepIdx = platformPrefix.len
   sdktypeSepIdx = sdktypePrefix.len
   sdkversionSepIdx = sdkversionPrefix.len
-  
+
   vcvarsallDefaultPath = "vcvarsall.bat"
 
   helpText = """
@@ -104,28 +104,29 @@ Microsoft (R) C/C++ Optimizing Compiler if no secondary
 command was specified
 """
 
-when isMainModule:
-  var vccversionArg: seq[string] = @[]
-  var printPathArg: bool = false
-  var vcvarsallArg: string
-  var commandArg: string
-  var noCommandArg: bool = false
-  var platformArg: VccArch
-  var sdkTypeArg: VccPlatformType
-  var sdkVersionArg: string
-  var verboseArg: bool = false
-
-  var clArgs: seq[TaintedString] = @[]
-
-  # Cannot use usual command-line argument parser here
-  # Since vccexe command-line arguments are intermingled
-  # with the secondary command-line arguments which have
-  # a syntax that is not supported by the default nim
-  # argument parser.
-  var wrapperArgs = commandLineParams()
-  for wargv in wrapperArgs:
+proc parseVccexeCmdLine(argseq: seq[TaintedString],
+    vccversionArg: var seq[string], printPathArg: var bool,
+    vcvarsallArg: var string, commandArg: var string, noCommandArg: var bool,
+    platformArg: var VccArch, sdkTypeArg: var VccPlatformType,
+    sdkVersionArg: var string, verboseArg: var bool,
+    clArgs: var seq[TaintedString]) =
+  ## Cannot use usual command-line argument parser here
+  ## Since vccexe command-line arguments are intermingled
+  ## with the secondary command-line arguments which have
+  ## a syntax that is not supported by the default nim
+  ## argument parser.
+  for wargv in argseq:
     # Check whether the current argument contains -- prefix
-    if wargv.startsWith(vccversionPrefix): # Check for vccversion
+    if wargv.startsWith("@"): # Check for response file prefix
+      let
+        responsefilename = wargv.substr(1)
+        responsefilehandle = open(responsefilename)
+        responsecontent = responsefilehandle.readAll()
+        responseargs = parseCmdLine(responsecontent)
+      parseVccexeCmdLine(responseargs, vccversionArg, printPathArg,
+        vcvarsallArg, commandArg, noCommandArg, platformArg, sdkTypeArg,
+        sdkVersionArg, verboseArg, clArgs)
+    elif wargv.startsWith(vccversionPrefix): # Check for vccversion
       vccversionArg.add(wargv.substr(vccversionSepIdx + 1))
     elif wargv.cmpIgnoreCase(printPathPrefix) == 0: # Check for printPath
       printPathArg = true
@@ -148,6 +149,25 @@ when isMainModule:
         echo helpText
       clArgs.add(wargv)
 
+when isMainModule:
+  var vccversionArg: seq[string] = @[]
+  var printPathArg: bool = false
+  var vcvarsallArg: string
+  var commandArg: string
+  var noCommandArg: bool = false
+  var platformArg: VccArch
+  var sdkTypeArg: VccPlatformType
+  var sdkVersionArg: string
+  var verboseArg: bool = false
+
+  var clArgs: seq[TaintedString] = @[]
+
+  let wrapperArgs = commandLineParams()
+  parseVccexeCmdLine(wrapperArgs, vccversionArg, printPathArg, vcvarsallArg,
+    commandArg, noCommandArg, platformArg, sdkTypeArg, sdkVersionArg,
+    verboseArg,
+    clArgs)
+
   # Support for multiple specified versions. Attempt VCC discovery for each version
   # specified, first successful discovery wins
   var vccversionValue: VccVersion = vccUndefined