diff --git a/shake-ats.cabal b/shake-ats.cabal
--- a/shake-ats.cabal
+++ b/shake-ats.cabal
@@ -1,5 +1,5 @@
 name:                shake-ats
-version:             1.4.1.2
+version:             1.5.0.0
 synopsis:            Utilities for building ATS projects with shake
 description:         Various helper functions for building [ATS](http://www.ats-lang.org/) with the [shake](http://shakebuild.com/) library
 homepage:            https://github.com/vmchale/shake-ats#readme
@@ -25,12 +25,13 @@
   other-modules:       Development.Shake.ATS.Type
                      , Development.Shake.ATS.Rules
                      , Development.Shake.ATS.Environment
+                     , Development.Shake.ATS.Generate
   build-depends:       base >= 4.7 && < 5
-                     , language-ats
+                     , language-ats >= 0.3.0.3
                      , shake-ext >= 2.1.0.0
                      , hs2ats >= 0.2.0.1
                      , directory
-                     , microlens
+                     , lens
                      , text
                      , dependency
                      , shake
diff --git a/src/Development/Shake/ATS.hs b/src/Development/Shake/ATS.hs
--- a/src/Development/Shake/ATS.hs
+++ b/src/Development/Shake/ATS.hs
@@ -31,6 +31,8 @@
                              , ArtifactType (..)
                              ) where
 
+import           Control.Arrow
+import           Control.Lens
 import           Control.Monad
 import           Control.Monad.IO.Class
 import           Data.Bool                         (bool)
@@ -47,7 +49,6 @@
 import           Development.Shake.FilePath
 import           Development.Shake.Version
 import           Language.ATS
-import           Lens.Micro
 import           System.Directory                  (copyFile, createDirectoryIfMissing, doesFileExist)
 import           System.Exit                       (ExitCode (ExitSuccess))
 
@@ -154,6 +155,9 @@
 atsBin :: BinaryTarget -> Rules ()
 atsBin tgt@BinaryTarget{..} = do
 
+    unless (null linkTargets) $
+        mapM_ (uncurry genLinks) linkTargets
+
     unless (null genTargets) $
         mapM_ (uncurry3 genATS) genTargets
 
@@ -195,7 +199,7 @@
         -- tell shake which files to track and copy them to the appropriate
         -- directory
         need (otherDeps ++ (TL.unpack . objectFile <$> hsLibs))
-        sources <- (<> cDeps) <$> transitiveDeps ((^._2) <$> genTargets) [atsSrc]
+        sources <- (<> cDeps) <$> transitiveDeps ((snd <$> linkTargets) <> ((^._2) <$> genTargets)) [atsSrc]
         need sources
         copySources tc sources
 
@@ -223,11 +227,16 @@
 trim :: String -> String
 trim = init . drop 1
 
+maybeError :: (MonadIO m) => Either (ATSError String) b -> m ()
+maybeError Right{}  = pure ()
+maybeError (Left y) = printErr y
+
 transitiveDeps :: (MonadIO m) => [FilePath] -> [FilePath] -> m [FilePath]
 transitiveDeps _ [] = pure []
 transitiveDeps gen ps = fmap join $ forM ps $ \p -> if p `elem` gen then pure mempty else do
     contents <- liftIO $ readFile p
-    let ats = fromRight mempty . parse $ contents
+    let (ats, err) = (fromRight mempty &&& maybeError) . parse $ contents
+    err
     let dir = takeDirectory p
     deps <- filterM (\f -> ((f `elem` gen) ||) <$> (liftIO . doesFileExist) f) $ fixDir dir . trim <$> getDependencies ats
     deps' <- transitiveDeps gen deps
diff --git a/src/Development/Shake/ATS/Generate.hs b/src/Development/Shake/ATS/Generate.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/ATS/Generate.hs
@@ -0,0 +1,16 @@
+module Development.Shake.ATS.Generate ( generateLinks
+                                      ) where
+
+import           Control.Lens
+import           Data.Semigroup
+import           Language.ATS
+
+generateLinks :: String -> Either (ATSError String) String
+generateLinks = fmap (printATS . generateLinks') . parse
+
+generateLinks' :: ATS -> ATS
+generateLinks' (ATS ds) = ATS (fmap g ds <> [macDecl])
+    where g f@Func{} = Extern undefined (set (fun.preF.expression) expr f)
+          g x        = x
+          expr = Just (StringLit "\"mac#\"")
+          macDecl = Define "#define ATS_MAINATSFLAG 1"
diff --git a/src/Development/Shake/ATS/Rules.hs b/src/Development/Shake/ATS/Rules.hs
--- a/src/Development/Shake/ATS/Rules.hs
+++ b/src/Development/Shake/ATS/Rules.hs
@@ -3,14 +3,16 @@
                                    , cabalExport
                                    , getSubdirs
                                    , genATS
+                                   , genLinks
                                    ) where
 
 import           Control.Monad
