diff options
-rw-r--r-- | tools/vccexe/vccdiscover.nim | 98 | ||||
-rw-r--r-- | tools/vccexe/vccexe.nim | 76 |
2 files changed, 66 insertions, 108 deletions
diff --git a/tools/vccexe/vccdiscover.nim b/tools/vccexe/vccdiscover.nim deleted file mode 100644 index f20bf2441..000000000 --- a/tools/vccexe/vccdiscover.nim +++ /dev/null @@ -1,98 +0,0 @@ -## VCC compiler backend discovery Utility -## -## Module to discover the path to the vcvarsall utility of a VCC compiler backend. -## The module supports discovery for either the latest recognizable version (default) -## or discovery of a specific VCC compiler backend version. -## -## This module can also produce a standalone command-line executable. -## It supports a `--help` command-line argument. Refer to its output for further -## documentation on the `vccdiscover` standalone command-line application. - -import strutils, os, vccenv - -type - VccVersion* = enum ## VCC compiler backend versions - vccUndefined = (0, ""), ## VCC version undefined, resolves to the latest recognizable VCC version - vcc90 = vs90, ## Visual Studio 2008 (Version 9.0) - vcc100 = vs100, ## Visual Studio 2010 (Version 10.0) - vcc110 = vs110, ## Visual Studio 2012 (Version 11.0) - vcc120 = vs120, ## Visual Studio 2013 (Version 12.0) - vcc140 = vs140 ## Visual Studio 2015 (Version 14.0) - -proc discoverVccVcVarsAllPath*(version: VccVersion = vccUndefined): string = - ## Returns the path to the vcvarsall utility of the specified VCC compiler backend. - ## - ## version - ## The specific version of the VCC compiler backend to discover. - ## Defaults to the latest recognized VCC compiler backend that is found on the system. - ## - ## Returns `nil` if the VCC compiler backend discovery failed. - - # TODO: Attempt discovery using vswhere utility. - - # Attempt discovery through VccEnv - # (Trying Visual Studio Common Tools Environment Variables) - result = vccEnvVcVarsAllPath(cast[VccEnvVersion](version)) - if result.len > 0: - return - - # All attempts to dicover vcc failed - -when isMainModule: - const - helpText = """ -+-----------------------------------------------------------------+ -| Microsoft C/C++ Compiler Discovery Utility | -| (c) 2017 Fredrik Hoeisaether Rasch | -+-----------------------------------------------------------------+ - -Discovers the path to the Developer Command Prompt for the -specified versions, or attempts to discover the latest installed -version if no specific version is requested. - -Usage: - vccdiscover [<version>...] -Arguments: - <version> Optionally specify the version to discover - Valid values: 0, 90, 100, 110, 120, 140 - A value of 0 will discover the latest installed SDK - -For each specified version the utility prints a line with the -following format: -<version>: <path> -""" - var quitValue = 0 - let args = commandLineParams() - if args.len < 1: - let path = discoverVccVcVarsAllPath() - if path.len < 1: - echo "latest: VCC installation discovery failed." - quitValue = 1 - else: - echo "latest: " & path - - for argv in args: - # Strip leading hyphens or slashes, if someone tries -?, /?, --help or /help - if argv.len < 1: - continue - var argvValue = argv - while argvValue[0] == '-' or argvValue[0] == '/': - argvValue = argvValue.substr(1) - if argvValue.len < 1: - continue - - if cmpIgnoreCase(argvValue, "help") == 0 or cmpIgnoreCase(argvValue, "?") == 0: - echo helpText - continue - - let version = cast[VccVersion](parseInt(argvValue)) - let path = discoverVccVcVarsAllPath(version) - var head = $version - if head.len < 1: - head = "latest" - if path.len < 1: - echo head & ": VCC installation discovery failed." - inc quitValue - else: - echo "$1: $2" % [head, path] - quit quitValue \ No newline at end of file diff --git a/tools/vccexe/vccexe.nim b/tools/vccexe/vccexe.nim index 86ad86d97..891b4fb2d 100644 --- a/tools/vccexe/vccexe.nim +++ b/tools/vccexe/vccexe.nim @@ -1,9 +1,39 @@ -import strutils, strtabs, os, osproc, vcvarsall, vccdiscover +import strutils, strtabs, os, osproc, vcvarsall, vccenv + +type + VccVersion* = enum ## VCC compiler backend versions + vccUndefined = (0, ""), ## VCC version undefined, resolves to the latest recognizable VCC version + vcc90 = vs90, ## Visual Studio 2008 (Version 9.0) + vcc100 = vs100, ## Visual Studio 2010 (Version 10.0) + vcc110 = vs110, ## Visual Studio 2012 (Version 11.0) + vcc120 = vs120, ## Visual Studio 2013 (Version 12.0) + vcc140 = vs140 ## Visual Studio 2015 (Version 14.0) + +proc discoverVccVcVarsAllPath*(version: VccVersion = vccUndefined): string = + ## Returns the path to the vcvarsall utility of the specified VCC compiler backend. + ## + ## version + ## The specific version of the VCC compiler backend to discover. + ## Defaults to the latest recognized VCC compiler backend that is found on the system. + ## + ## Returns `nil` if the VCC compiler backend discovery failed. + + # TODO: Attempt discovery using vswhere utility. + + # Attempt discovery through VccEnv + # (Trying Visual Studio Common Tools Environment Variables) + result = vccEnvVcVarsAllPath(cast[VccEnvVersion](version)) + if result.len > 0: + return + + # All attempts to dicover vcc failed const vccversionPrefix = "--vccversion" + printPathPrefix = "--printPath" vcvarsallPrefix = "--vcvarsall" commandPrefix = "--command" + noCommandPrefix = "--noCommand" platformPrefix = "--platform" sdktypePrefix = "--sdktype" sdkversionPrefix = "--sdkversion" @@ -19,6 +49,8 @@ const HelpText = """ +-----------------------------------------------------------------+ | Microsoft C/C++ compiler wrapper for Nim | +| & | +| Microsoft C/C++ Compiler Discovery Utility | | (c) 2017 Fredrik Hoeisaether Rasch | +-----------------------------------------------------------------+ @@ -27,7 +59,17 @@ Usage: Options: --vccversion:<v> Optionally specify the VCC version to discover <v>: 0, 90, 100, 110, 120, 140 - Argument value is passed on to vccdiscover utility + If <v> is omitted, attempts to discover the latest + installed version. <v>: 0, 90, 100, 110, 120, 140 + A value of 0 will discover the latest installed SDK + Multiple values can be specified, separated by , + --printPath Print the discovered path of the vcvarsall utility + of the VCC version specified with the --vccversion argument. + For each specified version the utility prints a line with the + following format: <version>: <path> + --noCommand Flag to supress VCC secondary command execution + Useful in conjuction with --vccversion and --printPath to + only perfom VCC discovery, but without executing VCC tools --vcvarsall:<path> Path to the Developer Command Prompt utility vcvarsall.bat that selects the appropiate devlopment settings. Usual path for Visual Studio 2015 and below: @@ -58,8 +100,10 @@ command was specified when isMainModule: var vccversionArg: seq[string] = @[] + var printPathArg: bool = false var vcvarsallArg: string = nil var commandArg: string = nil + var noCommandArg: bool = false var platformArg: VccArch var sdkTypeArg: VccPlatformType var sdkVersionArg: string = nil @@ -77,10 +121,14 @@ when isMainModule: # Check whether the current argument contains -- prefix if wargv.startsWith(vccversionPrefix): # Check for vccversion vccversionArg.add(wargv.substr(vccversionSepIdx + 1)) + elif wargv.cmpIgnoreCase(printPathPrefix) == 0: # Check for printPath + printPathArg = true elif wargv.startsWith(vcvarsallPrefix): # Check for vcvarsall vcvarsallArg = wargv.substr(vcvarsallSepIdx + 1) elif wargv.startsWith(commandPrefix): # Check for command commandArg = wargv.substr(commandSepIdx + 1) + elif wargv.cmpIgnoreCase(noCommandPrefix) == 0: # Check for noCommand + noCommandArg = true elif wargv.startsWith(platformPrefix): # Check for platform platformArg = parseEnum[VccArch](wargv.substr(platformSepIdx + 1)) elif wargv.startsWith(sdktypePrefix): # Check for sdktype @@ -96,8 +144,8 @@ when isMainModule: # Support for multiple specified versions. Attempt VCC discovery for each version # specified, first successful discovery wins + var vccversionValue: VccVersion = vccUndefined for vccversionItem in vccversionArg: - var vccversionValue: VccVersion try: vccversionValue = cast[VccVersion](parseInt(vccversionItem)) except ValueError: @@ -107,8 +155,15 @@ when isMainModule: break # VCC version not specified, discover latest (call discover without args) if vcvarsallArg.len < 1 and vccversionArg.len < 1: + vccversionValue = vccUndefined vcvarsallArg = discoverVccVcVarsAllPath() + if printPathArg: + var head = $vccversionValue + if head.len < 1: + head = "latest" + echo "$1: $2" % [head, vcvarsallArg] + # Call vcvarsall to get the appropiate VCC process environment var vcvars = vccVarsAll(vcvarsallArg, platformArg, sdkTypeArg, sdkVersionArg, verboseArg) if vcvars != nil: @@ -123,10 +178,11 @@ when isMainModule: if commandArg.len < 1: commandArg = "cl.exe" - # Run VCC command with the VCC process environment - let vccProcess = startProcess( - commandArg, - args = clArgs, - options = vccOptions - ) - quit vccProcess.waitForExit() + if not noCommandArg: + # Run VCC command with the VCC process environment + let vccProcess = startProcess( + commandArg, + args = clArgs, + options = vccOptions + ) + quit vccProcess.waitForExit() |