The compiler's post-IR role shrinks to: codegen -> invoke the build callback. There is NO Zig auto-emit / auto-link anymore; emit + link are sx-called actions. - emit_object() is now an ACTION (verify + emit via a host BuildHooks vtable), returning the object path. New query primitives build_output/build_target/ build_frameworks/build_flags (data reads from the merged BuildConfig). - library/modules/build.sx imports compiler.sx and defines default_pipeline: emit_object -> gather c_object_paths -> link(objs, output, libs, fws, flags, target). The std<->build import cycle is handled by the resolver. - The compiler FORCE-LOWERS default_pipeline (well-known name) and AUTO-INVOKES it post-codegen when no on_build/set_post_link_callback override was registered (driver's final fallback: invokeByName default_pipeline). - Prelude-less programs (e.g. asm tests) don't import build.sx, so the BUILD path auto-imports modules/build.sx (idempotent if already transitive) so default_pipeline is always available. JIT sx run is untouched (emits in-process). - Removed the build cache short-circuits (incompatible with the always-run sx driver; a future cache can live in default_pipeline). Benign 37-.ir churn (build.sx grew); zero behavior changes (verified diff is .ir-only). 705/0 both gates.
35 lines
2.1 KiB
Plaintext
35 lines
2.1 KiB
Plaintext
// The comptime `compiler` library — the low-level compiler-API surface.
|
|
//
|
|
// These primitives run in the comptime evaluator (`abi(.compiler)`), serviced by
|
|
// `comptime_vm.callCompilerFn`. They are the building blocks of the sx-driven
|
|
// build pipeline (Phase 5); the default `build` implementation that orchestrates
|
|
// them lives in `modules/build.sx`. They are reached from the post-link build
|
|
// driver (a callback registered via `set_post_link_callback`), which always runs
|
|
// on the comptime VM (`core.invokeByFuncId`) — the VM, unlike the legacy
|
|
// interpreter, can allocate/grow the `List`s the driver builds (issue 0141).
|
|
#import "modules/std.sx";
|
|
|
|
// The C companion object files for this build (`#import c { #source ... }`,
|
|
// compiled to `.o`) and the `#library` link names. The sx driver passes them to
|
|
// the linker. Answered from the compiler's accumulated build state.
|
|
c_object_paths :: () -> List(string) abi(.compiler);
|
|
link_libraries :: () -> List(string) abi(.compiler);
|
|
|
|
// Verify + emit the codegen'd module to its object file; returns the path. An
|
|
// ACTION — the compiler no longer auto-emits; the sx driver calls this.
|
|
emit_object :: () -> string abi(.compiler);
|
|
|
|
// Build-config metadata the sx driver passes to `link` (the merged CLI + `#run`
|
|
// build config the compiler accumulated for this build).
|
|
build_output :: () -> string abi(.compiler); // the output binary path
|
|
build_target :: () -> string abi(.compiler); // the target triple ("" = host)
|
|
build_frameworks :: () -> List(string) abi(.compiler); // `-framework` names
|
|
build_flags :: () -> List(string) abi(.compiler); // extra link flags
|
|
|
|
// Link `objects` into `output`, with the given libraries / frameworks / link
|
|
// flags / target triple. The one genuine ACTION primitive — the compiler keeps
|
|
// the proven linker (Option B); the sx driver orchestrates. Not fallible (the
|
|
// build callback isn't): a link failure fails the build directly.
|
|
link :: (objects: List(string), output: string, libraries: List(string),
|
|
frameworks: List(string), flags: List(string), target: string) abi(.compiler);
|