const fs = require('fs');
const { spawn } = require('node:child_process');
const GENERIC_BUCKETS = 3;
const SINGLE_CRATE_BUCKETS = ["wasmtime", "wasmtime-cli", "wasmtime-wasi"];
const FAST_MATRIX = [
{
"os": "ubuntu-22.04",
"name": "Test Linux x86_64",
"filter": "linux-x64",
"isa": "x64",
},
];
function supports32Bit(pkg) {
if (pkg.indexOf("pulley") !== -1)
return true;
return pkg == 'wasmtime-fiber';
}
const FULL_MATRIX = [
...FAST_MATRIX,
{
"os": "ubuntu-22.04",
"name": "Test MSRV on Linux x86_64",
"filter": "linux-x64",
"isa": "x64",
"rust": "msrv",
},
{
"os": "ubuntu-22.04",
"name": "Test Linux x86_64 with MPK",
"filter": "linux-x64",
"isa": "x64"
},
{
"os": "macos-15",
"name": "Test macOS x86_64",
"filter": "macos-x64",
"target": "x86_64-apple-darwin",
},
{
"os": "macos-14",
"name": "Test macOS arm64",
"filter": "macos-arm64",
"target": "aarch64-apple-darwin",
},
{
"os": "windows-2022",
"name": "Test Windows MSVC x86_64",
"filter": "windows-x64",
},
{
"os": "windows-2022",
"target": "x86_64-pc-windows-gnu",
"name": "Test Windows MinGW x86_64",
"filter": "mingw-x64"
},
{
"os": "ubuntu-22.04",
"target": "aarch64-unknown-linux-gnu",
"gcc_package": "gcc-aarch64-linux-gnu",
"gcc": "aarch64-linux-gnu-gcc",
"qemu": "qemu-aarch64 -L /usr/aarch64-linux-gnu",
"qemu_target": "aarch64-linux-user",
"name": "Test Linux arm64",
"filter": "linux-arm64",
"isa": "aarch64",
},
{
"os": "ubuntu-22.04",
"target": "s390x-unknown-linux-gnu",
"gcc_package": "gcc-s390x-linux-gnu",
"gcc": "s390x-linux-gnu-gcc",
"qemu": "qemu-s390x -L /usr/s390x-linux-gnu",
"qemu_target": "s390x-linux-user",
"name": "Test Linux s390x",
"filter": "linux-s390x",
"isa": "s390x"
},
{
"os": "ubuntu-22.04",
"target": "riscv64gc-unknown-linux-gnu",
"gcc_package": "gcc-riscv64-linux-gnu",
"gcc": "riscv64-linux-gnu-gcc",
"qemu": "qemu-riscv64 -cpu rv64,v=true,vlen=256,vext_spec=v1.0,Zfa=true,zba=true,zbb=true,zbc=true,zbs=true,zbkb=true,zcb=true,x-zicond=true -L /usr/riscv64-linux-gnu",
"qemu_target": "riscv64-linux-user",
"name": "Test Linux riscv64",
"filter": "linux-riscv64",
"isa": "riscv64",
},
{
"name": "Tests on i686-unknown-linux-gnu",
"32-bit": true,
"os": "ubuntu-22.04",
"target": "i686-unknown-linux-gnu",
"gcc_package": "gcc-i686-linux-gnu",
"gcc": "i686-linux-gnu-gcc",
},
{
"name": "Tests on armv7-unknown-linux-gnueabihf",
"32-bit": true,
"os": "ubuntu-22.04",
"target": "armv7-unknown-linux-gnueabihf",
"gcc_package": "gcc-arm-linux-gnueabihf",
"gcc": "arm-linux-gnueabihf-gcc",
"qemu": "qemu-arm -L /usr/arm-linux-gnueabihf -E LD_LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib",
"qemu_target": "arm-linux-user",
},
];
async function getWorkspaceMembers() {
const child = spawn("cargo", ["metadata"], { encoding: "utf8" });
let data = "";
child.stdout.on("data", chunk => data += chunk);
await new Promise((resolve, reject) => {
child.on("close", resolve);
child.on("error", reject);
});
const metadata = JSON.parse(data);
const id_to_name = {};
for (const pkg of metadata.packages) {
id_to_name[pkg.id] = pkg.name;
}
return metadata.workspace_members.map(m => id_to_name[m]);
}
async function shard(configs) {
const members = await getWorkspaceMembers();
const buckets = Array.from({ length: GENERIC_BUCKETS }, _ => new Set());
let i = 0;
for (const crate of members) {
if (SINGLE_CRATE_BUCKETS.indexOf(crate) != -1) continue;
buckets[i].add(crate);
i = (i + 1) % GENERIC_BUCKETS;
}
for (crate of SINGLE_CRATE_BUCKETS) {
buckets.push(new Set([crate]));
}
const sharded = [];
for (const config of configs) {
if (config["32-bit"] === true) {
sharded.push(Object.assign(
{},
config,
{
bucket: members
.map(c => supports32Bit(c) ? `--package ${c}` : `--exclude ${c}`)
.join(" "),
}
));
continue;
}
for (const bucket of buckets) {
sharded.push(Object.assign(
{},
config,
{
name: `${config.name} (${Array.from(bucket).join(', ')})`,
bucket: members
.map(c => bucket.has(c) ? `--package ${c}` : `--exclude ${c}`)
.join(" "),
}
));
}
}
return sharded;
}
async function main() {
const commits = fs.readFileSync(process.argv[2]).toString();
const names = fs.readFileSync(process.argv[3]).toString();
for (let config of FULL_MATRIX) {
if (config.rust === undefined) {
config.rust = 'default';
}
}
if (process.argv[4] == 'true') {
console.log(JSON.stringify(await shard(FULL_MATRIX), undefined, 2));
return;
}
const filtered = FULL_MATRIX.filter(config => {
if (config.isa && names.includes(`cranelift/codegen/src/isa/${config.isa}`)) {
return true;
}
if (names.includes(`cranelift/filetests/filetests/runtests`)) {
if (config.isa !== undefined)
return true;
}
if (config["32-bit"] === true) {
if (names.includes("pulley"))
return true;
if (names.includes("fiber"))
return true;
}
if (config.filter && commits.includes(`prtest:${config.filter}`)) {
return true;
}
return false;
});
if (filtered.length > 0) {
console.log(JSON.stringify(await shard(filtered), undefined, 2));
return;
}
console.log(JSON.stringify(await shard(FAST_MATRIX), undefined, 2));
}
main()