mirror of
https://github.com/ilammy/msvc-dev-cmd.git
synced 2026-09-07 06:07:19 +08:00
ef0a58bd96
I'll probably use self hosted runners in a project and the Community version of Visual Studio will be installed on those. This enables the script to check for Community and Professional editions in addition to the Entreprise one offered by GitHub. The modification generates a kinda search map ordered by version then by edition. It generates the batch script that runs vcvarsall.bat on the fly given that search map.
129 lines
3.5 KiB
JavaScript
129 lines
3.5 KiB
JavaScript
const core = require('@actions/core')
|
|
const execFile = require('util').promisify(require('child_process').execFile)
|
|
const fs = require('fs').promises
|
|
const os = require('os')
|
|
const path = require('path')
|
|
const process = require('process')
|
|
|
|
const EDITIONS = ['Enterprise', 'Professional', 'Community']
|
|
const VERSIONS = ['2019', '2017']
|
|
|
|
const InterestingVariables = [
|
|
'INCLUDE',
|
|
'LIB',
|
|
'LIBPATH',
|
|
'Path',
|
|
'Platform',
|
|
'VisualStudioVersion',
|
|
/^VCTools/,
|
|
/^VSCMD_/,
|
|
/^WindowsSDK/i,
|
|
]
|
|
|
|
async function main() {
|
|
if (process.platform != 'win32') {
|
|
core.info('This is not a Windows virtual environment, bye!')
|
|
return
|
|
}
|
|
|
|
// this should generate an array like
|
|
// [
|
|
// ['P2017', 'path\to\2017\Professional...'],
|
|
// ['C2017', 'path\to\2017\Entreprise...'],
|
|
// etc...
|
|
// [
|
|
// Given the order of each list it should check
|
|
// for the more recent versions first and the
|
|
// highest grade edition first.
|
|
var search_map = []
|
|
|
|
VERSIONS.forEach(ver => {
|
|
EDITIONS.forEach(ed => {
|
|
let label = ed.charAt(0) + ver
|
|
let path = `%ProgramFiles(x86)%\\Microsoft Visual Studio\\${ver}\\${ed}\\VC\\Auxiliary\\Build\\vcvarsall.bat`
|
|
|
|
search_map.push([label, path])
|
|
})
|
|
})
|
|
|
|
const arch = core.getInput('arch')
|
|
const sdk = core.getInput('sdk')
|
|
const toolset = core.getInput('toolset')
|
|
const uwp = core.getInput('uwp')
|
|
const spectre = core.getInput('spectre')
|
|
|
|
// Due to the way Microsoft Visual C++ is configured, we have to resort to the following hack:
|
|
// write a helper batch file which calls the configuration batch file and then outputs the
|
|
// configured environment variables, which we then pass to GitHub Actions.
|
|
|
|
const helper = path.join(os.homedir(), 'msvc-dev-cmd.bat')
|
|
|
|
var args = [arch]
|
|
if (uwp == 'true') {
|
|
args.push('uwp')
|
|
}
|
|
if (sdk) {
|
|
args.push(sdk)
|
|
}
|
|
if (toolset) {
|
|
args.push(`-vcvars_ver=${toolset}`)
|
|
}
|
|
if (spectre == 'true') {
|
|
args.push('-vcvars_spectre_libs=spectre')
|
|
}
|
|
core.debug(`Arguments: ${args.join(' ')}`)
|
|
|
|
var script = '';
|
|
|
|
search_map.forEach(pair => {
|
|
script += `@IF EXIST "${pair[1]}" GOTO :${pair[0]}\n`
|
|
})
|
|
|
|
script += `@ECHO "Microsoft Visual Studio not found"\n
|
|
@EXIT 1\n`
|
|
|
|
search_map.forEach(pair => {
|
|
script += `:${pair[0]}\n
|
|
@CALL "${pair[1]}" ${args.join(' ')}\n
|
|
@GOTO ENV\n`
|
|
})
|
|
|
|
script += `:ENV\n
|
|
@IF ERRORLEVEL 1 EXIT\n
|
|
@SET`
|
|
|
|
core.debug(script)
|
|
|
|
core.debug(`Writing helper file: ${helper}`)
|
|
await fs.writeFile(helper, script)
|
|
|
|
var environment
|
|
try {
|
|
core.debug('Executing helper')
|
|
const { stdout } = await execFile('cmd.exe', ['/q', '/c', helper])
|
|
environment = stdout.split('\r\n')
|
|
}
|
|
catch (error) {
|
|
core.debug(`Helper failed: ${error.message}`)
|
|
throw error
|
|
}
|
|
finally {
|
|
core.debug('Removing helper')
|
|
await fs.unlink(helper)
|
|
}
|
|
|
|
for (let string of environment) {
|
|
const [name, value] = string.split('=')
|
|
for (let pattern of InterestingVariables) {
|
|
if (name.match(pattern)) {
|
|
core.exportVariable(name, value)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
core.info(`Configured Developer Command Prompt`)
|
|
}
|
|
|
|
main().catch((e) => core.setFailed('Could not setup Developer Command Prompt: ' + e.message))
|