VCC wrappers with vcvars args.
VCC wrappers no longer wrap for compile-time specific target VCC wrappers now peek into the command line args and evaluate vcvars prefixed arguments
This commit is contained in:
parent
01afff495c
commit
e99f35ff23
3 changed files with 114 additions and 21 deletions
|
|
@ -177,10 +177,18 @@ clang.options.speed = "-O3"
|
||||||
clang.options.size = "-Os"
|
clang.options.size = "-Os"
|
||||||
|
|
||||||
# Configuration for the Visual C/C++ compiler:
|
# Configuration for the Visual C/C++ compiler:
|
||||||
vcc.options.linker = "/DEBUG /Zi /Fd\"$projectName.pdb\" /F33554432" # set the stack size to 8 MB
|
vcc.exe = "vccexe.exe"
|
||||||
|
vcc.linkerexe = "vccexe.exe"
|
||||||
|
|
||||||
|
# Here we need to set the options for specific platforms:
|
||||||
|
# amd64.windows.vcc.options = "/vcvars:platform:amd64"
|
||||||
|
# i386.windows.vcc.options = "/vcvars:platform:x86"
|
||||||
|
# arm.windows.vcc.options = "/vcvars:platform:arm"
|
||||||
|
|
||||||
|
vcc.options.linker = "/nologo /DEBUG /Zi /Fd\"$projectName.pdb\" /F33554432" # set the stack size to 8 MB
|
||||||
vcc.options.debug = "/Zi /Fd\"$projectName.pdb\""
|
vcc.options.debug = "/Zi /Fd\"$projectName.pdb\""
|
||||||
vcc.options.always = "/nologo"
|
vcc.options.always = "/nologo"
|
||||||
vcc.options.speed = "/O2 /arch:SSE2"
|
vcc.options.speed = "/O2"
|
||||||
vcc.options.size = "/O1"
|
vcc.options.size = "/O1"
|
||||||
|
|
||||||
# Configuration for the Tiny C Compiler:
|
# Configuration for the Tiny C Compiler:
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,67 @@
|
||||||
import strtabs, os, osproc, vccenv
|
import strutils, strtabs, os, osproc, vccenv
|
||||||
|
|
||||||
when defined(release):
|
when defined(release):
|
||||||
let vccOptions = {poParentStreams}
|
let vccOptions = {poParentStreams}
|
||||||
else:
|
else:
|
||||||
let vccOptions = {poEchoCmd, poParentStreams}
|
let vccOptions = {poEchoCmd, poParentStreams}
|
||||||
|
|
||||||
|
const
|
||||||
|
vcvarsArgPrefix = "vcvars:"
|
||||||
|
platformArgPrefix = "platform:"
|
||||||
|
storeArgPrefix = "store"
|
||||||
|
sdkArgPrefix = "sdk:"
|
||||||
|
vcvarsArgIdx = 1 # vcvars comes after - or / char in argument
|
||||||
|
argsToken1Idx = vcvarsArgIdx + vcvarsArgPrefix.len
|
||||||
|
platformArgValueIdx = argsToken1Idx + platformArgPrefix.len
|
||||||
|
sdkArgValueIdx = argsToken1Idx + sdkArgPrefix.len
|
||||||
|
|
||||||
|
HelpText = """
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
| Microsoft C/C++ compiler wrapper for Nim |
|
||||||
|
| (c) 2016 Fredrik Høisæther Rasch |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
vccexe [options] [compileroptions]
|
||||||
|
Options:
|
||||||
|
/vcvars:platform:<arch> Specify the Compiler Platform Tools architecture
|
||||||
|
<arch>: x86 | amd64 | arm | x86_amd64 | x86_arm | amd64_x86 | amd64_arm
|
||||||
|
/vcvars:store Use Windows Store (rather than desktop) development tools
|
||||||
|
/vcvars:sdk:<version> Use a specific Windows SDK version:
|
||||||
|
<version> is either the full Windows 10 SDK version number or
|
||||||
|
"8.1" to use the windows 8.1 SDK
|
||||||
|
"""
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
var vccEnvStrTab: StringTableRef = nil
|
var platformArg: string = nil
|
||||||
when defined(i386):
|
var storeArg: bool = false
|
||||||
vccEnvStrTab = getVccEnv "x86"
|
var sdkVersionArg: string = nil
|
||||||
when defined(amd64):
|
var clArgs: seq[TaintedString] = @[]
|
||||||
vccEnvStrTab = getVccEnv "amd64"
|
var wrapperArgs = commandLineParams()
|
||||||
when defined(arm):
|
for wargv in wrapperArgs:
|
||||||
vccEnvStrTab = getVccEnv "arm"
|
# Check whether the current argument contains vcvars prefix
|
||||||
|
if cmpIgnoreCase(wargv.substr(vcvarsArgIdx, argsToken1Idx - 1), vcvarsArgPrefix) == 0:
|
||||||
|
# Check for platform
|
||||||
|
if cmpIgnoreCase(wargv.substr(argsToken1Idx, platformArgValueIdx - 1), platformArgPrefix) == 0:
|
||||||
|
platformArg = wargv.substr(platformArgValueIdx)
|
||||||
|
# Check for store
|
||||||
|
elif cmpIgnoreCase(wargv.substr(argsToken1Idx), storeArgPrefix) == 0:
|
||||||
|
storeArg = true
|
||||||
|
# Check for sdk
|
||||||
|
elif cmpIgnoreCase(wargv.substr(argsToken1Idx, sdkArgValueIdx - 1), sdkArgPrefix) == 0:
|
||||||
|
sdkVersionArg = wargv.substr(sdkArgValueIdx)
|
||||||
|
else: # Regular cl.exe argument -> store for final cl.exe invocation
|
||||||
|
if (wargv.len == 2) and (wargv[1] == '?'):
|
||||||
|
echo HelpText
|
||||||
|
clArgs.add(wargv)
|
||||||
|
|
||||||
|
var vccEnvStrTab = getVccEnv(platformArg, storeArg, sdkVersionArg)
|
||||||
if vccEnvStrTab != nil:
|
if vccEnvStrTab != nil:
|
||||||
for vccEnvKey, vccEnvVal in vccEnvStrTab:
|
for vccEnvKey, vccEnvVal in vccEnvStrTab:
|
||||||
putEnv(vccEnvKey, vccEnvVal)
|
putEnv(vccEnvKey, vccEnvVal)
|
||||||
let vccProcess = startProcess(
|
let vccProcess = startProcess(
|
||||||
"cl.exe",
|
"cl.exe",
|
||||||
args = commandLineParams(),
|
args = clArgs,
|
||||||
options = vccOptions
|
options = vccOptions
|
||||||
)
|
)
|
||||||
quit vccProcess.waitForExit()
|
quit vccProcess.waitForExit()
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,67 @@
|
||||||
import strtabs, os, osproc, vccenv
|
import strutils, strtabs, os, osproc, vccenv
|
||||||
|
|
||||||
when defined(release):
|
when defined(release):
|
||||||
let vccOptions = {poParentStreams}
|
let vccOptions = {poParentStreams}
|
||||||
else:
|
else:
|
||||||
let vccOptions = {poEchoCmd, poParentStreams}
|
let vccOptions = {poEchoCmd, poParentStreams}
|
||||||
|
|
||||||
|
const
|
||||||
|
vcvarsArgPrefix = "vcvars:"
|
||||||
|
platformArgPrefix = "platform:"
|
||||||
|
storeArgPrefix = "store"
|
||||||
|
sdkArgPrefix = "sdk:"
|
||||||
|
vcvarsArgIdx = 1 # vcvars comes after - or / char in argument
|
||||||
|
argsToken1Idx = vcvarsArgIdx + vcvarsArgPrefix.len
|
||||||
|
platformArgValueIdx = argsToken1Idx + platformArgPrefix.len
|
||||||
|
sdkArgValueIdx = argsToken1Idx + sdkArgPrefix.len
|
||||||
|
|
||||||
|
HelpText = """
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
| Microsoft C/C++ compiler wrapper for Nim |
|
||||||
|
| (c) 2016 Fredrik Høisæther Rasch |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
vccexe [options] [compileroptions]
|
||||||
|
Options:
|
||||||
|
/vcvars:platform:<arch> Specify the Compiler Platform Tools architecture
|
||||||
|
<arch>: x86 | amd64 | arm | x86_amd64 | x86_arm | amd64_x86 | amd64_arm
|
||||||
|
/vcvars:store Use Windows Store (rather than desktop) development tools
|
||||||
|
/vcvars:sdk:<version> Use a specific Windows SDK version:
|
||||||
|
<version> is either the full Windows 10 SDK version number or
|
||||||
|
"8.1" to use the windows 8.1 SDK
|
||||||
|
"""
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
var vccEnvStrTab: StringTableRef = nil
|
var platformArg: string = nil
|
||||||
when defined(i386):
|
var storeArg: bool = false
|
||||||
vccEnvStrTab = getVccEnv "x86"
|
var sdkVersionArg: string = nil
|
||||||
when defined(amd64):
|
var clArgs: seq[TaintedString] = @[]
|
||||||
vccEnvStrTab = getVccEnv "amd64"
|
var wrapperArgs = commandLineParams()
|
||||||
when defined(arm):
|
for wargv in wrapperArgs:
|
||||||
vccEnvStrTab = getVccEnv "arm"
|
# Check whether the current argument contains vcvars prefix
|
||||||
|
if cmpIgnoreCase(wargv.substr(vcvarsArgIdx, argsToken1Idx - 1), vcvarsArgPrefix) == 0:
|
||||||
|
# Check for platform
|
||||||
|
if cmpIgnoreCase(wargv.substr(argsToken1Idx, platformArgValueIdx - 1), platformArgPrefix) == 0:
|
||||||
|
platformArg = wargv.substr(platformArgValueIdx)
|
||||||
|
# Check for store
|
||||||
|
elif cmpIgnoreCase(wargv.substr(argsToken1Idx), storeArgPrefix) == 0:
|
||||||
|
storeArg = true
|
||||||
|
# Check for sdk
|
||||||
|
elif cmpIgnoreCase(wargv.substr(argsToken1Idx, sdkArgValueIdx - 1), sdkArgPrefix) == 0:
|
||||||
|
sdkVersionArg = wargv.substr(sdkArgValueIdx)
|
||||||
|
else: # Regular cl.exe argument -> store for final cl.exe invocation
|
||||||
|
if (wargv.len == 2) and (wargv[1] == '?'):
|
||||||
|
echo HelpText
|
||||||
|
clArgs.add(wargv)
|
||||||
|
|
||||||
|
var vccEnvStrTab = getVccEnv(platformArg, storeArg, sdkVersionArg)
|
||||||
if vccEnvStrTab != nil:
|
if vccEnvStrTab != nil:
|
||||||
for vccEnvKey, vccEnvVal in vccEnvStrTab:
|
for vccEnvKey, vccEnvVal in vccEnvStrTab:
|
||||||
putEnv(vccEnvKey, vccEnvVal)
|
putEnv(vccEnvKey, vccEnvVal)
|
||||||
let vccProcess = startProcess(
|
let vccProcess = startProcess(
|
||||||
"link.exe",
|
"link.exe",
|
||||||
args = commandLineParams(),
|
args = clArgs,
|
||||||
options = vccOptions
|
options = vccOptions
|
||||||
)
|
)
|
||||||
quit vccProcess.waitForExit()
|
quit vccProcess.waitForExit()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue