Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor to not use the helper batch script #6

Merged
merged 1 commit into from May 9, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
90 changes: 23 additions & 67 deletions index.js
@@ -1,8 +1,6 @@
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 exec = require('util').promisify(require('child_process').exec)
const fs = require('fs')
const process = require('process')

const EDITIONS = ['Enterprise', 'Professional', 'Community']
Expand All @@ -20,43 +18,36 @@ const InterestingVariables = [
/^WindowsSDK/i,
]

function findVcvarsall() {
const programFiles = process.env['ProgramFiles(x86)']
// Given the order of each list it should check
// for the more recent versions first and the
// highest grade edition first.
for (const ver of VERSIONS) {
for (const ed of EDITIONS) {
const path = `${programFiles}\\Microsoft Visual Studio\\${ver}\\${ed}\\VC\\Auxiliary\\Build\\vcvarsall.bat`
if (fs.existsSync(path)) {
return path
}
}
}
throw new Error('Microsoft Visual Studio not found')
}

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')
// Call the configuration batch file and then output *all* the environment variables.

var args = [arch]
if (uwp == 'true') {
Expand All @@ -71,46 +62,11 @@ async function main() {
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)
}
const command = `"${findVcvarsall()}" ${args.join(' ')} && set`
core.debug(`Running: ${command}`)
const { stdout } = await exec(command, {shell: "cmd"})
const environment = stdout.split('\r\n')

for (let string of environment) {
const [name, value] = string.split('=')
Expand Down