mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-14 04:39:43 +08:00
* Expand LLVM native output targets - Add owned helper and runtime-pack contracts for macOS x64, Linux glibc/musl, Windows x64, and WASI. - Generalize LLVM target selection, package validation, linker plans, and release/CI matrices. - Document linker boundaries and add focused native-output and runtime-pack coverage. * Pin Windows LLVM helper CI to VS 2022 The official LLVM archive needs the Visual Studio 2022 CMake generator, which is not guaranteed by windows-latest. * Align bootstrap cache with LLVM runtime-pack builds Use the same target-specific helper and linker identity before and after compiler loading so routed executable cache hits remain lightweight. * Install Windows LLVM CI tools with Chocolatey windows-2022 includes Visual Studio but not winget; use its available Chocolatey bootstrap for CMake and Ninja. * Prevent Zig version probes from leaving runtime-pack objects Run runtime-pack compiler version probes in a private temporary directory and remove the accidental tracked WASI a.o file. * Use 7-Zip for Windows LLVM setup Extract the official LLVM development archive with two-stage 7-Zip instead of Windows tar.exe, which timed out while materializing the toolchain tree. * Define ssize_t for the MSVC runtime pack Clang's MSVC target does not expose POSIX ssize_t through sys/types.h; define the pointer-sized runtime type without affecting MinGW. * Build the Windows runtime pack with Zig Use the MinGW-compatible Windows sysroot required by the runtime while retaining COFF helper output and installing Zig in the Windows native CI lane. * Give macOS LLVM differential shard time to finish Shard 1 passed its setup and focused contracts but was cancelled during its cold LLVM differential slice at the 20-minute job limit.
36 lines
1.7 KiB
JavaScript
36 lines
1.7 KiB
JavaScript
import { readFile, writeFile } from "node:fs/promises";
|
|
import { execFile } from "node:child_process";
|
|
import { promisify } from "node:util";
|
|
|
|
const run = promisify(execFile);
|
|
const globalHeader = "!<arch>\n";
|
|
const memberHeaderSize = 60;
|
|
|
|
function replaceField(bytes, offset, width, value) {
|
|
bytes.write(value.padEnd(width, " "), offset, width, "ascii");
|
|
}
|
|
|
|
async function normalizeMetadata(output) {
|
|
const bytes = await readFile(output);
|
|
if (bytes.subarray(0, globalHeader.length).toString("ascii") !== globalHeader) throw new Error(`archiver produced an invalid archive: ${output}`);
|
|
let offset = globalHeader.length;
|
|
while (offset < bytes.length) {
|
|
const end = offset + memberHeaderSize;
|
|
if (end > bytes.length || bytes.subarray(offset + 58, end).toString("ascii") !== "`\n") throw new Error(`archiver produced a malformed member header: ${output}`);
|
|
const size = Number(bytes.subarray(offset + 48, offset + 58).toString("ascii").trim());
|
|
if (!Number.isSafeInteger(size) || size < 0 || end + size > bytes.length) throw new Error(`archiver produced an invalid member size: ${output}`);
|
|
replaceField(bytes, offset + 16, 12, "0");
|
|
replaceField(bytes, offset + 28, 6, "0");
|
|
replaceField(bytes, offset + 34, 6, "0");
|
|
replaceField(bytes, offset + 40, 8, "100644");
|
|
offset = end + size + (size % 2);
|
|
}
|
|
if (offset !== bytes.length) throw new Error(`archiver produced a truncated archive: ${output}`);
|
|
await writeFile(output, bytes);
|
|
}
|
|
|
|
export async function createDeterministicArchive(archiver, output, objects, args = []) {
|
|
await run(archiver, [...args, "rcs", output, ...objects], { env: { ...process.env, ZERO_AR_DATE: "1" } });
|
|
await normalizeMetadata(output);
|
|
}
|