diff --git a/debian-build.cabal b/debian-build.cabal
--- a/debian-build.cabal
+++ b/debian-build.cabal
@@ -1,5 +1,5 @@
 name:                debian-build
-version:             0.7.1.1
+version:             0.7.2.0
 synopsis:            Debian package build sequence tools
 description:         This package provides build sequence functions
                      for debian package, and includes on-the-fly
diff --git a/mains/odebuild.hs b/mains/odebuild.hs
--- a/mains/odebuild.hs
+++ b/mains/odebuild.hs
@@ -1,9 +1,9 @@
-import Control.Arrow ((>>>))
-import Control.Monad (void, when)
+import Control.Monad (void, when, (>=>))
 import System.Environment (getProgName, getArgs)
 import System.Console.GetOpt
   (OptDescr (Option), ArgDescr (ReqArg, NoArg), ArgOrder (RequireOrder),
    usageInfo, getOpt)
+import Text.Read (readMaybe)
 
 import Debian.Package.Data (Source, Hackage, isBinaryPackage)
 import qualified Debian.Package.Build.Command as Command
@@ -29,28 +29,36 @@
   ODebuildOptions
   { revision    :: Maybe String
   , installDeps :: Bool
-  } deriving Show
+  , buildModes  :: [BuildMode] -> [BuildMode]
+  }
 
 defaultOptions :: ODebuildOptions
 defaultOptions =
   ODebuildOptions
   { revision     =  Nothing
   , installDeps  =  False
+  , buildModes   =  id
   }
 
-descs :: [OptDescr (ODebuildOptions -> ODebuildOptions)]
+descs :: [OptDescr (ODebuildOptions -> Either String ODebuildOptions)]
 descs =
   [ Option [] ["revision"]
-    (ReqArg (\s opts -> opts { revision = Just s }) "DEBIAN_REVISION")
+    (ReqArg (\s opts -> return $ opts { revision = Just s }) "DEBIAN_REVISION")
     "debian package revision to pass to cabal-debian"
   , Option [] ["install-deps"]
-    (NoArg $ \opts -> opts { installDeps = True })
-    "install build depends when to run build"
+    (NoArg $ \opts   -> return $ opts { installDeps = True })
+    "install build depends before running build"
+  , Option [] ["mode"]
+    (ReqArg (\s opts -> maybe (Left $ "Unknown build mode: " ++ s) Right $ do
+                m <- readMaybe s
+                return $ opts { buildModes = buildModes opts . (m : ) } )
+     "BUILD_MODE")
+    "add build-mode to build-mode list to specify"
   ]
 
 parseOption :: [String]
-            -> (ODebuildOptions -> ODebuildOptions, ([String], [String]))
-parseOption args = (foldr (>>>) id ufs, (ss1, ss2))  where
+            -> (ODebuildOptions -> Either String ODebuildOptions, ([String], [String]))
+parseOption args = (foldr (>=>) return ufs, (ss1, ss2))  where
   (ufs, ss1, ss2) = getOpt RequireOrder descs args
 
 help :: IO ()
@@ -88,7 +96,7 @@
 source = build' [Src]
 
 build :: ODebuildOptions -> [String] -> Build (Source, Maybe Hackage)
-build =  build' []
+build opts = build' (buildModes opts []) opts
 
 install :: ODebuildOptions -> [String] -> Build ()
 install opts args = do
@@ -110,10 +118,13 @@
 parseArgs args0
   | not $ null errs  = fail $ concat errs
   | not $ null args1 = fail $ "Unknown arguments: " ++ unwords args1
-  | otherwise        = return
-                       (f defaultOptions, drop 1 rest )  where
-  (opt, rest) = break (== "--") args0
-  (f, (args1, errs)) = parseOption opt
+  | otherwise        =
+      either (fail . ("Option parse error: " ++)) return $ do
+        opts <- f defaultOptions
+        return (opts, drop 1 rest)
+      where
+        (opt, rest) = break (== "--") args0
+        (f, (args1, errs)) = parseOption opt
 
 runArgs :: (ODebuildOptions -> [String] -> Build a) -> [String] -> IO a
 runArgs act as = do
diff --git a/src/Debian/Package/Build/Command.hs b/src/Debian/Package/Build/Command.hs
--- a/src/Debian/Package/Build/Command.hs
+++ b/src/Debian/Package/Build/Command.hs
@@ -218,7 +218,7 @@
 
 -- | Build mode, all or binary only
 data BuildMode = All | Bin | Src | Dep | Indep
-               deriving (Eq, Show)
+               deriving (Eq, Show, Read)
 
 -- | Infer all build mode list from debian control file data
 modeListFromControl :: Control -> [BuildMode]
