diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # cpkg
 
+## 0.2.0.1
+
+  * Pass `-p0` option to `patch`
+
 ## 0.2.0.0
 
   * Support more MIPS architectures
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.0.0
+version: 0.2.0.1
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2018-2019 Vanessa McHale
diff --git a/pkgs/patches/m4.patch b/pkgs/patches/m4.patch
new file mode 100644
--- /dev/null
+++ b/pkgs/patches/m4.patch
@@ -0,0 +1,108 @@
+diff --color -u lib/fflush.c lib/fflush.c
+--- lib/fflush.c	2016-12-31 07:54:41.000000000 -0600
++++ lib/fflush.c	2019-05-24 15:43:00.800903010 -0500
+@@ -33,7 +33,7 @@
+ #undef fflush
+ 
+ 
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ 
+ /* Clear the stream's ungetc buffer, preserving the value of ftello (fp).  */
+ static void
+@@ -72,7 +72,7 @@
+ 
+ #endif
+ 
+-#if ! (defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */)
++#if ! (defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */)
+ 
+ # if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Android */
+@@ -148,7 +148,7 @@
+   if (stream == NULL || ! freading (stream))
+     return fflush (stream);
+ 
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ 
+   clear_ungetc_buffer_preserving_position (stream);
+ 
+diff --color -u lib/fpending.c lib/fpending.c
+--- lib/fpending.c	2016-12-31 07:54:41.000000000 -0600
++++ lib/fpending.c	2019-05-24 15:43:00.800903010 -0500
+@@ -32,7 +32,7 @@
+   /* Most systems provide FILE as a struct and the necessary bitmask in
+      <stdio.h>, because they need it for implementing getc() and putc() as
+      fast macros.  */
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+   return fp->_IO_write_ptr - fp->_IO_write_base;
+ #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Android */
+diff --color -u lib/fpurge.c lib/fpurge.c
+--- lib/fpurge.c	2016-12-31 07:54:41.000000000 -0600
++++ lib/fpurge.c	2019-05-24 15:43:00.800903010 -0500
+@@ -62,7 +62,7 @@
+   /* Most systems provide FILE as a struct and the necessary bitmask in
+      <stdio.h>, because they need it for implementing getc() and putc() as
+      fast macros.  */
+-# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++# if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+   fp->_IO_read_end = fp->_IO_read_ptr;
+   fp->_IO_write_ptr = fp->_IO_write_base;
+   /* Avoid memory leak when there is an active ungetc buffer.  */
+diff --color -u lib/freadahead.c lib/freadahead.c
+--- lib/freadahead.c	2016-12-31 07:54:41.000000000 -0600
++++ lib/freadahead.c	2019-05-24 15:43:00.800903010 -0500
+@@ -25,7 +25,7 @@
+ size_t
+ freadahead (FILE *fp)
+ {
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+   if (fp->_IO_write_ptr > fp->_IO_write_base)
+     return 0;
+   return (fp->_IO_read_end - fp->_IO_read_ptr)
+diff --color -u lib/freading.c lib/freading.c
+--- lib/freading.c	2016-12-31 07:54:41.000000000 -0600
++++ lib/freading.c	2019-05-24 15:43:00.800903010 -0500
+@@ -31,7 +31,7 @@
+   /* Most systems provide FILE as a struct and the necessary bitmask in
+      <stdio.h>, because they need it for implementing getc() and putc() as
+      fast macros.  */
+-# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++# if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+   return ((fp->_flags & _IO_NO_WRITES) != 0
+           || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
+               && fp->_IO_read_base != NULL));
+diff --color -u lib/fseeko.c lib/fseeko.c
+--- lib/fseeko.c	2016-12-31 07:54:41.000000000 -0600
++++ lib/fseeko.c	2019-05-24 15:43:00.800903010 -0500
+@@ -47,7 +47,7 @@
+ #endif
+ 
+   /* These tests are based on fpurge.c.  */
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+   if (fp->_IO_read_end == fp->_IO_read_ptr
+       && fp->_IO_write_ptr == fp->_IO_write_base
+       && fp->_IO_save_base == NULL)
+@@ -123,7 +123,7 @@
+           return -1;
+         }
+ 
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+       fp->_flags &= ~_IO_EOF_SEEN;
+       fp->_offset = pos;
+ #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+Common subdirectories: lib/glthread and lib/glthread
+diff --color -u lib/stdio-impl.h lib/stdio-impl.h
+--- lib/stdio-impl.h	2016-12-31 07:54:42.000000000 -0600
++++ lib/stdio-impl.h	2019-05-24 15:43:10.885006876 -0500
+@@ -138,3 +138,4 @@
+ # define _IOERR   0x10
+ 
+ #endif
++#define _IO_IN_BACKUP 0x100
diff --git a/pkgs/pkg-set.dhall b/pkgs/pkg-set.dhall
--- a/pkgs/pkg-set.dhall
+++ b/pkgs/pkg-set.dhall
@@ -2,6 +2,9 @@
 let concatMapSep = https://raw.githubusercontent.com/dhall-lang/dhall-lang/master/Prelude/Text/concatMapSep
 in
 
