Most mainstream programming languages have several build platforms available. Which one should you use? Which one will your mugle coworker hate you for? Build platforms generally strike a balance between "usability" (will nix-build succeed if npm build succeed?) and "incrementality" (will nix-build finish in the next hour after I tweaked a comment?). In this talk we look at the support for various languages and the nuances in their builds, from "fixed-output" builds (where the developer must update a hash on every code change) to "fully incremental" builds (where Nix rebuilds only as much as the language's own build tools). We will compare the different approaches used in the Nix community today, point out the general features of mainstream languages' build tools, and briefly talk about how "recursive Nix" can solve some of today's problems. In particular we will look at the some approaches in the Nix community today: Fixed-output derivation: any language Fixed-output derivation for dependencies: rustPlatform, python Code generation: carnix, yarn2nix, stack2nix, bundix, pypi2nix Package-set (snapshots) with upstream checksum database: haskellPackages Pure, lockfile-based: napalm, naersk File-level incremental: snack For each we'll look at the following metrics: * Is the platform consistent with the developer's workflow (and does it Just Work) * What level of incrementality does the platform provide * Does the platform work within the Nix sandbox * Does the platform use "Import From Derivation" * How much does the platform stress the Nix evaluator |