mirror of
https://github.com/electron/node-gyp.git
synced 2025-08-15 12:58:19 +02:00

* feat!: update `engines.node` to `^14.17.0 || ^16.13.0 || >=18.0.0` * deps: nopt@^7.0.0 * feat: replace npmlog with proc-log * deps: standard@17.0.0 and fix linting errors * deps: which@3.0.0 - this also promiisifies the build command * deps: glob@8.0.3 * feat: drop rimraf dependency * fix: use fs/promises in favor of fs.promises
140 lines
3.1 KiB
JavaScript
140 lines
3.1 KiB
JavaScript
'use strict'
|
|
|
|
const fs = require('graceful-fs')
|
|
const childProcess = require('child_process')
|
|
|
|
function startsWith (str, search, pos) {
|
|
if (String.prototype.startsWith) {
|
|
return str.startsWith(search, pos)
|
|
}
|
|
|
|
return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search
|
|
}
|
|
|
|
function processExecSync (file, args, options) {
|
|
let error, command
|
|
command = makeCommand(file, args)
|
|
|
|
/*
|
|
this function emulates child_process.execSync for legacy node <= 0.10.x
|
|
derived from https://github.com/gvarsanyi/sync-exec/blob/master/js/sync-exec.js
|
|
*/
|
|
|
|
options = options || {}
|
|
// init timeout
|
|
const timeout = Date.now() + options.timeout
|
|
// init tmpdir
|
|
let osTempBase = '/tmp'
|
|
const os = determineOS()
|
|
osTempBase = '/tmp'
|
|
|
|
if (process.env.TMP) {
|
|
osTempBase = process.env.TMP
|
|
}
|
|
|
|
if (osTempBase[osTempBase.length - 1] !== '/') {
|
|
osTempBase += '/'
|
|
}
|
|
|
|
const tmpdir = osTempBase + 'processExecSync.' + Date.now() + Math.random()
|
|
fs.mkdirSync(tmpdir)
|
|
|
|
// init command
|
|
if (os === 'linux') {
|
|
command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
|
|
'/stderr); echo $? > ' + tmpdir + '/status'
|
|
} else {
|
|
command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
|
|
'/stderr) | echo %errorlevel% > ' + tmpdir + '/status | exit'
|
|
}
|
|
|
|
// init child
|
|
const child = childProcess.exec(command, options)
|
|
|
|
const maxTry = 100000 // increases the test time by 6 seconds on win-2016-node-0.10
|
|
let tryCount = 0
|
|
while (tryCount < maxTry) {
|
|
try {
|
|
const x = fs.readFileSync(tmpdir + '/status')
|
|
if (x.toString() === '0') {
|
|
break
|
|
}
|
|
} catch (ignore) {}
|
|
tryCount++
|
|
if (Date.now() > timeout) {
|
|
error = child
|
|
break
|
|
}
|
|
}
|
|
|
|
['stdout', 'stderr', 'status'].forEach(function (file) {
|
|
child[file] = fs.readFileSync(tmpdir + '/' + file, options.encoding)
|
|
setTimeout(unlinkFile, 500, tmpdir + '/' + file)
|
|
})
|
|
|
|
child.status = Number(child.status)
|
|
if (child.status !== 0) {
|
|
error = child
|
|
}
|
|
|
|
try {
|
|
fs.rmdirSync(tmpdir)
|
|
} catch (ignore) {}
|
|
if (error) {
|
|
throw error
|
|
}
|
|
return child.stdout
|
|
}
|
|
|
|
function makeCommand (file, args) {
|
|
let command, quote
|
|
command = file
|
|
if (args.length > 0) {
|
|
for (const i in args) {
|
|
command = command + ' '
|
|
if (args[i][0] === '-') {
|
|
command = command + args[i]
|
|
} else {
|
|
if (!quote) {
|
|
command = command + '"'
|
|
quote = true
|
|
}
|
|
command = command + args[i]
|
|
if (quote) {
|
|
if (args.length === (parseInt(i) + 1)) {
|
|
command = command + '"'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return command
|
|
}
|
|
|
|
function determineOS () {
|
|
let os = ''
|
|
let tmpVar = ''
|
|
if (process.env.OSTYPE) {
|
|
tmpVar = process.env.OSTYPE
|
|
} else if (process.env.OS) {
|
|
tmpVar = process.env.OS
|
|
} else {
|
|
// default is linux
|
|
tmpVar = 'linux'
|
|
}
|
|
|
|
if (startsWith(tmpVar, 'linux')) {
|
|
os = 'linux'
|
|
}
|
|
if (startsWith(tmpVar, 'win')) {
|
|
os = 'win'
|
|
}
|
|
|
|
return os
|
|
}
|
|
|
|
function unlinkFile (file) {
|
|
fs.unlinkSync(file)
|
|
}
|
|
|
|
module.exports = processExecSync
|