diff --git a/cabal-debian.cabal b/cabal-debian.cabal
--- a/cabal-debian.cabal
+++ b/cabal-debian.cabal
@@ -1,5 +1,5 @@
 Name:           cabal-debian
-Version:        3.4.3
+Version:        3.5
 License:        BSD3
 License-File:   debian/copyright
 Author:         David Fox <dsf@seereason.com>
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+haskell-cabal-debian (3.5) unstable; urgency=low
+
+  * Allow full lists of debian relations to be passed to the --build-dep
+    argument, not just a single package name.
+
+ -- David Fox <dsf@seereason.com>  Sun, 01 Sep 2013 07:08:37 -0700
+
 haskell-cabal-debian (3.4.3) unstable; urgency=low
 
   * Fix the repository location in the cabal file.
diff --git a/src/Debian/Debianize/Atoms.hs b/src/Debian/Debianize/Atoms.hs
--- a/src/Debian/Debianize/Atoms.hs
+++ b/src/Debian/Debianize/Atoms.hs
@@ -92,7 +92,7 @@
 import Debian.Debianize.Types.VersionSplits (VersionSplits)
 import Debian.Orphans ()
 import Debian.Policy (PackageArchitectures, SourceFormat, PackagePriority, Section, StandardsVersion)
-import Debian.Relation (SrcPkgName, BinPkgName, Relation(..))
+import Debian.Relation (SrcPkgName, BinPkgName, Relations, Relation(..))
 import Debian.Version (DebianVersion)
 import Distribution.License (License)
 import Distribution.Package (PackageName(PackageName), PackageIdentifier(..))
@@ -182,15 +182,15 @@
                                                   -- the name is constructed from the cabal package name.  Note that
                                                   -- DebianNameMap could encode this information if we already knew
                                                   -- the cabal package name, but we can't assume that.
-    | BuildDep Relation				  -- ^ Add a build dependency
-    | BuildDepIndep Relation			  -- ^ Add an arch independent build dependency
+    | BuildDep Relations			  -- ^ Add build dependencies
+    | BuildDepIndep Relations			  -- ^ Add arch independent build dependencies
     | MissingDependency BinPkgName		  -- ^ Lets cabal-debian know that a package it might expect to exist
                                                   -- actually does not, so omit all uses in resulting debianization.
-    | ExtraLibMapping String BinPkgName		  -- ^ Map a cabal Extra-Library name to a debian binary package name,
+    | ExtraLibMapping String Relations		  -- ^ Map a cabal Extra-Library name to a debian binary package name,
                                                   -- e.g. @ExtraLibMapping extraLibMap "cryptopp" "libcrypto-dev"@ adds a
-                                                  -- build dependency on @libcrypto-dev@ to any package that has @cryptopp@
-                                                  -- in its cabal Extra-Library list.
-    | ExecMapping String BinPkgName		  -- ^ Map a cabal Build-Tool name to a debian binary package name,
+                                                  -- build dependency *and* a regular dependency on @libcrypto-dev@ to
+                                                  -- any package that has @cryptopp@ in its cabal Extra-Library list.
+    | ExecMapping String Relations		  -- ^ Map a cabal Build-Tool name to a debian binary package name,
                                                   -- e.g. @ExecMapping "trhsx" "haskell-hsx-utils"@ adds a build
                                                   -- dependency on @haskell-hsx-utils@ to any package that has @trhsx@ in its
                                                   -- cabal build-tool list.
@@ -394,7 +394,7 @@
             f _ _ = Nothing
 
 -- | Map from cabal Extra-Lib names to debian binary package names.
-extraLibMap :: Lens Atoms (Map String (Set BinPkgName))
+extraLibMap :: Lens Atoms (Map String (Set Relations))
 extraLibMap = lens g s
     where
       g atoms = foldAtoms from Map.empty atoms
@@ -407,13 +407,16 @@
             p _ _ = False
 
 -- | Map from cabal Build-Tool names to debian binary package names.