+let concatMapText = https://raw.githubusercontent.com/dhall-lang/dhall-lang/master/Prelude/Text/concatMap
+in
+
 let not = https://raw.githubusercontent.com/dhall-lang/dhall-lang/master/Prelude/Bool/not
 in
 
@@ -618,12 +621,27 @@
       }
 in
 
+let diffutils =
+  λ(v : List Natural) →
+    prelude.simplePackage { name = "diffutils", version = v } ⫽
+      { pkgUrl = "https://ftp.gnu.org/gnu/diffutils/diffutils-${prelude.showVersion v}.tar.xz"
+      , installCommand = prelude.installWithBinaries [ "bin/diff" ]
+      }
+in
+
+let patch =
+  λ(v : List Natural) →
+    prelude.makeGnuExe { name = "patch", version = v }
+in
+
 let m4 =
   λ(v : List Natural) →
     prelude.makeGnuExe { name = "m4", version = v } ⫽
-      -- FIXME: this is in place until there's a mechanism to patch...
-      { buildCommand = prelude.doNothing
-      , installCommand = prelude.doNothing
+      { configureCommand =
+          λ(cfg : types.BuildVars) →
+            [ prelude.patch (./patches/m4.patch as Text) ]
+              # prelude.defaultConfigure cfg
+      , pkgBuildDeps = [ prelude.unbounded "patch" ]
       }
 in
 
@@ -1044,6 +1062,7 @@
           λ(cfg : types.BuildVars) →
             [ prelude.patch patch ]
               # prelude.defaultConfigure cfg
+      , pkgBuildDeps = [ prelude.unbounded "patch" ]
       }
 in
 
@@ -1375,7 +1394,7 @@
         [ prelude.createDir "build"
         , prelude.writeFile { file = "build/cross.txt", contents = prelude.mesonCfgFile cfg }
         , prelude.call { program = "meson"
-                       , arguments = [ "--prefix=${cfg.installDir}", "..", "-Dselinux=false" ] # crossArgs
+                       , arguments = [ "--prefix=${cfg.installDir}", "..", "-Dselinux=disabled" ] # crossArgs
                        , environment = Some [ prelude.mkPkgConfigVar cfg.linkDirs
                                             , { var = "PATH", value = prelude.mkPathVar cfg.binDirs ++ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" }
                                             , { var = "LDFLAGS", value = (prelude.mkLDFlags cfg.linkDirs).value ++ " -lpcre" }
@@ -1993,7 +2012,7 @@
                   , prelude.unbounded "glib"
                   ]
       , installCommand =
-          prelude.ninjaInstallWithPkgConfig [{ src = "build/atspi-2.pc", dest = "lib/pkgconfig/atspi-2.pc" }]
+          prelude.ninjaInstallWithPkgConfig [{ src = "build/meson-private/atspi-2.pc", dest = "lib/pkgconfig/atspi-2.pc" }]
       }
 in
 
@@ -2062,14 +2081,14 @@
 in
 
 let gtk3 =
+  let mkLDFlagsGtk =
+    λ(linkDirs : List Text) →
+      concatMapSep " " Text (λ(dir : Text) → "-L${dir}") linkDirs
+  in
   let gtkEnv =
     λ(cfg : types.BuildVars) →
-      prelude.defaultPath cfg # [ { var = "LDFLAGS", value = (prelude.mkLDFlags cfg.linkDirs).value ++ " -lpcre -lfribidi" }
-                                , prelude.mkCFlags cfg
+      prelude.defaultPath cfg # [ { var = "LDFLAGS", value = (mkLDFlagsGtk cfg.linkDirs) ++ " -lpcre -lfribidi" }
                                 , prelude.mkPkgConfigVar cfg.linkDirs
-                                , prelude.libPath cfg
-                                , prelude.mkLDRunPath cfg.linkDirs
-                                , prelude.mkXdgDataDirs cfg.shareDirs
                                 , prelude.mkLDPreload cfg.preloadLibs
                                 ]
   in
@@ -2205,7 +2224,7 @@
     prelude.simplePackage { name = "libarchive", version = v } ⫽
       { pkgUrl = "https://www.libarchive.org/downloads/libarchive-${prelude.showVersion v}.tar.gz"
       , pkgDeps = [ prelude.unbounded "xz"
-                  , prelude.unbounded "bzip2"
+                  -- , prelude.unbounded "bzip2"
                   , prelude.unbounded "zlib"
                   ]
       }
@@ -2633,7 +2652,7 @@
                   , prelude.lowerBound { name = "dri2proto", lower = [2,8] }
                   , prelude.unbounded "libXrandr"
                   ]