-import           Data.List                  (isPrefixOf)
-import           Data.Semigroup             (Semigroup (..))
-import qualified Data.Text.Lazy             as TL
-import           Development.Shake          hiding (doesDirectoryExist)
-import           Development.Shake.ATS.Type hiding (BinaryTarget (..))
+import           Data.List                      (isPrefixOf)
+import           Data.Semigroup                 (Semigroup (..))
+import qualified Data.Text.Lazy                 as TL
+import           Development.Shake              hiding (doesDirectoryExist)
+import           Development.Shake.ATS.Generate
+import           Development.Shake.ATS.Type     hiding (BinaryTarget (..))
 import           Development.Shake.Cabal
 import           Development.Shake.FilePath
 import           Language.ATS.Generate
@@ -27,6 +29,13 @@
         createDirectoryIfMissing True (takeDirectory out)
         genATSTypes src out cpphs
 
+genLinks :: FilePath -> FilePath -> Rules ()
+genLinks dats link =
+    link %> \out -> liftIO $ do
+        contents <- readFile dats
+        let proc = generateLinks contents
+        writeFile out (either undefined id proc)
+
 getSubdirs :: FilePath -> IO [FilePath]
 getSubdirs p = do
     ds <- listDirectory p
@@ -51,7 +60,7 @@
     obf %> \out -> do
 
         need (cf : fmap ((obfDir <> "/") <>) trDeps)
-        command_ [Cwd obfDir] "cabal" ["new-build", "-O2"]
+        command_ [Cwd obfDir] "cabal" ["new-build", "all", "-O2"]
 
         let subdir = takeDirectory cbp ++ "/"
             correctDir = (libName `isPrefixOf`)
diff --git a/src/Development/Shake/ATS/Type.hs b/src/Development/Shake/ATS/Type.hs
--- a/src/Development/Shake/ATS/Type.hs
+++ b/src/Development/Shake/ATS/Type.hs
@@ -58,17 +58,18 @@
                                    } deriving (Generic, Binary)
 
 -- | Type for binary and library builds with ATS.
-data BinaryTarget = BinaryTarget { cFlags     :: [String] -- ^ Flags to be passed to the C compiler
-                                 , toolConfig :: ATSToolConfig
-                                 , gc         :: Bool -- ^ Whether to configure build for use with the garbage collector.
-                                 , libs       :: [String] -- ^ Libraries against which to link
-                                 , src        :: [String] -- ^ ATS source files. If building an executable, at most one may contain @main0@.
-                                 , hsLibs     :: [ForeignCabal] -- ^ Cabal-based Haskell libraries
-                                 , genTargets :: [(String, String, Bool)] -- ^ Files to be run through @hs2ats@.
-                                 , binTarget  :: String -- ^ Binary target
-                                 , cDeps      :: [String] -- ^ C files necessary to compile the target
-                                 , otherDeps  :: [String] -- ^ Other files necessary to compile target
-                                 , tgtType    :: ArtifactType -- ^ Build type
+data BinaryTarget = BinaryTarget { cFlags      :: [String] -- ^ Flags to be passed to the C compiler
+                                 , toolConfig  :: ATSToolConfig
+                                 , gc          :: Bool -- ^ Whether to configure build for use with the garbage collector.
+                                 , libs        :: [String] -- ^ Libraries against which to link
+                                 , src         :: [String] -- ^ ATS source files. If building an executable, at most one may contain @main0@.
+                                 , hsLibs      :: [ForeignCabal] -- ^ Cabal-based Haskell libraries
+                                 , genTargets  :: [(String, String, Bool)] -- ^ Files to be run through @hs2ats@.
+                                 , linkTargets :: [(String, String)] -- ^ Targets for @_link.hats@ generation.
+                                 , binTarget   :: String -- ^ Binary target
+                                 , cDeps       :: [String] -- ^ C files necessary to compile the target
+                                 , otherDeps   :: [String] -- ^ Other files necessary to compile target
+                                 , tgtType     :: ArtifactType -- ^ Build type
                                  } deriving (Generic, Binary)
 
 -- | Data type containing information about Haskell components of a build.
