Complete task002 through task016 across cache correctness, editor lifecycle, C boundaries, build and release governance, dictionary provenance, performance, interactive workflows, tests, documentation, and final cleanup.
58 lines
2.0 KiB
Markdown
58 lines
2.0 KiB
Markdown
# Build Intent Must Be a Named Profile, Not an Ambient Flag
|
|
|
|
## Context
|
|
|
|
The default Makefile mixed release optimization with
|
|
`-march=native -flto`, so an ordinary artifact could depend on the build
|
|
host. The interactive Emacs command interpolated the checkout path into
|
|
`cd PATH && make`, handing quoting and metacharacter semantics to a shell.
|
|
Its one-use callback wrapper also inferred success from sentinel text rather
|
|
than the exit status.
|
|
|
|
## Decision
|
|
|
|
Name build intent explicitly: `portable` is the default, while `native`,
|
|
`debug`, and `sanitize` opt into their distinct flags. CI and documentation
|
|
use the same vocabulary.
|
|
|
|
The interactive command validates the profile, binds `default-directory`,
|
|
and calls `make-process` with `("/path/to/make" "PROFILE=name")`. Its async
|
|
boundary checks process status and exit code; successful builds reload and
|
|
clean the output buffer, while failures retain and display diagnostics.
|
|
|
|
## Alternatives Rejected
|
|
|
|
### Quote the shell string
|
|
|
|
Correct quoting differs by shell and Windows command processor, and no
|
|
shell feature is needed for one executable plus one argument.
|
|
|
|
### Keep native optimization as the default
|
|
|
|
That makes release portability depend on undocumented build-host CPU
|
|
features and toolchain LTO compatibility.
|
|
|
|
### Preserve `DEBUG=1` as an alias
|
|
|
|
Two vocabularies for one workflow create drift. The repository is not
|
|
maintaining a released build-flag API.
|
|
|
|
## Consequences
|
|
|
|
- Ordinary artifacts are portable by construction.
|
|
- Benchmark builds remain explicitly machine-specific.
|
|
- Whitespace/metacharacters in checkout paths are data, not syntax.
|
|
- Async failures preserve the evidence users need.
|
|
|
|
## Verification
|
|
|
|
The old command failed both process/profile controls. The new command passes
|
|
2/2, all four profiles compile warning-free, the real interactive portable
|
|
build exits 0 and loads C 1.6, and a copied source path containing spaces
|
|
builds successfully.
|
|
|
|
## Rollback
|
|
|
|
Restore the shell command and mixed default flags. No saved data needs
|
|
migration, but existing native artifacts should not be relabeled portable.
|