diff --git a/ats-pkg.cabal b/ats-pkg.cabal
--- a/ats-pkg.cabal
+++ b/ats-pkg.cabal
@@ -1,5 +1,5 @@
 name:                ats-pkg
-version:             2.1.0.6
+version:             2.1.0.7
 synopsis:            Package manager for ATS
 description:         A collection of scripts to make building ATS projects easy.
 homepage:            https://github.com/vmchale/atspkg#readme
diff --git a/src/Language/ATS/Package/Build.hs b/src/Language/ATS/Package/Build.hs
--- a/src/Language/ATS/Package/Build.hs
+++ b/src/Language/ATS/Package/Build.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TupleSections     #-}
 
 module Language.ATS.Package.Build ( mkPkg
                                   , pkgToAction
@@ -23,7 +24,7 @@
 import           Development.Shake.Clean
 import           Development.Shake.FilePath
 import           Development.Shake.Man
-import           Dhall                                hiding (bool)
+import           Dhall                                hiding (bool, maybe)
 import           Language.ATS.Package.Compiler
 import           Language.ATS.Package.Dependency
 import           Language.ATS.Package.Type            hiding (version)
@@ -47,7 +48,8 @@
 -- | Build a set of targets
 build :: [String] -- ^ Targets
       -> IO ()
-build rs = bool (mkPkg False [buildAll Nothing] rs) (mkPkg False mempty rs) =<< check Nothing
+build rs = bool (mkPkgEmpty [buildAll Nothing]) (mkPkgEmpty mempty) =<< check Nothing
+    where mkPkgEmpty ts = mkPkg False False ts rs Nothing
 
 -- TODO clean generated ATS
 mkClean :: Rules ()
@@ -108,24 +110,37 @@
         need tests
         mapM_ cmd_ tests
 
-options :: Bool -> ShakeOptions
-options rb = shakeOptions { shakeFiles = ".atspkg"
+options :: Bool -> Bool -> [String] -> ShakeOptions
+options rb rba rs = shakeOptions { shakeFiles = ".atspkg"
                           , shakeThreads = 4
                           , shakeLint = Just LintBasic
                           , shakeVersion = showVersion version
-                          , shakeRebuild = bool mempty [(RebuildNow, ".atspkg/config")] rb
+                          , shakeRebuild = foldMap g [ (rb, [(RebuildNow, ".atspkg/config")])
+                                                     , (rba, (RebuildNow ,) <$> rs)
+                                                     ]
                           }
+    where g (b, ts) = bool mempty ts b
 
 cleanConfig :: (MonadIO m) => [String] -> m Pkg
 cleanConfig ["clean"] = pure undefined
 cleanConfig _         = getConfig Nothing
 
--- TODO verbosity & coloring?
-mkPkg :: Bool -> [IO ()] -> [String] -> IO ()
-mkPkg rb setup rs = shake (options rb) $
-    want rs >>
-    mkClean >>
-    (pkgToAction setup rs =<< cleanConfig rs)
+-- TODO verbosity?
+mkPkg :: Bool -- ^ Whether to ignore cached package config
+      -> Bool -- ^ Rebuild all targets
+      -> [IO ()] -- ^ Setup
+      -> [String] -- ^ Targets
+      -> Maybe String -- ^ Target triple
+      -> IO ()
+mkPkg rb rba setup rs tgt = do
+    cfg <- cleanConfig rs
+    let opt = options rb rba $ pkgToTargets cfg rs
+    shake opt $
+        foldr (>>) (pure ())
+            [ want rs
+            , mkClean
+            , pkgToAction setup rs tgt =<< cleanConfig rs
+            ]
 
 asTuple :: TargetPair -> (Text, Text)
 asTuple (TargetPair s t) = (s, t)
@@ -152,9 +167,17 @@
     , mkConfig
     ]
 
-pkgToAction :: [IO ()] -> [String] -> Pkg -> Rules ()
-pkgToAction setup rs ~(Pkg bs ts mt v v' ds cds cc cf as cdir) =
+pkgToTargets :: Pkg -> [FilePath] -> [FilePath]
+pkgToTargets ~(Pkg bs _ _ _ _ _ _ _ _ _ _) [] = TL.unpack . target <$> bs
+pkgToTargets _ ts                             = ts
 
+pkgToAction :: [IO ()] -- ^ Setup actions to be performed
+            -> [String] -- ^ Targets
+            -> Maybe String -- ^ Optional compiler triple (overrides 'ccompiler')
+            -> Pkg -- ^ Package data type
+            -> Rules ()
+pkgToAction setup rs tgt ~(Pkg bs ts mt v v' ds cds cc cf as cdir) =
+
     unless (rs == ["clean"]) $ do
 
         want [".atspkg/config"]
@@ -174,7 +197,7 @@
 
     where g (Bin s t ls hs' atg gc') =
             atsBin
-                (TL.unpack cc)
+                cc'
                 (TL.unpack <$> cf)
                 v
                 v'
@@ -191,3 +214,5 @@
                 targets = fmap (((cedar <> "/") <>) . (-<.> "c") . takeBaseName . TL.unpack) as
             want targets
             mapM_ (cgen v v') atsSourceDirs
+
+          cc' = maybe (TL.unpack cc) (<> "-gcc") tgt
diff --git a/src/Language/ATS/Package/Exec.hs b/src/Language/ATS/Package/Exec.hs
--- a/src/Language/ATS/Package/Exec.hs
+++ b/src/Language/ATS/Package/Exec.hs
@@ -30,7 +30,11 @@
 versionInfo = infoOption ("atspkg version: " ++ showVersion version) (short 'v' <> long "version" <> help "Show version")
 
 data Command = Install
-             | Build { _targets :: [String], _recache :: Bool }
+             | Build { _targets    :: [String]
+                     , _recache    :: Bool
+                     , _archTarget :: Maybe String
+                     , _rebuildAll :: Bool
+                     }
              | Clean
              | Test
              | Fetch { _url :: String }
@@ -56,6 +60,15 @@
         (long "no-cache"
         <> short 'c'
         <> help "Turn off configuration caching")
+    <*> optional
+        (strOption
+        (long "target"
+        <> short 't'
+        <> help "Set target by using its triple"))
+    <*> switch
+        (long "rebuild"
+        <> short 'r'
+        <> help "Force rebuild of all targets")
 
 fetch :: Parser Command
 fetch = Fetch <$>
@@ -69,22 +82,25 @@
     fetchDeps True mempty [Dependency lib dirName url' undefined] [] True
     ps <- getSubdirs p
     pkgDir <- fromMaybe p <$> findFile (p:ps) "atspkg.dhall"
-    let a = withCurrentDirectory (takeDirectory pkgDir) (mkPkg False mempty ["install"])
+    let a = withCurrentDirectory (takeDirectory pkgDir) (mkPkg False False mempty ["install"] Nothing)
     bool (buildAll (Just pkgDir) >> a) a =<< check (Just pkgDir)
 
 exec :: IO ()
 exec = execParser wrapper >>= run
 
+runHelper :: Bool -> Bool -> [String] -> Maybe String -> IO ()
+runHelper rb rba rs tgt = bool
+    (mkPkg rb rba [buildAll Nothing] rs tgt)
+    (mkPkg rb rba mempty rs tgt)
+    =<< check Nothing
+
 run :: Command -> IO ()
 run Nuke = cleanAll
 run (Fetch u) = fetchPkg u
-run Clean = mkPkg False mempty ["clean"]
-run c = bool (mkPkg rb [buildAll Nothing] rs) (mkPkg rb mempty rs) =<< check Nothing
+run Clean = mkPkg False False mempty ["clean"] Nothing
+run (Build rs rb tgt rba) = runHelper rb rba rs tgt
+run c = runHelper False False rs Nothing
     where rs = g c
-          g Install      = ["install"]
-          g (Build ts _) = ts
-          g Test         = ["test"]
-          g _            = undefined
-          rb = h c
-          h (Build _ True) = True
-          h _              = False
+          g Install = ["install"]
+          g Test    = ["test"]
+          g _       = undefined
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -6,7 +6,7 @@
   - shake-ext-2.1.0.1
   - shake-ats-1.1.0.2
   - composition-prelude-1.1.0.2
-  - language-ats-0.1.1.15
+  - language-ats-0.1.1.17
   - cli-setup-0.2.0.1
   - hs2ats-0.2.0.3
 flags:
