summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2016-10-24 21:57:25 +0200
committerAraq <rumpf_a@web.de>2016-10-24 21:57:25 +0200
commit24ad0064e9565870f2d2e7a12896a659e6fce19f (patch)
tree5de97895ab68a926c69c28d7ec9642544cf0050c
parent8a0b9451705788fe7e4f09ad84450ac435e0cba0 (diff)
parent11dd0b3b5107a784bcb12c2d504a48a9a57884c5 (diff)
downloadNim-24ad0064e9565870f2d2e7a12896a659e6fce19f.tar.gz
Merge branch 'couven92-nim-vccwrap' into devel
-rw-r--r--tools/vccenv/vccenv.nim58
-rw-r--r--tools/vccenv/vccexe.nim24
-rw-r--r--tools/vccenv/vcclinkerexe.nim25
3 files changed, 107 insertions, 0 deletions
diff --git a/tools/vccenv/vccenv.nim b/tools/vccenv/vccenv.nim
new file mode 100644
index 000000000..a335efd10
--- /dev/null
+++ b/tools/vccenv/vccenv.nim
@@ -0,0 +1,58 @@
+import strtabs, os, osproc, streams, strutils
+
+const
+  comSpecEnvKey = "ComSpec"
+  vsComnToolsEnvKeys = [
+    "VS140COMNTOOLS",
+    "VS130COMNTOOLS",
+    "VS120COMNTOOLS",
+    "VS110COMNTOOLS",
+    "VS100COMNTOOLS",
+    "VS90COMNTOOLS"
+  ]
+  vcvarsallRelativePath = joinPath("..", "..", "VC", "vcvarsall")
+
+proc getVsComnToolsPath*(): TaintedString =
+  for vsComnToolsEnvKey in vsComnToolsEnvKeys:
+    let vsComnToolsEnvVal = getEnv vsComnToolsEnvKey
+    if vsComnToolsEnvVal.len > 0:
+      return vsComnToolsEnvVal
+
+proc getVccEnv*(platform: string, windowsStoreSdk: bool = false,
+                sdkVersion: string = nil): StringTableRef =
+  var comSpecCommandString = getEnv comSpecEnvKey
+  if comSpecCommandString.len == 0:
+    comSpecCommandString = "cmd"
+
+  let vsComnToolsPath = getVsComnToolsPath()
+  if vsComnToolsPath.len < 1:
+    return nil
+  let vcvarsallPath = expandFilename joinPath(vsComnToolsPath, vcvarsallRelativePath)
+
+  var vcvarsallArgs: seq[string] = @[]
+  if platform.len > 0:
+    vcvarsallArgs.add(platform)
+  if windowsStoreSdk:
+    vcvarsallArgs.add("store")
+  if sdkVersion.len > 0:
+    vcvarsallArgs.add(sdkVersion)
+  let vcvarsallArgString = vcvarsallArgs.join(" ")
+
+  var vcvarsallCommandString: string
+  if vcvarsallArgString.len > 0:
+    vcvarsallCommandString = "\"$1\" $2" % [vcvarsallPath, vcvarsallArgString]
+  else:
+    vcvarsallCommandString = vcvarsallPath
+
+  let vcvarsallExecCommand = "\"$1\" /C \"$2 && SET\"" %
+                             [comSpecCommandString, vcvarsallCommandString]
+  when defined(release):
+    let vccvarsallOptions = {poEvalCommand, poDemon}
+  else:
+    let vccvarsallOptions = {poEchoCmd, poEvalCommand, poDemon}
+  let vcvarsallStdOut = execProcess(vcvarsallExecCommand, options = vccvarsallOptions)
+  result = newStringTable(modeCaseInsensitive)
+  for line in vcvarsallStdOut.splitLines:
+    let idx = line.find('=')
+    if idx > 0:
+      result[line[0..(idx - 1)]] = line[(idx + 1)..(line.len - 1)]
diff --git a/tools/vccenv/vccexe.nim b/tools/vccenv/vccexe.nim
new file mode 100644
index 000000000..48ae8c8da
--- /dev/null
+++ b/tools/vccenv/vccexe.nim
@@ -0,0 +1,24 @@
+import strtabs, os, osproc, vccenv
+
+when defined(release):
+  let vccOptions = {poParentStreams}
+else:
+  let vccOptions = {poEchoCmd, poParentStreams}
+
+when isMainModule:
+  var vccEnvStrTab: StringTableRef = nil
+  when defined(i386):
+    vccEnvStrTab = getVccEnv "x86"
+  when defined(amd64):
+    vccEnvStrTab = getVccEnv "amd64"
+  when defined(arm):
+    vccEnvStrTab = getVccEnv "arm"
+  if vccEnvStrTab != nil:
+    for vccEnvKey, vccEnvVal in vccEnvStrTab:
+      putEnv(vccEnvKey, vccEnvVal)
+  let vccProcess = startProcess(
+      "cl.exe",
+      args = commandLineParams(),
+      options = vccOptions
+    )
+  quit vccProcess.waitForExit()
diff --git a/tools/vccenv/vcclinkerexe.nim b/tools/vccenv/vcclinkerexe.nim
new file mode 100644
index 000000000..51c778f38
--- /dev/null
+++ b/tools/vccenv/vcclinkerexe.nim
@@ -0,0 +1,25 @@
+import strtabs, os, osproc, vccenv
+
+when defined(release):
+  let vccOptions = {poParentStreams}
+else:
+  let vccOptions = {poEchoCmd, poParentStreams}
+
+when isMainModule:
+  var vccEnvStrTab: StringTableRef = nil
+  when defined(i386):
+    vccEnvStrTab = getVccEnv "x86"
+  when defined(amd64):
+    vccEnvStrTab = getVccEnv "amd64"
+  when defined(arm):
+    vccEnvStrTab = getVccEnv "arm"
+  if vccEnvStrTab != nil:
+    for vccEnvKey, vccEnvVal in vccEnvStrTab:
+      putEnv(vccEnvKey, vccEnvVal)
+  let vccProcess = startProcess(
+      "link.exe",
+      args = commandLineParams(),
+      options = vccOptions
+    )
+  quit vccProcess.waitForExit()
+