104 lines
2.9 KiB
JavaScript
104 lines
2.9 KiB
JavaScript
/**
|
|
* @file Builds the binary for the specified target. It is also intended to run as a child process.
|
|
*/
|
|
|
|
const {
|
|
execCmdSync,
|
|
autodetectPlatformAndArch,
|
|
} = require("../../scripts/util");
|
|
const { downloadRipgrep } = require("./ripgrep");
|
|
const { TARGET_TO_LANCEDB } = require("../utils/targets");
|
|
const fs = require("fs");
|
|
const {
|
|
downloadSqlite,
|
|
} = require("../../extensions/vscode/scripts/download-copy-sqlite-esbuild");
|
|
const { fork } = require("child_process");
|
|
|
|
async function downloadNodeSqlite(target, targetDir) {
|
|
const [currentPlatform, currentArch] = autodetectPlatformAndArch();
|
|
|
|
// Download and unzip prebuilt sqlite3 binary for the target
|
|
console.log("[info] Downloading node-sqlite3");
|
|
|
|
await downloadSqlite(target, `${targetDir}/build.tar.gz`);
|
|
|
|
execCmdSync(`cd ${targetDir} && tar -xvzf build.tar.gz`);
|
|
|
|
// Copy to build directory for testing
|
|
try {
|
|
const [platform, arch] = target.split("-");
|
|
if (platform === currentPlatform && arch === currentArch) {
|
|
fs.copyFileSync(
|
|
`${targetDir}/build/Release/node_sqlite3.node`,
|
|
`build/node_sqlite3.node`,
|
|
);
|
|
}
|
|
} catch (error) {
|
|
console.log("[warn] Could not copy node_sqlite to build");
|
|
console.log(error);
|
|
}
|
|
fs.unlinkSync(`${targetDir}/build.tar.gz`);
|
|
}
|
|
|
|
/**
|
|
* @param {string} target the platform to build for
|
|
*/
|
|
async function bundleForBinary(target) {
|
|
const targetDir = `bin/${target}`;
|
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
console.log(`[info] Building ${target}...`);
|
|
execCmdSync(
|
|
`npx pkg --no-bytecode --public-packages "*" --public --compress GZip pkgJson/${target} --out-path ${targetDir}`,
|
|
);
|
|
|
|
// copy @lancedb to bin folders
|
|
console.log("[info] Copying @lancedb files to bin");
|
|
fs.copyFileSync(
|
|
`node_modules/${TARGET_TO_LANCEDB[target]}/index.node`,
|
|
`${targetDir}/index.node`,
|
|
);
|
|
|
|
const downloadPromises = [];
|
|
downloadPromises.push(downloadRipgrep(target, targetDir));
|
|
downloadPromises.push(downloadNodeSqlite(target, targetDir));
|
|
await Promise.all(downloadPromises);
|
|
|
|
// Informs the `continue-binary` of where to look for node_sqlite3.node
|
|
// https://www.npmjs.com/package/bindings#:~:text=The%20searching%20for,file%20is%20found
|
|
fs.writeFileSync(`${targetDir}/package.json`, "");
|
|
}
|
|
|
|
process.on("message", (msg) => {
|
|
bundleForBinary(msg.payload.target)
|
|
.then(() => process.send({ done: true }))
|
|
.catch((error) => {
|
|
console.error(error); // show the error in the parent process
|
|
process.send({ error: true });
|
|
});
|
|
});
|
|
|
|
/**
|
|
* @param {string} target the platform to bundle for
|
|
*/
|
|
async function bundleBinary(target) {
|
|
const child = fork(__filename, { stdio: "inherit" });
|
|
child.send({
|
|
payload: {
|
|
target,
|
|
},
|
|
});
|
|
return new Promise((resolve, reject) => {
|
|
child.on("message", (msg) => {
|
|
if (msg.error) {
|
|
reject();
|
|
} else {
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = {
|
|
bundleBinary,
|
|
};
|