diff --git a/archive-libarchive.cabal b/archive-libarchive.cabal
--- a/archive-libarchive.cabal
+++ b/archive-libarchive.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.0
 name:          archive-libarchive
-version:       0.2.0.0
+version:       0.2.2.0
 license:       BSD3
 license-file:  LICENSE
 copyright:     Copyright: (c) 2019 Vanessa McHale
@@ -14,6 +14,7 @@
 source-repository head
     type:     git
     location: https://github.com/vmchale/archive-backpack
+    subdir:   archive-libarchive
 
 flag development
     description: Enable `-Werror`
@@ -21,13 +22,14 @@
     manual:      True
 
 library
-    exposed-modules:  Archive.FFI
-    hs-source-dirs:   src
-    default-language: Haskell2010
-    ghc-options:      -Wall
+    exposed-modules:    Archive.FFI
+    build-tool-depends: cpphs:cpphs -any
+    hs-source-dirs:     src
+    default-language:   Haskell2010
+    ghc-options:        -Wall
     build-depends:
         base >=4.3 && <5,
-        libarchive >=2.0.0.0,
+        libarchive >=2.1.3.0,
         bytestring -any,
         composition-prelude -any
 
diff --git a/src/Archive/FFI.cpphs b/src/Archive/FFI.cpphs
new file mode 100644
--- /dev/null
+++ b/src/Archive/FFI.cpphs
@@ -0,0 +1,33 @@
+module Archive.FFI ( Entry
+                   , Error
+                   , readArchiveBytes
+                   , unpackToDir
+                   , writeArchiveBytes
+                   , packFiles
+                   , versionInfo
+                   ) where
+
+import qualified Codec.Archive                 as FFI
+import           Codec.Archive.Foreign.Archive (archiveVersionString)
+import           Control.Composition           ((.*))
+import qualified Data.ByteString.Lazy          as BSL
+
+type Entry = FFI.Entry
+
+type Error = FFI.ArchiveResult
+
+writeArchiveBytes :: [Entry] -> BSL.ByteString
+writeArchiveBytes = FFI.entriesToBSL
+
+readArchiveBytes :: BSL.ByteString -> Either Error [Entry]
+readArchiveBytes = FFI.readArchiveBSL
+
+unpackToDir :: FilePath -> BSL.ByteString -> IO ()
+unpackToDir = fmap (either showError id) .* FFI.runArchiveM .* FFI.unpackToDirLazy
+    where showError = error . show
+
+packFiles :: [FilePath] -> IO BSL.ByteString
+packFiles = FFI.packFiles
+
+versionInfo :: String
+versionInfo = "libarchive-hs: " ++ VERSION_libarchive ++ "\n" ++ archiveVersionString
diff --git a/src/Archive/FFI.hs b/src/Archive/FFI.hs
deleted file mode 100644
--- a/src/Archive/FFI.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-module Archive.FFI ( Entry
-                   , Error
-                   , readArchiveBytes
-                   , unpackToDir
-                   , writeArchiveBytes
-                   , packFiles
-                   ) where
-
-import qualified Codec.Archive        as FFI
-import           Control.Composition  ((.*))
-import qualified Data.ByteString.Lazy as BSL
-
-type Entry = FFI.Entry
-
-type Error = FFI.ArchiveResult
-
-writeArchiveBytes :: [Entry] -> BSL.ByteString
-writeArchiveBytes = FFI.entriesToBSL
-
-readArchiveBytes :: BSL.ByteString -> Either Error [Entry]
-readArchiveBytes = FFI.readArchiveBSL
-
-unpackToDir :: FilePath -> BSL.ByteString -> IO ()
-unpackToDir = fmap (either (error . show) id) .* FFI.runArchiveM .* FFI.unpackToDirLazy
-
-packFiles :: [FilePath] -> IO BSL.ByteString
-packFiles = FFI.packFiles