-execMap :: Lens Atoms (Map String BinPkgName)
+execMap :: Lens Atoms (Map String Relations)
 execMap = lens g s
     where
+      g :: Atoms -> Map String Relations
       g atoms = foldAtoms from Map.empty atoms
           where
+            from :: DebAtomKey -> DebAtom -> Map String Relations -> Map String Relations
             from Source (ExecMapping cabal debian) x = Map.insertWith (error "Conflict in execMap") cabal debian x
             from _ _ x = x
+      s :: Map String Relations -> Atoms -> Atoms
       s x atoms = Map.foldWithKey (\ cabal debian atoms' -> insertAtom Source (ExecMapping cabal debian) atoms') (deleteAtoms p atoms) x
           where
             p Source (ExecMapping _ _) = True
@@ -783,7 +786,7 @@
 -- | Build dependencies.  FIXME: This should be a Set (Set Relation)
 -- so we can build or relations, right now we just assume that each
 -- Relation is a singleton set.
-buildDeps :: Lens Atoms (Set Relation)
+buildDeps :: Lens Atoms (Set Relations)
 buildDeps = lens g s
     where
       g atoms = foldAtoms from Set.empty atoms
@@ -796,7 +799,7 @@
             p _ _ = False
 
 -- | Architecture independent
-buildDepsIndep :: Lens Atoms (Set Relation)
+buildDepsIndep :: Lens Atoms (Set Relations)
 buildDepsIndep = lens g s
     where
       g atoms = foldAtoms from Set.empty atoms
diff --git a/src/Debian/Debianize/Debianize.hs b/src/Debian/Debianize/Debianize.hs
--- a/src/Debian/Debianize/Debianize.hs
+++ b/src/Debian/Debianize/Debianize.hs
@@ -250,13 +250,14 @@
               = bin { relations = g (relations bin) }
       f bin = bin
       g :: Debian.PackageRelations -> Debian.PackageRelations
-      g rels = rels { Debian.depends = Debian.depends rels ++
-                                map anyrel' (concatMap (\ cab -> maybe [BinPkgName ("lib" ++ cab ++ "-dev")] Set.toList (Map.lookup cab (getL extraLibMap deb)))
-                                                       (nub $ concatMap Cabal.extraLibs $ Cabal.allBuildInfo $ pkgDesc)) }
+      g rels = rels { Debian.depends =
+                        concat $
+                          [Debian.depends rels] ++
+                          concatMap (\ cab -> maybe [[[Rel (BinPkgName ("lib" ++ cab ++ "-dev")) Nothing Nothing]]]
+                                                    Set.toList
+                                                    (Map.lookup cab (getL extraLibMap deb)))
+                                    (nub $ concatMap Cabal.extraLibs $ Cabal.allBuildInfo $ pkgDesc) }
       pkgDesc = fromMaybe (error "addExtraLibDependencies: no PackageDescription") $ getL packageDescription deb
-
-anyrel' :: BinPkgName -> [Relation]
-anyrel' x = [Rel x Nothing Nothing]
 
 -- | Write the files of the debianization @d@ to the directory @top@.
 writeDebianization :: Top -> Atoms -> IO ()
diff --git a/src/Debian/Debianize/Dependencies.hs b/src/Debian/Debianize/Dependencies.hs
--- a/src/Debian/Debianize/Dependencies.hs
+++ b/src/Debian/Debianize/Dependencies.hs
@@ -56,7 +56,7 @@
   = BuildDepends Dependency
   | BuildTools Dependency
   | PkgConfigDepends Dependency
-  | ExtraLibs D.BinPkgName
+  | ExtraLibs Relations
     deriving (Eq, Show)
 
 -- | In cabal a self dependency probably means the library is needed
@@ -109,8 +109,10 @@
           map PkgConfigDepends pkgconfigDepends ++
           map ExtraLibs (fixDeps extraLibs)
     where