-      , configureCommand = prelude.configureWithFlags [ "--with-gallium-drivers=nouveau,swrast" ] -- disable radeon drivers so we don't need LLVM (7.0.1 won't work?)
+      , configureCommand = prelude.configureWithFlags [ "--enable-autotools", "--with-gallium-drivers=nouveau,swrast" ] -- disable radeon drivers so we don't need LLVM (8.0.0 won't work?)
       }
 in
 
@@ -2905,7 +2924,7 @@
 let mpfr =
   λ(v : List Natural) →
     prelude.simplePackage { name = "mpfr", version = v } ⫽
-      { pkgUrl = "https://www.mpfr.org/mpfr-current/mpfr-${prelude.showVersion v}.tar.xz" }
+      { pkgUrl = "https://ftp.gnu.org/gnu/mpfr/mpfr-${prelude.showVersion v}.tar.xz" }
 in
 
 let libsodium =
@@ -3070,12 +3089,34 @@
       }
 in
 
+let mpc =
+  λ(v : List Natural) →
+    prelude.simplePackage { name = "mpc", version = v } ⫽
+      { pkgUrl = "https://ftp.gnu.org/gnu/mpc/mpc-${prelude.showVersion v}.tar.gz"
+      , pkgDeps = [ prelude.unbounded "mpfr" ]
+      }
+in
+
+-- let gcc =
+  -- λ(v : List Natural) →
+    -- let versionString = prelude.showVersion v in
+    -- prelude.simplePackage { name = "gcc", version = v } ⫽
+      -- { pkgUrl = "http://mirror.linux-ia64.org/gnu/gcc/releases/gcc-${versionString}/gcc-${versionString}.tar.xz"
+      -- , pkgDeps = [ prelude.unbounded "mpfr"
+                  -- , prelude.unbounded "mpc"
+                  -- ]
+      -- , configureCommand = prelude.configureWithFlags [ "--disable-multilib" ]
+      -- , pkgStream = False
+      -- }
+-- in
+
+-- https://hub.darcs.net/raichoo/hikari
 -- https://versaweb.dl.sourceforge.net/project/schilytools/schily-2019-03-29.tar.bz2
 [ autoconf [2,69]
 , automake [1,16,1]
-, at-spi-atk { version = [2,30], patch = 0 }
-, at-spi-core { version = [2,30], patch = 0 }
-, atk { version = [2,30], patch = 0 }
+, at-spi-atk { version = [2,33], patch = 1 }
+, at-spi-core { version = [2,33], patch = 1 }
+, atk { version = [2,33], patch = 1 }
 , babl { version = [0,1], patch = 60 }
 , binutils [2,31]
 , bison [3,3]
@@ -3089,6 +3130,7 @@
 , curl [7,63,0]
 , damageproto [1,2,1]
 , dbus [1,12,10]
+, diffutils [3,7]
 , dri2proto [2,8]
 , elfutils [0,175]
 , emacs [26,1]
@@ -3105,8 +3147,9 @@
 , fribidi [1,0,5]
 , gawk [4,2,1]
 , gc [8,0,4]
+-- , gcc [9,1,0]
 , gdb [8,2]
-, gdk-pixbuf { version = [2,38], patch = 0 }
+, gdk-pixbuf { version = [2,38], patch = 1 }
 , gegl { version = [0,4], patch = 12 }
 , gettext [0,19,8]
 , gexiv2 { version = [0,11], patch = 0 }
@@ -3114,22 +3157,22 @@
 , gperftools [2,7]
 , giflib [5,1,4]
 , git [2,19,2]
-, glib { version = [2,58], patch = 3 } -- TODO: bump to 2.59.0 once gobject-introspection supports it
+, glib { version = [2,60], patch = 3 } -- TODO: bump to 2.59.0 once gobject-introspection supports it
 , glproto [1,4,17]
 , glu [9,0,0]
 , json-glib { version = [1,4], patch = 4 }
 , glibc [2,28]
 , gmp [6,1,2]
-, gobject-introspection { version = [1,59], patch = 3 }
+, gobject-introspection { version = [1,60], patch = 1 }
 , gnome-doc-utils { version = [0,20], patch = 10 }
 , gnupg [2,2,15]
 , gnutls { version = [3,6], patch = 7 }
 , graphviz [2,40,1]
 , gsl [2,5]
 , gtk2 { version = [2,24], patch = 32 }
-, gtk3 { version = [3,24], patch = 4 }
+, gtk3 { version = [3,24], patch = 8 }
 , gzip [1,9]
-, harfbuzz [2,4,0]
+, harfbuzz [2,5,0]
 , htop [2,2,0]
 , imageMagick [7,0,8]
 , imlib2 [1,5,1]
@@ -3175,7 +3218,7 @@
 , libselinux [2,8]
 , libsepol [2,8]
 , libsodium [1,0,17]
-, libsoup { version = [2,65], patch = 2 }
+, libsoup { version = [2,67], patch = 1 }
 , libssh2 [1,8,0]
 , libtasn1 [4,13]
 , libtiff [4,0,10]
@@ -3207,7 +3250,7 @@
 , libXt [1,1,5]
 , libXtst [1,2,3]
 , libXxf86vm [1,1,4]
-, llvm [7,0,1]
+, llvm [8,0,0]
 , lmdb [0,9,23]
 , lua [5,3,5]
 , m17n [1,8,0]
@@ -3215,9 +3258,10 @@
 , mako [1,0,7]
 , markupSafe [1,0]
 , memcached [1,5,12]
-, mesa [18,3,1]
+, mesa [19,0,5]
 , meson [0,50,1]
-, mpfr [4,0,2]
+, mpc [1,0,3]
+, mpfr [3,1,6] -- [4,0,2]
 , mosh [1,3,2]
 , motif [2,3,8]
 , musl [1,1,20]
@@ -3232,9 +3276,10 @@
 , nspr [4,20]
 , openssh [7,9]
 , openssl [1,1,1]
-, p11kit [0,23,15]
+, p11kit [0,23,16,1]
 , pango { version = [1,43], patch = 0 }
 , pari [2,11,1]
+, patch [2,7]
 , pcre [8,42]
 , pcre2 [10,32]
 , perl5 [5,28,1]
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
@@ -63,7 +63,7 @@
     liftIO $ copyFileWithMetadata absSrc absDest
 stepToProc dir' _ (Patch contents') = do
     liftIO $ TIO.writeFile (dir' </> "step.patch") contents'
-    waitProcess $ (proc "patch" ["-i", "step.patch"]) { cwd = Just dir' }
+    waitProcess $ (proc "patch" ["-p0", "-i", "step.patch"]) { cwd = Just dir' }
 
 processSteps :: (Traversable t)
              => FilePath -- ^ Build directory
