depot/third_party/nixpkgs/doc/build-helpers/special/checkpoint-build.section.md
Default email 587713944a Project import generated by Copybara.
GitOrigin-RevId: 6143fc5eeb9c4f00163267708e26191d1e918932
2024-04-21 17:54:59 +02:00

1.5 KiB

pkgs.checkpointBuildTools

pkgs.checkpointBuildTools provides a way to build derivations incrementally. It consists of two functions to make checkpoint builds using Nix possible.

For hermeticity, Nix derivations do not allow any state to be carried over between builds, making a transparent incremental build within a derivation impossible.

However, we can tell Nix explicitly what the previous build state was, by representing that previous state as a derivation output. This allows the passed build state to be used for an incremental build.

To change a normal derivation to a checkpoint based build, these steps must be taken:

  • apply prepareCheckpointBuild on the desired derivation, e.g.
{
  checkpointArtifacts = (pkgs.checkpointBuildTools.prepareCheckpointBuild pkgs.virtualbox);
}
  • change something you want in the sources of the package, e.g. use a source override:
{
  changedVBox = pkgs.virtualbox.overrideAttrs (old: {
    src = path/to/vbox/sources;
  });
}
  • use mkCheckpointBuild changedVBox checkpointArtifacts
  • enjoy shorter build times

Example

{ pkgs ? import <nixpkgs> {} }:
let
  inherit (pkgs.checkpointBuildTools)
    prepareCheckpointBuild
    mkCheckpointBuild
    ;
  helloCheckpoint = prepareCheckpointBuild pkgs.hello;
  changedHello = pkgs.hello.overrideAttrs (_: {
    doCheck = false;
    patchPhase = ''
      sed -i 's/Hello, world!/Hello, Nix!/g' src/hello.c
    '';
  });
in mkCheckpointBuild changedHello helloCheckpoint