Dependency audit / audit (push) Canceled after 0s
CI / plan (push) Canceled after 0s
Gitoxide helper admission / macos-latest (push) Canceled after 0s
Gitoxide helper admission / ubuntu-latest (push) Canceled after 0s
Gitoxide helper admission / windows-latest (push) Canceled after 0s
Runtime Host peer admission / quality (push) Canceled after 0s
Windows recovery / windows_recovery (push) Canceled after 0s
CI / heavy (push) Canceled after 0s
CI / test (push) Canceled after 0s
102 lines
3.7 KiB
JavaScript
102 lines
3.7 KiB
JavaScript
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
import { copyFile, mkdir, readFile } from 'node:fs/promises';
|
|
import { spawn } from 'node:child_process';
|
|
import { dirname, join, resolve } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const root = dirname(fileURLToPath(import.meta.url));
|
|
const encodedRustflags = [
|
|
process.env.CARGO_ENCODED_RUSTFLAGS,
|
|
`--remap-path-prefix=${root}=native/runtime-host-peer`,
|
|
...(process.platform === 'win32' ? ['-Clink-arg=/PDBALTPATH:maka_runtime_host_peer.pdb'] : []),
|
|
]
|
|
.filter(Boolean)
|
|
.join('\x1f');
|
|
const cargoSubcommand = process.env.MAKA_RUNTIME_HOST_PEER_CARGO_SUBCOMMAND?.trim() || 'build';
|
|
const cargoTarget = process.env.MAKA_RUNTIME_HOST_PEER_CARGO_TARGET?.trim();
|
|
await run(
|
|
'cargo',
|
|
[cargoSubcommand, '--release', '--locked', ...(cargoTarget ? ['--target', cargoTarget] : [])],
|
|
root,
|
|
{
|
|
...process.env,
|
|
CARGO_ENCODED_RUSTFLAGS: encodedRustflags,
|
|
},
|
|
);
|
|
|
|
const cargoArtifactTarget = cargoTarget?.replace(/\.\d+\.\d+$/u, '');
|
|
const releaseDirectory = cargoArtifactTarget
|
|
? join(root, 'target', cargoArtifactTarget, 'release')
|
|
: join(root, 'target', 'release');
|
|
const targetPlatform = cargoTarget
|
|
? cargoTarget.includes('windows')
|
|
? 'win32'
|
|
: cargoTarget.includes('apple')
|
|
? 'darwin'
|
|
: 'linux'
|
|
: process.platform;
|
|
const targetArch = cargoTarget
|
|
? cargoTarget.startsWith('aarch64-')
|
|
? 'arm64'
|
|
: cargoTarget.startsWith('x86_64-')
|
|
? 'x64'
|
|
: undefined
|
|
: process.arch;
|
|
|
|
const library =
|
|
targetPlatform === 'win32'
|
|
? 'maka_runtime_host_peer.dll'
|
|
: targetPlatform === 'darwin'
|
|
? 'libmaka_runtime_host_peer.dylib'
|
|
: 'libmaka_runtime_host_peer.so';
|
|
const destination = process.env.MAKA_RUNTIME_HOST_PEER_OUTPUT?.trim()
|
|
? resolve(process.env.MAKA_RUNTIME_HOST_PEER_OUTPUT.trim())
|
|
: join(root, 'target', 'release', 'maka_runtime_host_peer.node');
|
|
await mkdir(dirname(destination), { recursive: true });
|
|
await copyFile(join(releaseDirectory, library), destination);
|
|
if (targetPlatform === 'darwin' && process.platform === 'darwin') {
|
|
await run('install_name_tool', ['-id', '@rpath/maka_runtime_host_peer.node', destination], root, {
|
|
...process.env,
|
|
});
|
|
await run('strip', ['-x', destination], root, { ...process.env });
|
|
} else if (
|
|
targetPlatform === 'linux' &&
|
|
process.platform === 'linux' &&
|
|
targetArch === process.arch
|
|
) {
|
|
await run('strip', ['--strip-unneeded', destination], root, { ...process.env });
|
|
}
|
|
if ((await readFile(destination)).includes(Buffer.from(root))) {
|
|
throw new Error('The Runtime Host peer addon contains its build path');
|
|
}
|
|
process.stdout.write(`${destination}\n`);
|
|
|
|
function run(command, args, cwd, env) {
|
|
return new Promise((resolve, reject) => {
|
|
const child = spawn(command, args, { cwd, env, stdio: 'inherit' });
|
|
child.once('error', reject);
|
|
child.once('exit', (code, signal) => {
|
|
if (code === 0) resolve();
|
|
else reject(new Error(`${command} failed: ${signal ?? code}`));
|
|
});
|
|
});
|
|
}
|