-      fixDeps :: [String] -> [D.BinPkgName]
-      fixDeps xs = concatMap (\ cab -> maybe [D.BinPkgName ("lib" ++ cab ++ "-dev")] Set.toList (Map.lookup cab (getL extraLibMap atoms))) xs
+      fixDeps :: [String] -> [Relations]
+      fixDeps xs = concatMap (\ cab -> maybe [[[D.Rel (D.BinPkgName ("lib" ++ cab ++ "-dev")) Nothing Nothing]]]
+                                             Set.toList
+                                             (Map.lookup cab (getL extraLibMap atoms))) xs
 
 putBuildDeps :: Atoms -> Atoms
 putBuildDeps deb =
@@ -125,7 +127,7 @@
            [D.Rel (D.BinPkgName "haskell-devscripts") (Just (D.GRE (parseDebianVersion ("0.8" :: String)))) Nothing],
            anyrel "cdbs",
            anyrel "ghc"] ++
-            (map (: []) (Set.toList (getL buildDeps deb))) ++
+            concat (Set.toList (getL buildDeps deb)) ++
             (if getL noProfilingLibrary deb then [] else [anyrel "ghc-prof"]) ++
             cabalDeps (getL packageDescription deb)
     where
@@ -144,7 +146,7 @@
     if getL noDocumentationLibrary deb
     then []
     else nub $ [anyrel "ghc-doc"] ++
-               (map (: []) (Set.toList (getL buildDepsIndep deb))) ++
+               concat (Set.toList (getL buildDepsIndep deb)) ++
                cabalDeps (getL packageDescription deb)
     where
       cabalDeps Nothing = []
@@ -171,24 +173,21 @@
     dependencies atoms Development name ranges ++
     dependencies atoms Profiling name ranges
 buildDependencies atoms dep@(ExtraLibs _) =
-    concat (map dependency $ adapt (getL execMap atoms) dep)
+    concat (adapt (getL execMap atoms) dep)
 buildDependencies atoms dep =
     case unboxDependency dep of
       Just (Dependency _name _ranges) ->
-          concat (map dependency $ adapt (getL execMap atoms) dep)
+          concat (adapt (getL execMap atoms) dep)
       Nothing ->
           []
 
-dependency :: D.BinPkgName -> D.Relations
-dependency name = [[D.Rel name Nothing Nothing]]
-
-adapt :: Map.Map String D.BinPkgName -> Dependency_ -> [D.BinPkgName]
+adapt :: Map.Map String Relations -> Dependency_ -> [Relations]
 adapt execMap (PkgConfigDepends (Dependency (PackageName pkg) _)) =
     maybe (aptFile pkg) (: []) (Map.lookup pkg execMap)
 adapt execMap (BuildTools (Dependency (PackageName pkg) _)) =
     maybe (aptFile pkg) (: []) (Map.lookup pkg execMap)
 adapt _flags (ExtraLibs x) = [x]
-adapt _flags (BuildDepends (Dependency (PackageName pkg) _)) = [D.BinPkgName pkg]
+adapt _flags (BuildDepends (Dependency (PackageName pkg) _)) = [[[D.Rel (D.BinPkgName pkg) Nothing Nothing]]]
 
 -- There are two reasons this may not work, or may work
 -- incorrectly: (1) the build environment may be a different
@@ -197,7 +196,7 @@
 -- environment might have different names, and (2) the package
 -- we are looking for may not be installed in the parent
 -- environment.
-aptFile :: String -> [D.BinPkgName] -- Maybe would probably be more correct
+aptFile :: String -> [Relations] -- Maybe would probably be more correct
 aptFile pkg =
     unsafePerformIO $
     do ret <- readProcessWithExitCode "apt-file" ["-l", "search", pkg ++ ".pc"] ""
@@ -205,7 +204,7 @@
                   (ExitSuccess, out, _) ->
                       case takeWhile (not . isSpace) out of
                         "" -> error $ "Unable to locate a package containing " ++ pkg ++ ", try using --exec-map " ++ pkg ++ "=<debname> or modL execMap (Map.insert (PackageName " ++ show pkg ++ ") (BinPkgName \"<debname>\")"
