diff --git a/shake-ext.cabal b/shake-ext.cabal
--- a/shake-ext.cabal
+++ b/shake-ext.cabal
@@ -1,5 +1,5 @@
 name:                shake-ext
-version:             1.4.0.1
+version:             1.4.0.2
 synopsis:            Helper functions for linting with shake 
 description:         This package provides several linters out of the box, as well as functionality for building ATS source files with [shake](http://shakebuild.com/).
 homepage:            https://hub.darcs.net/vmchale/shake-ext
@@ -24,6 +24,7 @@
   exposed-modules:     Development.Shake.FileDetect
                      , Development.Shake.Linters
                      , Development.Shake.Man
+                     , Development.Shake.Check
   build-depends:       base >= 4.10 && < 5
                      , shake
                      , language-ats >= 0.1.1.3
diff --git a/src/Development/Shake/Check.hs b/src/Development/Shake/Check.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/Check.hs
@@ -0,0 +1,19 @@
+-- | Functions in this module check for the presence of various build tools.
+module Development.Shake.Check ( checkExecutable
+                               -- * Helper functions for specific programs
+                               , pandoc
+                               , autoconf
+                               ) where
+
+import           Control.Monad.IO.Class
+import           Data.Maybe             (isJust)
+import           System.Directory       (findExecutable)
+
+checkExecutable :: (MonadIO m) => String -> m Bool
+checkExecutable = fmap isJust . liftIO . findExecutable
+
+pandoc :: (MonadIO m) => m Bool
+pandoc = checkExecutable "pandoc"
+
+autoconf :: (MonadIO m) => m Bool
+autoconf = checkExecutable "autoconf"
