diff options
author | Araq <rumpf_a@web.de> | 2016-10-24 21:57:25 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2016-10-24 21:57:25 +0200 |
commit | 24ad0064e9565870f2d2e7a12896a659e6fce19f (patch) | |
tree | 5de97895ab68a926c69c28d7ec9642544cf0050c | |
parent | 8a0b9451705788fe7e4f09ad84450ac435e0cba0 (diff) | |
parent | 11dd0b3b5107a784bcb12c2d504a48a9a57884c5 (diff) | |
download | Nim-24ad0064e9565870f2d2e7a12896a659e6fce19f.tar.gz |
Merge branch 'couven92-nim-vccwrap' into devel
-rw-r--r-- | tools/vccenv/vccenv.nim | 58 | ||||
-rw-r--r-- | tools/vccenv/vccexe.nim | 24 | ||||
-rw-r--r-- | tools/vccenv/vcclinkerexe.nim | 25 |
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() + |