-                        s -> [D.BinPkgName s]
+                        s -> [[[D.Rel (D.BinPkgName s) Nothing Nothing]]]
                   _ -> []
 
 anyrel :: String -> [D.Relation]
diff --git a/src/Debian/Debianize/Options.hs b/src/Debian/Debianize/Options.hs
--- a/src/Debian/Debianize/Options.hs
+++ b/src/Debian/Debianize/Options.hs
@@ -14,7 +14,8 @@
 import Debian.Debianize.Utility (read')
 import Debian.Orphans ()
 import Debian.Policy (SourceFormat(Quilt3), parseMaintainer)
-import Debian.Relation (BinPkgName(..), SrcPkgName(..), Relation(..))
+import Debian.Relation (BinPkgName(..), SrcPkgName(..), Relations, Relation(..))
+import Debian.Relation.String (parseRelations)
 import Debian.Version (parseDebianVersion)
 import Distribution.PackageDescription (FlagName(..))
 import Distribution.Package (PackageName(..))
@@ -35,7 +36,7 @@
 -- | Options that modify other atoms.
 options :: [OptDescr (Atoms -> Atoms)]
 options =
-    [ Option "v" ["verbose"] (ReqArg (\ s atoms -> setL verbosity (read' (\ s -> error $ "verbose: " ++ show s) s) atoms) "n")
+    [ Option "v" ["verbose"] (ReqArg (\ s atoms -> setL verbosity (read' (\ s' -> error $ "verbose: " ++ show s') s) atoms) "n")
              "Change build verbosity",
       Option "n" ["dry-run", "compare"] (NoArg (\ atoms -> setL dryRun True atoms))
              "Just compare the existing debianization to the one we would generate.",
@@ -62,10 +63,20 @@
              "Set given flags in Cabal conditionals",
       Option "" ["maintainer"] (ReqArg (\ maint x -> setL maintainer (either (error ("Invalid maintainer string: " ++ show maint)) Just (parseMaintainer maint)) x) "Maintainer Name <email addr>")
              "Override the Maintainer name and email in $DEBEMAIL/$EMAIL/$DEBFULLNAME/$FULLNAME",
-      Option "" ["build-dep"] (ReqArg (\ name atoms -> modL buildDeps (Set.insert (Rel (BinPkgName name) Nothing Nothing)) atoms) "Debian binary package name")
-             "Specify a package to add to the build dependency list for this source package, e.g. '--build-dep libglib2.0-dev'.",
-      Option "" ["build-dep-indep"] (ReqArg (\ name atoms -> modL buildDepsIndep (Set.insert (Rel (BinPkgName name) Nothing Nothing)) atoms) "Debian binary package name")
-             "Specify a package to add to the architecture independent build dependency list for this source package, e.g. '--build-dep-indep perl'.",
+      Option "" ["build-dep"]
+                 (ReqArg (\ name atoms ->
+                              modL buildDeps
+                                       (case parseRelations name of
+                                          Right rss -> Set.insert rss
+                                          Left err -> error ("cabal-debian option --build-dep " ++ show name ++ ": " ++ show err)) atoms) "Debian package relations")
+                 "Specify a package to add to the build dependency list for this source package, e.g. '--build-dep libglib2.0-dev'.",
+      Option "" ["build-dep-indep"]
+                 (ReqArg (\ name atoms ->
+                              modL buildDepsIndep
+                                       (case parseRelations name of
+                                          Right rss -> Set.insert rss
+                                          Left err -> error ("cabal-debian option --build-dep-indep " ++ show name ++ ": " ++ show err)) atoms) "Debian binary package name")
+                 "Specify a package to add to the architecture independent build dependency list for this source package, e.g. '--build-dep-indep perl'.",
       Option "" ["dev-dep"] (ReqArg (\ name atoms -> modL extraDevDeps (Set.insert (Rel (BinPkgName name) Nothing Nothing)) atoms) "Debian binary package name")
              "Specify a package to add to the Depends: list of the -dev package, e.g. '--dev-dep libncurses5-dev'.  It might be good if this implied --build-dep.",
       Option "" ["depends"] (ReqArg (\ arg atoms -> foldr (\ (p, r) atoms' -> modL depends (Map.insertWith union p (singleton r)) atoms') atoms (parseDeps arg)) "deb:deb,deb:deb,...")
@@ -77,8 +88,8 @@
       Option "" ["provides"] (ReqArg (\ arg atoms -> foldr (\ (p, r) atoms' -> modL provides (Map.insertWith union p (singleton r)) atoms') atoms (parseDeps arg)) "deb:deb,deb:deb,...")
              "Specify pairs A:B of debian binary package names, each A gets a Provides: B.  Note that B can have debian style version relations",
       Option "" ["map-dep"] (ReqArg (\ pair atoms -> case break (== '=') pair of
-                                                       (cab, (_ : deb)) -> modL extraLibMap (Map.insertWith Set.union cab (singleton (b deb))) atoms
-                                                       (_, "") -> error "usage: --map-dep CABALNAME=DEBIANNAME") "CABALNAME=DEBIANNAME")
+                                                       (cab, (_ : deb)) -> modL extraLibMap (Map.insertWith Set.union cab (singleton (rels deb))) atoms
+                                                       (_, "") -> error "usage: --map-dep CABALNAME=RELATIONS") "CABALNAME=RELATIONS")
              "Specify a mapping from the name appearing in the Extra-Library field of the cabal file to a debian binary package name, e.g. --dep-map cryptopp=libcrypto-dev",
       Option "" ["deb-version"] (ReqArg (\ version atoms -> setL debVersion (Just (parseDebianVersion version)) atoms) "VERSION")
              "Specify the version number for the debian package.  This will pin the version and should be considered dangerous.",
@@ -90,8 +101,8 @@
                                                          _ -> error "usage: --epoch-map CABALNAME=DIGIT") "CABALNAME=DIGIT")
              "Specify a mapping from the cabal package name to a digit to use as the debian package epoch number, e.g. --epoch-map HTTP=1",
       Option "" ["exec-map"] (ReqArg (\ s atoms -> case break (== '=') s of
-                                                     (cab, (_ : deb)) -> modL execMap (Map.insertWith (flip const) cab (b deb)) atoms
-                                                     _ -> error "usage: --exec-map CABALNAME=DEBNAME") "EXECNAME=DEBIANNAME")
+                                                     (cab, (_ : deb)) -> modL execMap (Map.insertWith (flip const) cab (rels deb)) atoms
+                                                     _ -> error "usage: --exec-map EXECNAME=RELATIONS") "EXECNAME=RELATIONS")
              "Specify a mapping from the name appearing in the Build-Tool field of the cabal file to a debian binary package name, e.g. --exec-map trhsx=haskell-hsx-utils",
       Option "" ["omit-lt-deps"] (NoArg (setL omitLTDeps True))
              "Don't generate the << dependency when we see a cabal equals dependency.",
@@ -138,3 +149,9 @@
 
 b :: String -> BinPkgName
 b = BinPkgName
+
+rels :: String -> Relations
+rels s =
+    case parseRelations s of
+      Right relss -> relss
+      _ -> error $ "Parse error in debian relations: " ++ show s
diff --git a/src/Debian/Debianize/Tests.hs b/src/Debian/Debianize/Tests.hs
--- a/src/Debian/Debianize/Tests.hs
+++ b/src/Debian/Debianize/Tests.hs
@@ -358,7 +358,7 @@
                                                                , "  Install this somewhere other than creativeprompts.com to run automated"
                                                                , "  backups of the database."])) .
                            modL Atoms.depends (Map.insertWith union (BinPkgName "creativeprompts-server") (singleton (anyrel (BinPkgName "markdown")))) .
