a day ago
- Build systems are tools that define and execute transformations from input to output, with caching to avoid redundant work.
- Rules (or steps) form a dependency graph; outputs are cached and invalidated when inputs change, enabling incremental builds.
- Build systems can be inter-process (spawning processes) or intra-process (function calls), and their dependency graphs can be applicative (static) or monadic (dynamic).
- Key concepts include soundness (same result as full build), minimality (rerun only necessary rules), early cutoff, and hermeticity (no system dependencies).
- Deterministic and reproducible builds are important for reliable caching and remote caching, which is often content-addressed.
- Meta-build systems (e.g., CMake) separate configuration from build steps, and advanced systems integrate with virtual file systems or tracing for intra-process builds.
- Build systems extend beyond compilers to tools like GitHub Actions, static site generators, and spreadsheets.