mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 18:02:05 +00:00
59 lines
1.9 KiB
Nim
59 lines
1.9 KiB
Nim
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)]
|