Skip to content
Drive the Nix build system using the Dhall configuration language
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
DhallBuild
Nix
dhall
.gitignore
ChangeLog.md
LICENSE
MemoIO.hs
README.md
Setup.hs
dhall-build.cabal
dhall-build.hs
hello.dhall
shell.nix

README.md

dhall-build

Exploring the intersection of the Nix build system (derivations, not the Nix language) and the Dhall configuration language.

dhall-build evaluates Dhall expressions essentially of the type ∀(output : Derivation → Text) → A. The special output function causes dhall-build to compile and build a Nix derivation, and returns the location in the Nix store as a result. Derivation's can be constructed either purely in Dhall or by calling nix-instantiate (effectively importing Nix expressions).

But what is Derivation? A Derivation is:

∀(Derivation : Type) → ({ arguments : List Text, exec : Text, name : Text } → Derivation) → ∀(eval-nix : Text → Derivation) → Derivation

That is to say, a Derivation is either constructed by a Dhall record (this is considered the "purely in Dhall" approach), or by running a Nix expression. Here's an example:

  λ(output : ./dhall/Derivation.dhall   Text)
     let derive = ./dhall/derive.dhall 
  
  in  let eval-nix = ./dhall/eval-nix.dhall 
  
  in  let bash = eval-nix "(import <nixpkgs> {}).bash"
  
  in  let script =
            eval-nix
            ''
            (import <nixpkgs> {}).writeText "script" "echo Hello > $out"
            ''
  
  in      "A greeting awaits you in "
      ++  output
          ( derive
            { name =
                "Hello"
            , exec =
                "${output bash}/bin/bash"
            , arguments =
                [ output script ] : List Text
            }
          )

Ignoring the first two let bindings, we see that we have a bash derivation which builds bash via Nix+Nixpkgs. Next, we add a text file to the store using pkgs.writeText from Nixpkgs again. Given these two derivations, we can compose them into a new derivation that calls bash and runs the given script. We do this at the end using output (to cause the output to be built) and derive (to construct the derivation).

Running this through dhall-build, we get:

$ ./dhall-build hello.dhall 
...
"A greeting awaits you in /nix/store/5wdbq6v6a28r523zz681bnbz9dnadilc-Hello"

Which is the input Dhall expression, but normalized under the application of output. And what's this about a greeting?

$ cat /nix/store/5wdbq6v6a28r523zz681bnbz9dnadilc-Hello
Hello

Splendid!

You can’t perform that action at this time.