Skip to content

Appa v2.1.0 (Stable)

Choose a tag to compare

@ApparentlyPlus ApparentlyPlus released this 18 Aug 18:18
· 10 commits to main since this release

This update fixes a crucial correctness bug in process/thread launching plus a related C-name collision gap, bringing the compiler to v2.1.0:

  1. Fixed process/thread launching for every build shape but the split kernel+user one. appa build only ever emitted the generated launcher (uapps, which creates each process and spawns its threads) into umain.c, which is produced solely when a build has both a kernel realm and a user realm. A Hosted build, or a kernel-only build, that declared a process with threads compiled cleanly, required none of the proc-create/thread-spawn intrinsics, and then silently did nothing at runtime - the threads were emitted, fully typed and reachable, but never started. Layout.Compose now emits the launcher call into program.c and kernel-only kmain.c as well, Pipeline's capability probe no longer gates the required intrinsics behind "both realms present," and a new end-to-end test spawns real threads through a Hosted build and checks their output, so this can't regress silently again.

  2. Fixed the G091 ("process declares no threads") check being skipped entirely on the Hosted target. The validation loop that reports it lived textually after the Hosted branch's early return, so a Hosted build with an empty process got no diagnostic at all. Hoisted the check above the target branch so it runs for both targets uniformly.

  3. Fixed struct member names never receiving the same C-keyword rename locals and parameters already get. A class field, a union variant, or a variant's payload field named after a C keyword or standard macro (e.g. register, inline, extern, restrict, typedef) was emitted verbatim into the generated struct, producing a C compile failure the Gata source gave no indication of. Mangler.Member now applies the same trailing-underscore rename at every emission site - struct declarations, field/payload access, retain/release calls, generated equality - and ManglingCollisionTests now round-trips six of the sharper C keywords (including errno and stdout, which are macros rather than keywords on some libcs) through a real C compiler.

  4. Added diagnostic G102 for the one name that rename can't rescue: an @extern declaration, which is emitted verbatim so the linker can find it. Declaring one under a C-reserved name now fails fast at compile time instead of failing silently at link time.

  5. Fixed the GatOS build never copying the linked kernel binary to the project's build/ directory, and the ISO there being named after GRUB's internal staging name rather than the project. Both artifacts - <name>.iso and <name>.bin - are now copied out under the project's name, sanitized into a safe filename stem, with the CLI's summary line listing both.

  6. Gave every emitted thread entry a forward declaration alongside its definition, closing a latent "used before its declaration" gap in the generated C now that a launcher can reference a thread from earlier in the same translation unit.

Installation

For setting up Appa in your own machine, grab one of the following executables depending on the platform and run appa install:

  • Windows: appa-win.exe
  • Linux: appa-linux
  • MacOS on ARM (Apple Silicon): appa-amac
  • MacOS on Intel (Legacy x64): appa-imac