diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # cpkg
 
+## 0.2.3.1
+
+  * Now works with Dhall 1.25.0 on a sufficiently new GHC
+
 ## 0.2.3.0
 
   * Add `garbage-collect` subcommand
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
 # cpkg
 
-[![Build Status](https://travis-ci.org/vmchale/cpkg.svg?branch=master)](https://travis-ci.org/vmchale/cpkg)
-[![Windows build status](https://ci.appveyor.com/api/projects/status/github/vmchale/cpkg?svg=true)](https://ci.appveyor.com/project/vmchale/cpkg)
 [![Hackage CI](https://matrix.hackage.haskell.org/api/v2/packages/cpkg/badge)](https://matrix.hackage.haskell.org/package/cpkg)
 [![Hackage](https://img.shields.io/hackage/v/cpkg.svg)](http://hackage.haskell.org/package/cpkg)
 [![Dependencies of latest version on Hackage](https://img.shields.io/hackage-deps/v/cpkg.svg)](https://hackage.haskell.org/package/cpkg)
diff --git a/cpkg.cabal b/cpkg.cabal
--- a/cpkg.cabal
+++ b/cpkg.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.18
 name: cpkg
-version: 0.2.3.0
+version: 0.2.3.1
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2018-2019 Vanessa McHale
@@ -72,7 +72,6 @@
     build-depends:
         base >=4.3 && <5,
         containers >=0.6.0.0,
-        dhall >=1.23.0,
         text -any,
         temporary -any,
         bytestring -any,
@@ -98,6 +97,13 @@
         libarchive >=1.0.4.0,
         dir-traverse >=0.2.1.0,
         composition-prelude >=1.5.2.0
+
+    if impl(ghc <8.4)
+        build-depends:
+            dhall >=1.23.0 && <1.25.0
+    else
+        build-depends:
+            dhall >=1.23.0
 
     if (flag(development) && impl(ghc <=8.2))
         ghc-options: -Werror
diff --git a/dhall/cpkg-prelude.dhall b/dhall/cpkg-prelude.dhall
--- a/dhall/cpkg-prelude.dhall
+++ b/dhall/cpkg-prelude.dhall
@@ -352,10 +352,15 @@
     concatMapText Text (λ(dir : Text) → "${dir}:") binDirs
 in
 
+let unixPath =
+  λ(binDirs : List Text) →
+    { var = "PATH", value = mkPathVar binDirs ++ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" }
+in
+
 let defaultPath =
   λ(cfg : types.BuildVars) →
     if isUnix cfg.buildOS
-      then [ { var = "PATH", value = mkPathVar cfg.binDirs ++ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" } ] : List types.EnvVar
+      then [ unixPath cfg.binDirs ] : List types.EnvVar
       else [] : List types.EnvVar -- FIXME: handle non-unix case
 in
 
@@ -1235,4 +1240,5 @@
 , configureWithPatches = configureWithPatches
 , configureWithPatch  = configureWithPatch
 , installPrefix       = installPrefix
+, unixPath            = unixPath
 }
diff --git a/pkgs/pkg-set.dhall b/pkgs/pkg-set.dhall
--- a/pkgs/pkg-set.dhall
+++ b/pkgs/pkg-set.dhall
@@ -441,7 +441,7 @@
 let valgrind =
   λ(v : List Natural) →
     prelude.simplePackage { name = "valgrind", version = v } ⫽
-      { pkgUrl = "http://www.valgrind.org/downloads/valgrind-${prelude.showVersion v}.tar.bz2"
+      { pkgUrl = "https://sourceware.org/pub/valgrind/valgrind-${prelude.showVersion v}.tar.bz2"
       , installCommand = prelude.installWithBinaries [ "bin/valgrind" ]
       , configureCommand = prelude.configureMkExes [ "auxprogs/make_or_upd_vgversion_h" ]
       }
@@ -770,6 +770,7 @@
   λ(v : List Natural) →
     prelude.makeGnuExe { name = "autoconf", version = v } ⫽
       { pkgBuildDeps = [ prelude.lowerBound { name =  "m4", lower = [1,4,16] } ]
+      -- m4 runDep?
       , installCommand = prelude.installWithBinaries [ "bin/autoconf", "bin/autoheader", "bin/autom4te", "bin/autoreconf" ]
       }
 in
@@ -1344,13 +1345,13 @@
 in
 
 let util-linux =
-  λ(x : { version : List Natural, patch : Natural }) →
+  λ(x : { version : List Natural }) →
     let versionString = prelude.showVersion x.version
     in
-    let fullVersion = versionString ++ "." ++ Natural/show x.patch
+    let fullVersion = versionString
     in
 
-    prelude.simplePackage { name = "util-linux", version = prelude.fullVersion x } ⫽
+    prelude.simplePackage { name = "util-linux", version = x.version } ⫽
       { pkgUrl = "https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v${versionString}/util-linux-${fullVersion}.tar.xz"
       , configureCommand =
         λ(cfg : types.BuildVars) →
@@ -1381,11 +1382,13 @@
 
     prelude.ninjaPackage { name = "gobject-introspection", version = prelude.fullVersion x } ⫽
       { pkgUrl = "https://download.gnome.org/sources/gobject-introspection/${versionString}/gobject-introspection-${fullVersion}.tar.xz"
-      , pkgBuildDeps = [ prelude.unbounded "meson" ] -- prelude.unbounded "flex" "bison" ]
+      , pkgBuildDeps = [ prelude.unbounded "meson" ]
       , pkgDeps = [ prelude.lowerBound { name = "glib", lower = [2,58,0] } ]
       , installCommand =
           λ(cfg : types.BuildVars) →
-            [ prelude.mkExe "build/tools/g-ir-scanner" ]
+            [ prelude.mkExe "build/tools/g-ir-scanner"
+            , prelude.copyFile "build/gobject-introspection-1.0.pc" "lib/pkgconfig/gobject-introspection-1.0.pc"
+            ]
               # prelude.ninjaInstall cfg
       }
 in
@@ -2418,7 +2421,21 @@
 in
 
 let babl =
-  mkGimpPackage "babl"
+  λ(x : { version : List Natural, patch : Natural }) →
+    let versionString = prelude.showVersion x.version
+    in
+    let fullVersion = versionString ++ "." ++ Natural/show x.patch
+    in
+    prelude.simplePackage { name = "babl", version = prelude.fullVersion x } ⫽
+      { pkgUrl = "https://download.gimp.org/pub/babl/${versionString}/babl-${fullVersion}.tar.xz"
+      , pkgBuildDeps = [ prelude.unbounded "autoconf"
+                       , prelude.unbounded "automake"
+                       , prelude.unbounded "libtool"
+                       , prelude.unbounded "pkg-config"
+                       ]
+      , pkgDeps = [ prelude.unbounded "lcms2" ]
+      , configureCommand = prelude.autogenConfigure
+      }
 in
 
 let gegl =
@@ -2429,6 +2446,7 @@
                   , prelude.unbounded "json-glib"
                   ]
       , configureCommand = prelude.preloadCfg
+      , pkgStream = False
       }
 in
 
@@ -2446,6 +2464,7 @@
                   , prelude.unbounded "libjpeg-turbo"
                   , prelude.unbounded "libpng"
                   ]
+      , pkgBuildDeps = [ prelude.unbounded "gettext" ]
       , installCommand =
           prelude.ninjaInstallWithPkgConfig (prelude.mesonMoves [ "json-glib-1.0.pc" ])
       }
@@ -3101,24 +3120,25 @@
       }
 in
 
+-- LLVM builds run out of RAM on my 64GB machine
+let slowBuild =
+  λ(cfg : types.BuildVars) →
+    [ prelude.call { program = "cmake"
+                    , arguments = [ "--build", ".", "--config", "Release", "--", "-j", "3" ]
+                    , environment = prelude.defaultEnv
+                    , procDir = Some "build"
+                    }
+    ]
+in
+
 let llvm =
   λ(v : List Natural) →
-    let llvmBuild =
-      λ(cfg : types.BuildVars) →
-        [ prelude.call { program = "cmake"
-                       , arguments = [ "--build", ".", "--config", "Release", "--", "-j", "3" ]
-                       , environment = prelude.defaultEnv
-                       , procDir = Some "build"
-                       }
-        ]
-    in
-
     let versionString = prelude.showVersion v in
     prelude.simplePackage { name = "llvm", version = v } ⫽ prelude.cmakePackage ⫽
-      { pkgUrl = "http://releases.llvm.org/${versionString}/llvm-${versionString}.src.tar.xz"
+      { pkgUrl = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${versionString}/llvm-${versionString}.src.tar.xz"
       , pkgSubdir = "llvm-${versionString}.src"
       , pkgStream = False
-      , buildCommand = llvmBuild
+      , buildCommand = slowBuild
       }
 in
 
@@ -3545,6 +3565,96 @@
       }
 in
 
+let glib-networking =
+  λ(x : { version : List Natural, patch : Natural }) →
+    let versionString = prelude.showVersion x.version
+    in
+    let fullVersion = versionString ++ "." ++ Natural/show x.patch
+    in
+
+    prelude.ninjaPackage { name = "glib-networking", version = prelude.fullVersion x } ⫽
+      { pkgUrl = "http://ftp.gnome.org/pub/gnome/sources/glib-networking/${versionString}/glib-networking-${fullVersion}.tar.xz"
+      , pkgBuildDeps = [ prelude.unbounded "pkg-config"
+                       , prelude.unbounded "gettext"
+                       ]
+      , pkgDeps = [ prelude.unbounded "glib"
+                  , prelude.unbounded "gnutls"
+                  ]
+      }
+in
+
+let libwebp =
+  λ(v : List Natural) →
+    prelude.simplePackage { name = "libwebp", version = v } ⫽
+      { pkgUrl = "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.3.tar.gz" }
+in
+
+let rustc =
+  λ(v : List Natural) →
+    let versionString = prelude.showVersion v in
+    prelude.simplePackage { name = "rustc", version = v } ⫽
+      -- FIXME: other architectures
+      { pkgUrl = "https://static.rust-lang.org/dist/rust-${versionString}-x86_64-unknown-linux-gnu.tar.gz"
+      , pkgSubdir = "rust-${versionString}-x86_64-unknown-linux-gnu"
+      , configureCommand = prelude.doNothing
+      , buildCommand = prelude.doNothing
+      , installCommand =
+          λ(cfg : types.BuildVars) →
+            [ prelude.call (prelude.defaultCall ⫽ { program = "./install.sh"
+                                                  , arguments = [ "--prefix=${cfg.installDir}", "--disable-ldconfig" ]
+                                                  })
+            ]
+      , pkgStream = False
+      }
+in
+
+let librsvg =
+  λ(x : { version : List Natural, patch : Natural }) →
+    mkGnomeSimple "librsvg" x ⫽
+      { pkgBuildDeps = [ prelude.lowerBound { name = "rustc", lower = [1,16,0] }
+                       , prelude.unbounded "pkg-config"
+                       ]
+      , pkgDeps = [ prelude.lowerBound { name = "cairo", lower = [1,16,0] }
+                  , prelude.lowerBound { name = "libxml2", lower = [2,9,0] }
+                  , prelude.lowerBound { name = "libcroco", lower = [0,6,1] }
+                  , prelude.unbounded "pango"
+                  , prelude.lowerBound { name = "gdk-pixbuf", lower = [2,20] }
+                  , prelude.unbounded "gobject-introspection"
+                  , prelude.lowerBound { name = "glib", lower = [2,10,0] }
+                  ]
+      }
+in
+
+let ats =
+  λ(v : List Natural) →
+
+    let versionString = prelude.showVersion v in
+
+    let atsBuild =
+      λ(cfg : types.BuildVars) →
+        let buildDir = cfg.currentDir ++ "/ATS2-Postiats-gmp-${versionString}"
+        in
+
+        [ prelude.call (prelude.defaultCall ⫽ { program = prelude.makeExe cfg.buildOS
+                                              , arguments = [ "CFLAGS=${(prelude.mkCFlags cfg).value} -I${buildDir}/src/CBOOT/ccomp/runtime -I${buildDir}/src/CBOOT"
+                                                            , "LDFLAGS='${(prelude.mkLDFlags cfg.linkDirs).value}'"
+                                                            ]
+                                              , environment = Some (prelude.buildEnv cfg)
+                                              })
+        ]
+    in
+
+    prelude.simplePackage { name = "ats", version = v } ⫽
+      { pkgUrl = "http://ats-lang.sourceforge.net/IMPLEMENT/Postiats/ATS2-Postiats-${versionString}.tgz"
+      , pkgSubdir = "ATS2-Postiats-gmp-${versionString}"
+      , pkgDeps = [ prelude.unbounded "gmp" ]
+      , buildCommand = atsBuild
+      , installCommand = prelude.installWithBinaries [ "bin/patsopt" ]
+      , pkgStream = False
+      }
+in
+
+-- https://downloads.haskell.org/~ghc/8.6.5/ghc-8.6.5-x86_64-deb9-linux.tar.xz
 -- http://www.linuxfromscratch.org/lfs/view/development/chapter06/findutils.html
 -- TODO: musl-ghc?
 -- https://hub.darcs.net/raichoo/hikari
@@ -3558,7 +3668,8 @@
 , at-spi-atk { version = [2,33], patch = 2 }
 , at-spi-core { version = [2,33], patch = 2 }
 , atk { version = [2,33], patch = 3 }
-, babl { version = [0,1], patch = 60 }
+, ats [0,3,13]
+, babl { version = [0,1], patch = 68 }
 , binutils [2,32]
 , bison [3,3,1]
 , blas [3,8,0]
@@ -3566,7 +3677,7 @@
 , cairo [1,16,0]
 , chickenScheme [5,0,0]
 , cimg [2,6,6]
-, cmake { version = [3,13], patch = 4 }
+, cmake { version = [3,15], patch = 1 }
 , compositeproto [0,4]
 , coreutils [8,31]
 , ctags [5,8]
@@ -3596,14 +3707,15 @@
 , gcc [9,1,0]
 , gdb [8,2]
 , gdk-pixbuf { version = [2,38], patch = 1 }
-, gegl { version = [0,4], patch = 12 }
+, gegl { version = [0,4], patch = 16 }
 , gettext [0,20,1]
 , gexiv2 { version = [0,12], patch = 0 }
 , gperf [3,1]
 , gperftools [2,7]
 , giflib [5,1,4]
 , git [2,19,2]
-, glib { version = [2,60], patch = 4 }
+, glib { version = [2,61], patch = 1 }
+, glib-networking { version = [2,61], patch = 2 }
 , glproto [1,4,17]
 , glu [9,0,0]
 , json-glib { version = [1,4], patch = 4 }
@@ -3612,14 +3724,14 @@
 , gobject-introspection { version = [1,60], patch = 2 }
 , gnome-doc-utils { version = [0,20], patch = 10 }
 , gnupg [2,2,16]
-, gnutls { version = [3,6], patch = 8 }
+, gnutls { version = [3,6], patch = 9 }
 , graphviz [2,40,1]
 , grep [3,3]
 , gsl [2,5]
 , gtk2 { version = [2,24], patch = 32 }
-, gtk3 { version = [3,24], patch = 9 }
+, gtk3 { version = [3,24], patch = 10 }
 , gzip [1,9]
-, harfbuzz [2,5,1]
+, harfbuzz [2,5,3]
 , htop [2,2,0]
 , icu [64,2]
 , icu-le-hb [1,0,3]
@@ -3657,25 +3769,27 @@
 , libjpeg-turbo [2,0,2]
 , libksba [1,3,5]
 , libmypaint [1,3,0]
-, libnettle [3,4,1]
+, libnettle [3,5,1]
+, libopenjpeg [2,3,1]
+, libotf [0,9,16]
 , libpciaccess [0,14]
 , libpng [1,6,35]
 , libpsl [0,21,0]
 , libpthread-stubs [0,4]
-, libopenjpeg [2,3,1]
-, libotf [0,9,16]
 , libraw [0,19,2]
+, librsvg { version = [2,45], patch = 8 }
 , libsamplerate [0,1,9]
 , libselinux [2,8]
 , libsndfile [1,0,28]
 , libsepol [2,8]
 , libsodium [1,0,17]
-, libsoup { version = [2,67], patch = 1 }
+, libsoup { version = [2,67], patch = 3 }
 , libssh2 [1,8,0]
-, libtasn1 [4,13]
+, libtasn1 [4,14]
 , libtiff [4,0,10]
 , libtool [2,4,6]
 , libuv [1,24,0]
+, libwebp [1,0,3]
 , libSM [1,2,3]
 , libthai [0,1,28]
 , libX11 [1,6,8]
@@ -3691,7 +3805,7 @@
 , libXft [2,3,3]
 , libXi [1,7,10]
 , libXinerama [1,1,4]
-, libxml2 [2,9,8]
+, libxml2 [2,9,9]
 , libXmu [1,1,3]
 , libXpm [3,5,12]
 , libXScrnSaver [1,2,3]
@@ -3702,8 +3816,7 @@
 , libXt [1,2,0]
 , libXtst [1,2,3]
 , libXxf86vm [1,1,4]
-, llvm [8,0,0]
-, llvm [7,1,0] ⫽{ pkgName = "llvm-7.1" }
+, llvm [8,0,1]
 , lmdb [0,9,23]
 , lua [5,3,5]
 , lz4 [1,9,1]
@@ -3728,7 +3841,6 @@
 , nginx [1,15,7]
 , ninja [1,9,0]
 , node [10,15,1]
-, node [8,15,1] ⫽ { pkgName = "node8" }
 , npth [1,6]
 , nspr [4,20]
 , openblas [0,3,2]
@@ -3746,14 +3858,14 @@
 , phash [0,9,6]
 , pixman [0,38,4]
 , pkg-config [0,29,2]
-, poppler [0,77,0]
+, poppler [0,79,0]
 , postgresql [11,1]
 , protobuf [3,8,0]
 , pycairo [1,18,1]
 , pygobject { version = [2,28], patch = 7 }
 , pygtk { version = [2,24], patch = 0 }
 , python [2,7,16]
-, python [3,7,3]
+, python [3,7,4]
 , qrencode [4,0,2]
 , qt { version = [5,13], patch = 0 }
 , quazip [0,8,1]
@@ -3765,9 +3877,10 @@
 , recordproto [1,14,2]
 , renderproto [0,11,1]
 , ruby { version = [2,6], patch = 3 }
+, rustc [1,36,0]
 , scour [0,37]
 , scrnsaverproto [1,2,2]
-, sdl2 [2,0,9]
+, sdl2 [2,0,10]
 , sed [4,7]
 , shared-mime-info [1,10]
 , sqlite { year = 2018, version = [3,26,0] }
@@ -3778,12 +3891,12 @@
 , tesseract [4,0,0]
 , time [1,9]
 , unistring [0,9,10]
-, util-linux { version = [2,33], patch = 1 }
+, util-linux { version = [2,34] }
 , util-macros [1,19,2]
-, vala { version = [0,43], patch = 6 }
-, valgrind [3,14,0]
+, vala { version = [0,45], patch = 3 }
+, valgrind [3,15,0]
 , vim [8,1]
-, wayland [1,16,0]
+, wayland [1,17,0]
 , wget [1,20,3]
 , which [2,21]
 , xcb-proto [1,13]
diff --git a/src/Package/C/Build.hs b/src/Package/C/Build.hs
--- a/src/Package/C/Build.hs
+++ b/src/Package/C/Build.hs
@@ -181,6 +181,7 @@
     liftIO $ createDirectoryIfMissing True pkgDir
 
     withSystemTempDirectory "cpkg" $ \p -> do
+    -- diagnosticDirectory "cpkg" $ \p -> do
 
         putDiagnostic ("Setting up temporary directory in " ++ p)
 
diff --git a/src/Package/C/Build/Tree.hs b/src/Package/C/Build/Tree.hs
--- a/src/Package/C/Build/Tree.hs
+++ b/src/Package/C/Build/Tree.hs
@@ -67,11 +67,29 @@
                 includeDir = pkgDir </> "include"
                 dataDir = pkgDir </> "share"
                 binDir = pkgDir </> "bin"
-                links = linkDir64 : linkDir : ls
-                bins = binDir : bs
-                shares = dataDir : ds
 
-            -- TODO: do this for all of them?
+            binExists <- liftIO (doesDirectoryExist binDir)
+            let bins = if binExists
+                then binDir : bs
+                else bs
+
+            shareExists <- liftIO (doesDirectoryExist dataDir)
+            let shares = if shareExists
+                then dataDir : ds
+                else ds
+
+            linkExists <- liftIO (doesDirectoryExist linkDir)
+            link64Exists <- liftIO (doesDirectoryExist linkDir64)
+
+            let linkAppend = if linkExists
+                then (linkDir :)
+                else id
+            let link64Append = if link64Exists
+                then (linkDir64 :)
+                else id
+
+            let links = link64Append (linkAppend ls)
+
             includeExists <- liftIO (doesDirectoryExist includeDir)
             let includes = if includeExists
                 then includeDir : is
