"use strict";
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
};
|
Object.defineProperty(exports, "__esModule", { value: true });
|
exports.NodeGyp = void 0;
|
const debug_1 = __importDefault(require("debug"));
|
const detect_libc_1 = __importDefault(require("detect-libc"));
|
const path_1 = __importDefault(require("path"));
|
const semver_1 = __importDefault(require("semver"));
|
const constants_1 = require("../../constants");
|
const clang_fetcher_1 = require("../../clang-fetcher");
|
const __1 = require("..");
|
const child_process_1 = require("child_process");
|
const d = (0, debug_1.default)('electron-rebuild');
|
class NodeGyp extends __1.NativeModule {
|
async buildArgs(prefixedArgs) {
|
const args = [
|
'node',
|
'node-gyp',
|
'rebuild',
|
...prefixedArgs,
|
`--runtime=electron`,
|
`--target=${this.rebuilder.electronVersion}`,
|
`--arch=${this.rebuilder.arch}`,
|
`--dist-url=${this.rebuilder.headerURL}`,
|
'--build-from-source'
|
];
|
args.push(d.enabled ? '--verbose' : '--silent');
|
if (this.rebuilder.debug) {
|
args.push('--debug');
|
}
|
args.push(...(await this.buildArgsFromBinaryField()));
|
if (this.rebuilder.msvsVersion) {
|
args.push(`--msvs_version=${this.rebuilder.msvsVersion}`);
|
}
|
// Headers of old Electron versions do not have a valid config.gypi file
|
// and --force-process-config must be passed to node-gyp >= 8.4.0 to
|
// correctly build modules for them.
|
// See also https://github.com/nodejs/node-gyp/pull/2497
|
if (!semver_1.default.satisfies(this.rebuilder.electronVersion, '^14.2.0 || ^15.3.0') && semver_1.default.major(this.rebuilder.electronVersion) < 16) {
|
args.push('--force-process-config');
|
}
|
return args;
|
}
|
async buildArgsFromBinaryField() {
|
const binary = await this.packageJSONFieldWithDefault('binary', {});
|
let napiBuildVersion = undefined;
|
if (Array.isArray(binary.napi_versions)) {
|
napiBuildVersion = this.nodeAPI.getNapiVersion(binary.napi_versions.map(str => Number(str)));
|
}
|
const flags = await Promise.all(Object.entries(binary).map(async ([binaryKey, binaryValue]) => {
|
if (binaryKey === 'napi_versions') {
|
return;
|
}
|
let value = binaryValue;
|
if (binaryKey === 'module_path') {
|
value = path_1.default.resolve(this.modulePath, value);
|
}
|
value = value.replace('{configuration}', this.rebuilder.buildType)
|
.replace('{node_abi}', `electron-v${this.rebuilder.electronVersion.split('.').slice(0, 2).join('.')}`)
|
.replace('{platform}', this.rebuilder.platform)
|
.replace('{arch}', this.rebuilder.arch)
|
.replace('{version}', await this.packageJSONField('version'))
|
.replace('{libc}', await detect_libc_1.default.family() || 'unknown');
|
if (napiBuildVersion !== undefined) {
|
value = value.replace('{napi_build_version}', napiBuildVersion.toString());
|
}
|
for (const [replaceKey, replaceValue] of Object.entries(binary)) {
|
value = value.replace(`{${replaceKey}}`, replaceValue);
|
}
|
return `--${binaryKey}=${value}`;
|
}));
|
return flags.filter(value => value);
|
}
|
async rebuildModule() {
|
var _a, _b;
|
if (this.modulePath.includes(' ')) {
|
console.error('Attempting to build a module with a space in the path');
|
console.error('See https://github.com/nodejs/node-gyp/issues/65#issuecomment-368820565 for reasons why this may not work');
|
// FIXME: Re-enable the throw when more research has been done
|
// throw new Error(`node-gyp does not support building modules with spaces in their path, tried to build: ${modulePath}`);
|
}
|
const env = {
|
...process.env,
|
};
|
const extraNodeGypArgs = [];
|
if (this.rebuilder.useElectronClang) {
|
const { env: clangEnv, args: clangArgs } = await (0, clang_fetcher_1.getClangEnvironmentVars)(this.rebuilder.electronVersion, this.rebuilder.arch);
|
Object.assign(env, clangEnv);
|
extraNodeGypArgs.push(...clangArgs);
|
}
|
const nodeGypArgs = await this.buildArgs(extraNodeGypArgs);
|
d('rebuilding', this.moduleName, 'with args', nodeGypArgs);
|
const forkedChild = (0, child_process_1.fork)(path_1.default.resolve(__dirname, 'worker.js'), {
|
env,
|
cwd: this.modulePath,
|
stdio: 'pipe',
|
});
|
const outputBuffers = [];
|
(_a = forkedChild.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (chunk) => {
|
outputBuffers.push(chunk);
|
});
|
(_b = forkedChild.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (chunk) => {
|
outputBuffers.push(chunk);
|
});
|
forkedChild.send({
|
moduleName: this.moduleName,
|
nodeGypArgs,
|
extraNodeGypArgs,
|
devDir: this.rebuilder.mode === 'sequential' ? constants_1.ELECTRON_GYP_DIR : path_1.default.resolve(constants_1.ELECTRON_GYP_DIR, '_p', this.moduleName),
|
});
|
await new Promise((resolve, reject) => {
|
forkedChild.on('exit', (code) => {
|
if (code === 0)
|
return resolve();
|
console.error(Buffer.concat(outputBuffers).toString());
|
reject(new Error(`node-gyp failed to rebuild '${this.modulePath}'`));
|
});
|
});
|
}
|
}
|
exports.NodeGyp = NodeGyp;
|
//# sourceMappingURL=node-gyp.js.map
|