blob: 2f971644c08c183738e4f31ddf76a7b8c0f4f61f [file]
/*
* 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 { spawn } from 'node:child_process';
import { release } from 'node:os';
import { resolve } from 'node:path';
import { fileURLToPath, pathToFileURL } from 'node:url';
const root = fileURLToPath(new URL('../../', import.meta.url));
/** Select development build capabilities before Cargo resolves native dependencies. */
export async function runCli(
argv,
{
env = process.env,
platform = process.platform,
osRelease = release(),
repositoryRoot = root,
} = {},
) {
const mode = env.MAKA_CUA_BUILD_MODE ?? 'auto';
if (!['auto', 'native', 'bridge'].includes(mode)) {
throw new Error('MAKA_CUA_BUILD_MODE must be auto, native, or bridge');
}
const bridge =
mode === 'bridge' ||
(mode === 'auto' && platform === 'linux' && osRelease.toLowerCase().includes('microsoft'));
const args = [
'run',
'--locked',
'-p',
'maka-cli',
...(bridge ? ['--no-default-features'] : []),
'--',
...argv,
];
const build = await cargo([
'build',
'--locked',
'-p',
'maka-python-runtime',
'--bin',
'maka-python-worker',
]);
if (build.code !== 0 || build.signal) return build;
return await cargo(args);
function cargo(args) {
return new Promise((resolveRun, reject) => {
const child = spawn('cargo', args, {
cwd: repositoryRoot,
env,
stdio: 'inherit',
windowsHide: true,
});
child.once('error', reject);
child.once('exit', (code, signal) => resolveRun({ code, signal }));
});
}
}
if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
try {
const { code, signal } = await runCli(process.argv.slice(2));
if (signal) process.kill(process.pid, signal);
else process.exitCode = code;
} catch (error) {
console.error(error.message);
process.exitCode = 1;
}
}