Refs #4522, #4526, #4555. Retain producer-owned compiler output and cleanup markers through xcrun resolution and native failure projection. Keep physical preparation failures primary and preserve separate command deadline classification for interrupted preparation. Omitted output facts stay unknown; client close does not resolve foreign helper cleanup. Include CLI failure output in native regression reports. Validation: 87 focused tests passed. Broader 140-file run passed 1483 tests, skipped 109, and exposed three pre-existing deep-provider selection failures tracked in #4555. Static checks passed. Compiler faults use controlled Node fixtures; native Swift compiler faults and Windows execution were not verified. Other command consumers still need preparation-fact propagation.
69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
import { join } from "node:path";
|
|
import { writeFile } from "node:fs/promises";
|
|
|
|
import { describe, expect } from "vitest";
|
|
import { z } from "zod";
|
|
|
|
import { inspectMachoSchema } from "../../../src/domain/native/nativeInspection.js";
|
|
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
|
|
import { cliTest } from "../../support/cli/cliFixture.js";
|
|
|
|
const evidenceSchema = z.object({ normalized_result: inspectMachoSchema });
|
|
|
|
describe.skipIf(process.platform !== "darwin")(
|
|
"native Mach-O CLI linker options",
|
|
() => {
|
|
cliTest(
|
|
"retains every compiler-recorded linker option string in order",
|
|
async ({ cli, processes }) => {
|
|
const directory = await createTestTempDirectory("rea-linker-option-");
|
|
const source = join(directory, "options.c");
|
|
const object = join(directory, "options.o");
|
|
await writeFile(
|
|
source,
|
|
[
|
|
'__asm__(".linker_option \\"-framework\\", \\"Foundation\\"");',
|
|
'__asm__(".linker_option \\"-lz\\"");',
|
|
"int sample(void) { return 7; }",
|
|
"",
|
|
].join("\n"),
|
|
);
|
|
const compiled = await processes.run(
|
|
"/usr/bin/xcrun",
|
|
["clang", "-c", source, "-o", object],
|
|
{ timeoutMs: 30_000 },
|
|
);
|
|
expect(compiled.exitCode, compiled.stderr).toBe(0);
|
|
const result = await cli.run({
|
|
arguments: ["inspect-macho", object, "--json"],
|
|
environment: { REA_LOG_LEVEL: "silent" },
|
|
});
|
|
expect(result.exitCode, result.stdout + result.stderr).toBe(0);
|
|
const { load_commands: loadCommands } = evidenceSchema.parse(
|
|
result.json,
|
|
).normalized_result;
|
|
expect(loadCommands.exhaustive).toBe(true);
|
|
expect(
|
|
loadCommands.items
|
|
.filter((command) => command.kind === "LC_LINKER_OPTION")
|
|
.map(({ fields }) => fields),
|
|
).toEqual([
|
|
{
|
|
cmd: "LC_LINKER_OPTION",
|
|
cmdsize: 40,
|
|
count: 2,
|
|
"string #1": "-framework",
|
|
"string #2": "Foundation",
|
|
},
|
|
{
|
|
cmd: "LC_LINKER_OPTION",
|
|
cmdsize: 16,
|
|
count: 1,
|
|
"string #1": "-lz",
|
|
},
|
|
]);
|
|
},
|
|
);
|
|
},
|
|
);
|