Adds an extra optional argument to vcc: vctoolset Fixes #21335 (#21336)

This commit is contained in:
Juan M Gómez
2023-02-09 21:19:05 +00:00
committed by GitHub
parent 51f410e1d5
commit 642136ec4f
2 changed files with 17 additions and 5 deletions

View File

@@ -41,6 +41,7 @@ const
platformPrefix = "--platform"
sdktypePrefix = "--sdktype"
sdkversionPrefix = "--sdkversion"
vctoolsetPrefix = "--vctoolset"
verbosePrefix = "--verbose"
vccversionSepIdx = vccversionPrefix.len
@@ -49,6 +50,7 @@ const
platformSepIdx = platformPrefix.len
sdktypeSepIdx = sdktypePrefix.len
sdkversionSepIdx = sdkversionPrefix.len
vctoolsetSepIdx = vctoolsetPrefix.len
vcvarsallDefaultPath = "vcvarsall.bat"
@@ -97,6 +99,8 @@ Options:
"8.1" to use the windows 8.1 SDK
--verbose Echoes the command line for loading the Developer Command Prompt
and the command line passed on to the secondary command.
--vctoolset Optionally specifies the Visual Studio compiler toolset to use.
By default, the environment is set to use the current Visual Studio compiler toolset.
Other command line arguments are passed on to the
secondary command specified by --command or to the
@@ -108,7 +112,7 @@ proc parseVccexeCmdLine(argseq: seq[string],
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,
sdkVersionArg: var string, vctoolsetArg: var string, verboseArg: var bool,
clArgs: var seq[string]) =
## Cannot use usual command-line argument parser here
## Since vccexe command-line arguments are intermingled
@@ -125,7 +129,7 @@ proc parseVccexeCmdLine(argseq: seq[string],
responseargs = parseCmdLine(responsecontent)
parseVccexeCmdLine(responseargs, vccversionArg, printPathArg,
vcvarsallArg, commandArg, noCommandArg, platformArg, sdkTypeArg,
sdkVersionArg, verboseArg, clArgs)
sdkVersionArg, vctoolsetArg, verboseArg, clArgs)
elif wargv.startsWith(vccversionPrefix): # Check for vccversion
vccversionArg.add(wargv.substr(vccversionSepIdx + 1))
elif wargv.cmpIgnoreCase(printPathPrefix) == 0: # Check for printPath
@@ -142,6 +146,8 @@ proc parseVccexeCmdLine(argseq: seq[string],
sdkTypeArg = parseEnum[VccPlatformType](wargv.substr(sdktypeSepIdx + 1))
elif wargv.startsWith(sdkversionPrefix): # Check for sdkversion
sdkVersionArg = wargv.substr(sdkversionSepIdx + 1)
elif wargv.startsWith(vctoolsetPrefix): # Check for vctoolset
vctoolsetArg = wargv.substr(vctoolsetSepIdx + 1)
elif wargv.startsWith(verbosePrefix):
verboseArg = true
else: # Regular cl.exe argument -> store for final cl.exe invocation
@@ -158,13 +164,14 @@ when isMainModule:
var platformArg: VccArch
var sdkTypeArg: VccPlatformType
var sdkVersionArg: string
var vctoolsetArg: string
var verboseArg: bool = false
var clArgs: seq[string] = @[]
let wrapperArgs = commandLineParams()
parseVccexeCmdLine(wrapperArgs, vccversionArg, printPathArg, vcvarsallArg,
commandArg, noCommandArg, platformArg, sdkTypeArg, sdkVersionArg,
commandArg, noCommandArg, platformArg, sdkTypeArg, sdkVersionArg, vctoolsetArg,
verboseArg,
clArgs)
@@ -195,7 +202,7 @@ when isMainModule:
echo "$1: $2" % [head, vcvarsallArg]
# Call vcvarsall to get the appropriate VCC process environment
var vcvars = vccVarsAll(vcvarsallArg, platformArg, sdkTypeArg, sdkVersionArg, verboseArg)
var vcvars = vccVarsAll(vcvarsallArg, platformArg, sdkTypeArg, sdkVersionArg, vctoolsetArg, verboseArg)
if vcvars != nil:
for vccEnvKey, vccEnvVal in vcvars:
putEnv(vccEnvKey, vccEnvVal)

View File

@@ -33,7 +33,7 @@ type
vccplatUWP = "uwp", ## Universal Windows Platform (UWP) Application
vccplatOneCore = "onecore" # Undocumented platform type in the Windows SDK, probably XBox One SDK platform type.
proc vccVarsAll*(path: string, arch: VccArch = vccarchUnspecified, platform_type: VccPlatformType = vccplatEmpty, sdk_version: string = "", verbose: bool = false): StringTableRef =
proc vccVarsAll*(path: string, arch: VccArch = vccarchUnspecified, platform_type: VccPlatformType = vccplatEmpty, sdk_version, vctoolset: string = "", verbose: bool = false): StringTableRef =
## Returns a string table containing the proper process environment to successfully execute VCC compile commands for the specified SDK version, CPU architecture and platform type.
##
## path
@@ -44,6 +44,8 @@ proc vccVarsAll*(path: string, arch: VccArch = vccarchUnspecified, platform_type
## The compile target Platform Type. Defaults to the Windows Desktop platform, i.e. a regular Windows executable binary.
## sdk_version
## The Windows SDK version to use.
## vctoolset
## Visual Studio compiler toolset to use.
## verbose
## Echo the command-line passed on to the system to load the VCC environment. Defaults to `false`.
@@ -63,6 +65,9 @@ proc vccVarsAll*(path: string, arch: VccArch = vccarchUnspecified, platform_type
if sdk_version.len > 0:
args.add(sdk_version)
if vctoolset.len > 0:
args.add("-vcvars_ver="&vctoolset)
let argStr = args.join " "