Eu estava tomando a abordagem errada. A maneira fácil (mas feia) de fazer isso é modificar o arquivo SConstruct para que haja algum disparador que modificará o ambiente programaticamente antes de o Shell ser chamado.
Para uma prova de conceito, usei meu nome de usuário como o acionador:
import getpass
e mais tarde
msvcEnv = MSVCCompiler.CreateEnvironment(baseEnv)
if getpass.getuser() == 'peterd':
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft SDKs/Windows/v8.1A/bin/NETFX 4.5.1 Tools/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Windows Kits/8.1/bin/x86/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/Team Tools/Performance Tools/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/VCPackages/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/windows/Microsoft.NET/Framework/v4.0.30319/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/Tools/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/')
msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/MSBuild/12.0/bin/')
# INCLUDE and LIBPATH are for the compiler; header files for the former, type libraries and .NET assemblies etc for the latter
msvcEnv.PrependENVPath('INCLUDE', 'C:\Program Files (x86)\Windows Kits\8.1\include\winrt;C:\Program Files (x86)\Windows Kits\8.1\include\um;C:\Program Files (x86)\Windows Kits\8.1\include\shared;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include;')
msvcEnv.PrependENVPath('LIBPATH', 'C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1\ExtensionSDKs\Microsoft.VCLibs\12.0\References\CommonConfiguration\neutral;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib;C:\windows\Microsoft.NET\Framework\v4.0.30319;')
# Apparently the linker still doesn't understand paths with spaces...
msvcEnv.PrependENVPath('LIB', 'C:\PROGRA~2\WI3CF2~1\8.1\Lib\winv6.3\um\x86;C:\PROGRA~2\MICROS~2.0\VC\atlmfc\lib;C:\PROGRA~2\MICROS~2.0\VC\lib;')
Isso parece funcionar.