also looking at this
fix(build): select the core Zig project explicitly
#383
4 files
+44
-2
| @@ -192,6 +192,9 @@ jobs: | ||
| 192 | 192 | # including its adjacent standard library on Windows. |
| 193 | 193 | run: bun run build:core |
| 194 | 194 | |
| 195 | - name: Verify pinned compiler core project selection | |
| 196 | run: bun scripts/verify-zig-core-project.ts | |
| 197 | ||
| 195 | 198 | - name: Stage pinned WebView2 loader |
| 196 | 199 | shell: pwsh |
| 197 | 200 | run: | |
| @@ -0,0 +1,30 @@ | ||
| 1 | import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs' | |
| 2 | import { join, resolve } from 'node:path' | |
| 3 | import { resolveZig } from './zig' | |
| 4 | ||
| 5 | const source = resolve(import.meta.dir, '..') | |
| 6 | const zig = resolveZig(source) | |
| 7 | console.log('Tracked core project:', JSON.stringify({ file: join(source, 'packages/zig/build.zig'), exists: existsSync(join(source, 'packages/zig/build.zig')) })) | |
| 8 | // Keep the fixture on the checkout's volume. Hosted Windows keeps the | |
| 9 | // checkout on D: and the system temporary directory/compiler cache on C:. | |
| 10 | const root = mkdtempSync(join(source, '.zig-core-project-')) | |
| 11 | const core = join(root, 'packages', 'zig') | |
| 12 | try { | |
| 13 | mkdirSync(core, { recursive: true }) | |
| 14 | writeFileSync(join(root, 'pantry.lock'), readFileSync(join(source, 'pantry.lock'))) | |
| 15 | writeFileSync(join(root, 'package.json'), JSON.stringify({ version: '1.2.3' })) | |
| 16 | writeFileSync(join(root, 'build.zig'), 'const std=; pub fn build(b:*std.Build) void {_=b.standardOptimizeOption(.{});}\n') | |
| 17 | writeFileSync(join(core, 'build.zig'), 'const std=; pub fn build(b:*std.Build) void {_=b.standardOptimizeOption(.{}); const version=b.option([]const u8,"version","version") orelse "missing"; std.debug.print("PROJECT_VERSION={s}\\n",.{version});}\n') | |
| 18 | const env = { ...process.env, CRAFT_ZIG: zig.path } | |
| 19 | const runner = join(root, 'runner.ts') | |
| 20 | writeFileSync(runner, `import {runZig} from ${JSON.stringify(join(source, 'scripts/zig.ts'))};process.exitCode=runZig(${JSON.stringify(root)},['--core','--versioned','build']);\n`) | |
| 21 | const result = Bun.spawnSync([process.execPath, runner], { cwd: root, env, stdout: 'pipe', stderr: 'pipe' }) | |
| 22 | console.log(result.stdout.toString(), result.stderr.toString()) | |
| 23 | // The root wrapper rejects -Dversion. A successful configure therefore | |
| 24 | // proves core selection even when Zig reuses its cached configuration. | |
| 25 | if (result.exitCode !== 0) | |
| 26 | throw new Error('The actual pinned compiler did not configure the selected core project with its package version.') | |
| 27 | } | |
| 28 | finally { | |
| 29 | rmSync(root, { recursive: true, force: true }) | |
| 30 | } | |
| @@ -80,7 +80,9 @@ test('fails early for absent executables, invalid lock versions, and invalid com | ||
| 80 | 80 | test('forwards arguments, core working directory, package version and compiler exit status', () => { |
| 81 | 81 | const f = fixture() |
| 82 | 82 | expect(runZig(f.root, ['--core', '--versioned', 'build', '-Doptimize=ReleaseSafe', '-Dfoo=a b'], f.env)).toBe(23) |
| 83 | expect(JSON.parse(readFileSync(f.env.ZIG_TEST_LOG, 'utf8'))).toEqual({ cwd: join(f.root, 'packages/zig'), args: ['build', '-Doptimize=ReleaseSafe', '-Dfoo=a b', '-Dversion=1.2.3'] }) | |
| 83 | expect(JSON.parse(readFileSync(f.env.ZIG_TEST_LOG, 'utf8'))).toEqual({ cwd: join(f.root, 'packages/zig'), args: ['build', '--build-file', join(f.root, 'packages/zig/build.zig'), '-Doptimize=ReleaseSafe', '-Dfoo=a b', '-Dversion=1.2.3'] }) | |
| 84 | expect(runZig(f.root, ['--core', 'fmt', 'src/'], f.env)).toBe(23) | |
| 85 | expect(JSON.parse(readFileSync(f.env.ZIG_TEST_LOG, 'utf8'))).toEqual({ cwd: join(f.root, 'packages/zig'), args: ['fmt', 'src/'] }) | |
| 84 | 86 | expect(runZig(f.root, ['fmt', 'src/'], f.env)).toBe(23) |
| 85 | 87 | expect(JSON.parse(readFileSync(f.env.ZIG_TEST_LOG, 'utf8'))).toEqual({ cwd: f.root, args: ['fmt', 'src/'] }) |
| 86 | 88 | }) |
| @@ -59,10 +59,17 @@ export function runZig(root: string, args: string[], env: NodeJS.ProcessEnv = pr | ||
| 59 | 59 | const { version } = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) |
| 60 | 60 | command.push(`-Dversion=${version}`) |
| 61 | 61 | } |
| 62 | if (core && command[0] === 'build') { | |
| 63 | // Select the core project explicitly. A monorepo has another build.zig | |
| 64 | // at its root; compiler build discovery must not select that wrapper. | |
| 65 | command.splice(1, 0, '--build-file', join(root, 'packages/zig/build.zig')) | |
| 66 | } | |
| 62 | 67 | const zig = resolveZig(root, env) |
| 68 | const cwd = core ? join(root, 'packages/zig') : root | |
| 63 | 69 | console.error(`Zig ${zig.version}: ${zig.path}${zig.overridden ? ' (explicit unpinned override)' : ''}`) |
| 70 | console.error(`Zig project directory: ${cwd}`) | |
| 64 | 71 | const result = Bun.spawnSync([zig.path, ...command], { |
| 65 | cwd: core ? join(root, 'packages/zig') : root, | |
| 72 | cwd, | |
| 66 | 73 | env, |
| 67 | 74 | stdin: 'inherit', |
| 68 | 75 | stdout: 'inherit', |