You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
6.4 KiB
149 lines
6.4 KiB
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ModuleRebuilder = void 0;
|
|
const debug_1 = __importDefault(require("debug"));
|
|
const fs = __importStar(require("fs-extra"));
|
|
const path = __importStar(require("path"));
|
|
const cache_1 = require("./cache");
|
|
const node_gyp_1 = require("./module-type/node-gyp/node-gyp");
|
|
const prebuildify_1 = require("./module-type/prebuildify");
|
|
const prebuild_install_1 = require("./module-type/prebuild-install");
|
|
const node_pre_gyp_1 = require("./module-type/node-pre-gyp");
|
|
const d = (0, debug_1.default)('electron-rebuild');
|
|
class ModuleRebuilder {
|
|
constructor(rebuilder, modulePath) {
|
|
this.modulePath = modulePath;
|
|
this.rebuilder = rebuilder;
|
|
this.nodeGyp = new node_gyp_1.NodeGyp(rebuilder, modulePath);
|
|
this.prebuildify = new prebuildify_1.Prebuildify(rebuilder, modulePath);
|
|
this.prebuildInstall = new prebuild_install_1.PrebuildInstall(rebuilder, modulePath);
|
|
this.nodePreGyp = new node_pre_gyp_1.NodePreGyp(rebuilder, modulePath);
|
|
}
|
|
get metaPath() {
|
|
return path.resolve(this.modulePath, 'build', this.rebuilder.buildType, '.forge-meta');
|
|
}
|
|
get metaData() {
|
|
return `${this.rebuilder.arch}--${this.rebuilder.ABI}`;
|
|
}
|
|
async alreadyBuiltByRebuild() {
|
|
if (await fs.pathExists(this.metaPath)) {
|
|
const meta = await fs.readFile(this.metaPath, 'utf8');
|
|
return meta === this.metaData;
|
|
}
|
|
return false;
|
|
}
|
|
async cacheModuleState(cacheKey) {
|
|
if (this.rebuilder.useCache) {
|
|
await (0, cache_1.cacheModuleState)(this.modulePath, this.rebuilder.cachePath, cacheKey);
|
|
}
|
|
}
|
|
/**
|
|
* Whether a prebuild-install-generated native module exists.
|
|
*/
|
|
async prebuildInstallNativeModuleExists() {
|
|
return this.prebuildInstall.prebuiltModuleExists();
|
|
}
|
|
/**
|
|
* If the native module uses prebuildify, check to see if it comes with a prebuilt module for
|
|
* the given platform and arch.
|
|
*/
|
|
async findPrebuildifyModule(cacheKey) {
|
|
if (await this.prebuildify.usesTool()) {
|
|
d(`assuming is prebuildify powered: ${this.prebuildify.moduleName}`);
|
|
if (await this.prebuildify.findPrebuiltModule()) {
|
|
await this.writeMetadata();
|
|
await this.cacheModuleState(cacheKey);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
async findPrebuildInstallModule(cacheKey) {
|
|
if (await this.prebuildInstall.usesTool()) {
|
|
d(`assuming is prebuild-install powered: ${this.prebuildInstall.moduleName}`);
|
|
if (await this.prebuildInstall.findPrebuiltModule()) {
|
|
d('installed prebuilt module:', this.prebuildInstall.moduleName);
|
|
await this.writeMetadata();
|
|
await this.cacheModuleState(cacheKey);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
async findNodePreGypInstallModule(cacheKey) {
|
|
if (await this.nodePreGyp.usesTool()) {
|
|
d(`assuming is node-pre-gyp powered: ${this.nodePreGyp.moduleName}`);
|
|
if (await this.nodePreGyp.findPrebuiltModule()) {
|
|
d('installed prebuilt module:', this.nodePreGyp.moduleName);
|
|
await this.writeMetadata();
|
|
await this.cacheModuleState(cacheKey);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
async rebuildNodeGypModule(cacheKey) {
|
|
await this.nodeGyp.rebuildModule();
|
|
d('built via node-gyp:', this.nodeGyp.moduleName);
|
|
await this.writeMetadata();
|
|
await this.replaceExistingNativeModule();
|
|
await this.cacheModuleState(cacheKey);
|
|
return true;
|
|
}
|
|
async replaceExistingNativeModule() {
|
|
const buildLocation = path.resolve(this.modulePath, 'build', this.rebuilder.buildType);
|
|
d('searching for .node file', buildLocation);
|
|
const buildLocationFiles = await fs.readdir(buildLocation);
|
|
d('testing files', buildLocationFiles);
|
|
const nodeFile = buildLocationFiles.find((file) => file !== '.node' && file.endsWith('.node'));
|
|
const nodePath = nodeFile ? path.resolve(buildLocation, nodeFile) : undefined;
|
|
if (nodePath && await fs.pathExists(nodePath)) {
|
|
d('found .node file', nodePath);
|
|
if (!this.rebuilder.disablePreGypCopy) {
|
|
const abiPath = path.resolve(this.modulePath, `bin/${this.rebuilder.platform}-${this.rebuilder.arch}-${this.rebuilder.ABI}`);
|
|
d('copying to prebuilt place:', abiPath);
|
|
await fs.mkdir(abiPath, { recursive: true });
|
|
await fs.copyFile(nodePath, path.join(abiPath, `${this.nodeGyp.moduleName}.node`));
|
|
}
|
|
}
|
|
}
|
|
async writeMetadata() {
|
|
await fs.outputFile(this.metaPath, this.metaData);
|
|
}
|
|
async rebuild(cacheKey) {
|
|
if (!this.rebuilder.buildFromSource && ((await this.findPrebuildifyModule(cacheKey)) ||
|
|
(await this.findPrebuildInstallModule(cacheKey)) ||
|
|
(await this.findNodePreGypInstallModule(cacheKey)))) {
|
|
return true;
|
|
}
|
|
return await this.rebuildNodeGypModule(cacheKey);
|
|
}
|
|
}
|
|
exports.ModuleRebuilder = ModuleRebuilder;
|
|
//# sourceMappingURL=module-rebuilder.js.map
|