-                           modL execMap (Map.insertWith (error "Conflict in execMap") "trhsx" (BinPkgName "haskell-hsx-utils")) .
+                           modL execMap (Map.insertWith (error "Conflict in execMap") "trhsx" [[Rel (BinPkgName "haskell-hsx-utils") Nothing Nothing]]) .
                            doBackups (BinPkgName "creativeprompts-backups") "creativeprompts-backups" .
                            doServer (BinPkgName "creativeprompts-development") (theServer (BinPkgName "creativeprompts-development")) .
                            doWebsite (BinPkgName "creativeprompts-production") (theSite (BinPkgName "creativeprompts-production")) .
@@ -439,7 +439,7 @@
                   log <- inputChangeLog (Top "test-data/artvaluereport-data/input")
                   new <- debianization (Top "test-data/artvaluereport-data/input")
                            (return .
-                            modL buildDeps (Set.insert (Rel (BinPkgName "haskell-hsx-utils") Nothing Nothing)) .
+                            modL buildDeps (Set.insert [[Rel (BinPkgName "haskell-hsx-utils") Nothing Nothing]]) .
                             modL control (\ y -> y {homepage = Just "http://artvaluereportonline.com"}) .
                             setL sourceFormat (Just Native3) .
                             setL changelog (Just log) .
@@ -454,7 +454,7 @@
     TestCase ( do old <- inputDebianization (Top "test-data/alex/output")
                   new <- debianization (Top "test-data/alex/input")
                            (return .
-                            modL buildDeps (Set.insert (Rel (BinPkgName "alex") Nothing Nothing)) .
+                            modL buildDeps (Set.insert [[Rel (BinPkgName "alex") Nothing Nothing]]) .
                             doExecutable (BinPkgName "alex") (InstallFile {execName = "alex", destName = "alex", sourceDir = Nothing, destDir = Nothing}) .
                             setL debVersion (Just (parseDebianVersion ("3.0.2-1~hackage1" :: String))) .
                             setL sourceFormat (Just Native3) .
diff --git a/src/Debian/Policy.hs b/src/Debian/Policy.hs
--- a/src/Debian/Policy.hs
+++ b/src/Debian/Policy.hs
@@ -111,13 +111,13 @@
 parseStandardsVersion :: String -> StandardsVersion
 parseStandardsVersion s =
     case filter (/= ".") (groupBy (\ a b -> (a == '.') == (b == '.')) s) of
-      (a : b : c : d : _) -> StandardsVersion (read' (\ s -> error $ "StandardsVersion" ++ show s) a)
-                                              (read' (\ s -> error $ "StandardsVersion" ++ show s) b)
-                                              (read' (\ s -> error $ "StandardsVersion" ++ show s) c)
-                                              (Just (read' (\ s -> error $ "StandardsVersion" ++ show s) d))
-      (a : b : c : _) -> StandardsVersion (read' (\ s -> error $ "StandardsVersion" ++ show s) a)
-                                          (read' (\ s -> error $ "StandardsVersion" ++ show s) b)
-                                          (read' (\ s -> error $ "StandardsVersion" ++ show s) c) Nothing
+      (a : b : c : d : _) -> StandardsVersion (read' (error . ("StandardsVersion" ++) . show) a)
+                                              (read' (error . ("StandardsVersion" ++) . show) b)
+                                              (read' (error . ("StandardsVersion" ++) . show) c)
+                                              (Just (read' (error . ("StandardsVersion" ++) . show) d))
+      (a : b : c : _) -> StandardsVersion (read' (error . ("StandardsVersion" ++) . show) a)
+                                          (read' (error . ("StandardsVersion" ++) . show) b)
+                                          (read' (error . ("StandardsVersion" ++) . show) c) Nothing
       _ -> error $ "Invalid Standards-Version string: " ++ show s
 
 data SourceFormat
