diff --git a/cabal-rpm.cabal b/cabal-rpm.cabal
--- a/cabal-rpm.cabal
+++ b/cabal-rpm.cabal
@@ -1,5 +1,5 @@
 Name: cabal-rpm
-Version: 0.3.3
+Version: 0.4
 License: GPL
 License-File: COPYING
 Author: Bryan O'Sullivan <bos@serpentine.com>
@@ -30,4 +30,4 @@
       Distribution.Package.Rpm.Setup
   Hs-Source-Dirs: src
   Extensions: CPP
-  GHC-options: -fwarn-missing-signatures
+  GHC-options: -fwarn-missing-signatures -Wall
diff --git a/src/Distribution/Package/Rpm.hs b/src/Distribution/Package/Rpm.hs
--- a/src/Distribution/Package/Rpm.hs
+++ b/src/Distribution/Package/Rpm.hs
@@ -21,7 +21,7 @@
     ) where
 
 import Control.Exception (bracket)
-import Control.Monad (filterM, liftM, mapM, when, unless)
+import Control.Monad (mapM, when, unless)
 import Data.Char (toLower)
 import Data.List (find, intersperse, isPrefixOf, sort)
 import Data.Maybe
@@ -32,16 +32,15 @@
 import System.Directory (canonicalizePath, createDirectoryIfMissing,
                          doesDirectoryExist, doesFileExist,
                          getDirectoryContents)
-import System.Environment (getProgName)
 import System.Exit (ExitCode(..))
-import System.IO
+import System.IO (IOMode(..), hClose, hGetLine, hPutStr, hPutStrLn, openFile)
 import System.Locale (defaultTimeLocale)
 import System.Process (runInteractiveCommand, waitForProcess)
 
 import System.FilePath ((</>))
 import Distribution.Simple.Compiler (CompilerFlavor(..), Compiler(..),
                                      compilerVersion)
-import Distribution.License
+import Distribution.License (License(..))
 import Distribution.Package (PackageIdentifier(..))
 import Distribution.Simple.PreProcess (knownSuffixHandlers)
 import Distribution.Simple.Program (defaultProgramConfiguration)
@@ -56,26 +55,36 @@
                                         Library(..),
                                         PackageDescription(..),
                                         emptyHookedBuildInfo,
-                                        exeName, flattenPackageDescription,
+                                        exeName, finalizePackageDescription,
                                         hasLibs, setupMessage, withExe,
                                         withLib)
-import Distribution.Verbosity (Verbosity(..))
+import Distribution.Verbosity (Verbosity)
 import Distribution.Version (Dependency(..), VersionRange(..), withinRange)
-import Distribution.Simple.Setup (emptyConfigFlags)
+import Distribution.Simple.Setup (configConfigurationsFlags, emptyConfigFlags)
 import Distribution.Package.Rpm.Setup (RpmFlags(..))
 import System.Posix.Files (setFileCreationMask)
 
+simplePackageDescription :: GenericPackageDescription -> RpmFlags
+                         -> IO PackageDescription
+simplePackageDescription genPkgDesc flags =
+    case finalizePackageDescription (rpmConfigurationsFlags flags)
+         Nothing "" "" ("", Version [] []) genPkgDesc of
+      Left _ -> die "finalize failed"
+      Right (pd, _) -> return pd
+    
 rpm :: GenericPackageDescription -- ^info from the .cabal file
     -> RpmFlags                 -- ^rpm flags
     -> IO ()
 
 rpm genPkgDesc flags = do
-    case rpmCompiler flags of
+    let comp = rpmCompiler flags
+    case comp of
       Just GHC -> return ()
       Just c -> die ("the " ++ show c ++ " compiler is not yet supported")
+      _ -> die "no compiler information provided"
     if rpmGenSpec flags
       then do
-        let pkgDesc = flattenPackageDescription genPkgDesc
+        pkgDesc <- simplePackageDescription genPkgDesc flags
         (name, extraDocs) <- createSpecFile False pkgDesc flags "."
         putStrLn $ "Spec file created: " ++ name
         when ((not . null) extraDocs) $ do
@@ -110,33 +119,33 @@
               ExitSuccess -> return ()
               ExitFailure n -> die ("autoreconf failed with status " ++ show n)
 
-localBuildInfo :: PackageDescription -> IO LocalBuildInfo
-localBuildInfo pkgDesc = do
+localBuildInfo :: PackageDescription -> RpmFlags -> IO LocalBuildInfo
+localBuildInfo pkgDesc flags = do
   mb_lbi <- maybeGetPersistBuildConfig
   case mb_lbi of
     Just lbi -> return lbi
     Nothing -> configure (Right pkgDesc, emptyHookedBuildInfo)
-               (emptyConfigFlags defaultProgramConfiguration)
+               ((emptyConfigFlags defaultProgramConfiguration)
+                { configConfigurationsFlags = rpmConfigurationsFlags flags })
 
 rpmBuild :: GenericPackageDescription -> RpmFlags -> IO ()
 
 rpmBuild genPkgDesc flags = do
     tgtPfx <- canonicalizePath (maybe distPref id $ rpmTopDir flags)
-    let pkgDesc = flattenPackageDescription genPkgDesc
-        verbose = rpmVerbosity flags
+    pkgDesc <- simplePackageDescription genPkgDesc flags
+    let verbose = rpmVerbosity flags
         tmpDir = tgtPfx </> "src"
     flip mapM_ ["BUILD", "RPMS", "SOURCES", "SPECS", "SRPMS"] $ \ subDir -> do
       createDirectoryIfMissing True (tgtPfx </> subDir)
     let specsDir = tgtPfx </> "SPECS"
-    lbi <- localBuildInfo pkgDesc
+    lbi <- localBuildInfo pkgDesc flags
     bracket (setFileCreationMask 0o022) setFileCreationMask $ \ _ -> do
       autoreconf verbose pkgDesc
       (specFile, extraDocs) <- createSpecFile True pkgDesc flags specsDir
       tree <- prepareTree pkgDesc verbose (Just lbi) False tmpDir
               knownSuffixHandlers 0
       mapM_ (copyTo verbose tree) extraDocs
-      tarball <- createArchive pkgDesc verbose (Just lbi) tmpDir
-                 (tgtPfx </> "SOURCES")
+      createArchive pkgDesc verbose (Just lbi) tmpDir (tgtPfx </> "SOURCES")
       ret <- system ("rpmbuild -ba --define \"_topdir " ++ tgtPfx ++ "\" " ++
                      specFile)
       case ret of
@@ -155,6 +164,11 @@
 
 rstrip p = reverse . dropWhile p . reverse
 
+joinConfigurations :: [(String, Bool)] -> String
+joinConfigurations = unwords . map warm
+    where warm (name, True) = name
+          warm (name, _) = '-' : name
+
 createSpecFile :: Bool                -- ^whether to forcibly create file
                -> PackageDescription  -- ^info from the .cabal file
                -> RpmFlags            -- ^rpm flags
@@ -178,14 +192,16 @@
         buildRoot = "%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)"
         cmplrVersion = compilerVersion compiler
         doHaddock = rpmHaddock flags && hasLibs pkgDesc
-        (cmplr, runner) = case compilerFlavor compiler of
-             GHC -> ("ghc", "runghc")
-             Hugs -> ("hugs", "runhugs")
-             JHC -> ("jhc", "runjhc")
-             NHC -> ("nhc", "runnhc")
-             (OtherCompiler s) -> (s, "run" ++ s)
+        flavor = compilerFlavor compiler
         isExec = isExecutable pkgDesc
-        subPackage = if isExec then "-n %{hsc_namever}-%{f_pkg_name}" else ""
+        subPackage = if isExec then "-n %{hsc_name}-%{f_pkg_name}" else ""
+    (cmplr, runner) <- case flavor of
+                         GHC -> return ("ghc", "runghc")
+                         Hugs -> return ("hugs", "runhugs")
+                         JHC -> return ("jhc", "runjhc")
+                         NHC -> return ("nhc", "runnhc")
+                         (OtherCompiler s) -> return (s, "run" ++ s)
+                         _ -> die $ show flavor ++ " is not supported"
     unless force $ do
         specAlreadyExists <- doesFileExist specPath
         when specAlreadyExists $
@@ -193,7 +209,6 @@
     h <- openFile specPath WriteMode
     buildReq <- showBuildReq verbose doHaddock compiler pkgDesc
     runtimeReq <- showRuntimeReq verbose compiler pkgDesc
-    progName <- getProgName
     let putHdr hdr val = hPutStrLn h (hdr ++ ": " ++ val)
         putHdr_ hdr val = when (not $ null val) $
                               hPutStrLn h (hdr ++ ": " ++ val)
@@ -206,16 +221,20 @@
         date = formatTime defaultTimeLocale "%a %b %d %Y" now
     putDef "hsc_name" cmplr
     putDef "hsc_version" $ showVersion cmplrVersion
-    putDef "hsc_namever" $ compilerNameVersion compiler
+    put "#The first one might be upper case, the second one isn't."
     putDef "h_pkg_name" origName
     putDef "f_pkg_name" name
     putDef "pkg_libdir" "%{_libdir}/%{hsc_name}-%{hsc_version}/%{h_pkg_name}-%{version}"
+    putDef "tar_dir" "%{_builddir}/%{?buildsubdir}"
     putNewline
+    putDef "debug_package" "%{nil}"
+    put "#Haskell compilers do not traditionally emit DWARF data."
+    putNewline
     
     when isExec $ do
       putHdr "Name" "%{f_pkg_name}"
     unless isExec $ do
-      putHdr "Name" "%{hsc_namever}-%{f_pkg_name}"
+      putHdr "Name" "%{hsc_name}-%{f_pkg_name}"
     putHdr "Version" version
     putHdr "Release" $ release ++ "%{?dist}"
     putHdr "License" $ (showLicense . license) pkgDesc
@@ -244,7 +263,7 @@
     unless isExec $ do
       putHdr_ "Requires" extraReq
       putHdr_ "Requires" runtimeReq
-      putHdr "Provides" "%{h_pkg_name}-%{hsc_namever} = %{version}"
+      putHdr "Provides" "%{h_pkg_name}-%{hsc_name}-%{hsc_version} = %{version}"
 
     putNewline
     putNewline
@@ -268,17 +287,17 @@
        management system. -}
 
     when isExec $ withLib pkgDesc () $ \_ -> do
-        put "%package -n %{hsc_namever}-%{f_pkg_name}"
+        put "%package -n %{hsc_name}-%{f_pkg_name}"
         putHdrD "Summary" summary "This library package has no summary"
         putHdr "Group" "Development/Libraries"
         putHdr "Requires" "%{hsc_name} = %{hsc_version}"
         putHdr_ "Requires" extraReq
         putHdr_ "Requires" runtimeReq
-        putHdr "Provides" "%{h_pkg_name}-%{hsc_namever} = %{version}"
+        putHdr "Provides" "%{h_pkg_name}-%{hsc_name}-%{hsc_version} = %{version}"
         putNewline
         putNewline
 
-        put "%description -n %{hsc_namever}-%{f_pkg_name}"
+        put "%description -n %{hsc_name}-%{f_pkg_name}"
         putDesc
         putNewline
         put "This package contains libraries for %{hsc_name} %{hsc_version}."
@@ -286,15 +305,15 @@
         putNewline
 
     when (rpmLibProf flags) $ do
-        put "%package -n %{hsc_namever}-%{f_pkg_name}-prof"
-        putHdr "Summary" "Profiling libraries for %{hsc_namever}-%{f_pkg_name}"
+        put "%package -n %{hsc_name}-%{f_pkg_name}-prof"
+        putHdr "Summary" "Profiling libraries for %{hsc_name}-%{f_pkg_name}"
         putHdr "Group" "Development/Libraries"
-        putHdr "Requires" "%{hsc_namever}-%{f_pkg_name} = %{version}"
-        putHdr "Provides" "%{h_pkg_name}-%{hsc_namever}-prof = %{version}"
+        putHdr "Requires" "%{hsc_name}-%{f_pkg_name} = %{version}"
+        putHdr "Provides" "%{h_pkg_name}-%{hsc_name}-%{hsc_version}-prof = %{version}"
         putNewline
         putNewline
 
-        put "%description -n %{hsc_namever}-%{f_pkg_name}-prof"
+        put "%description -n %{hsc_name}-%{f_pkg_name}-prof"
         putDesc
         putNewline
         put "This package contains profiling libraries for %{hsc_name} %{hsc_version}."
@@ -309,8 +328,12 @@
     put "%build"
     put "if [ -f configure.ac -a ! -f configure ]; then autoreconf; fi"
     putSetup ("configure --prefix=%{_prefix} --libdir=%{_libdir} " ++
-              "--docdir=%{_docdir}/%{hsc_namever}-%{f_pkg_name}-%{version} " ++
+              "--docdir=%{_docdir}/%{hsc_name}-%{f_pkg_name}-%{version} " ++
               "--libsubdir='$compiler/$pkgid' " ++
+              (let cfg = rpmConfigurationsFlags flags
+               in if null cfg
+                  then ""
+                  else "--flags='" ++ joinConfigurations cfg ++ "' ") ++
               (if (rpmLibProf flags) then "--enable" else "--disable") ++
               "-library-profiling --" ++ cmplr)
     withLib pkgDesc () $ \_ -> do
@@ -336,14 +359,14 @@
     withLib pkgDesc () $ \_ -> do
         put "install -m 755 register.sh unregister.sh ${RPM_BUILD_ROOT}%{pkg_libdir}"
         put "cd ${RPM_BUILD_ROOT}"
-        put "echo '%defattr(-,root,root,-)' > %{_builddir}/%{?buildsubdir}/%{name}-files.prof"
-        put "find .%{pkg_libdir} \\( -name '*_p.a' -o -name '*.p_hi' \\) | sed s/^.// >> %{_builddir}/%{?buildsubdir}/%{name}-files.prof"
-        put "echo '%defattr(-,root,root,-)' > %{_builddir}/%{?buildsubdir}/%{name}-files.nonprof"
-        put "find .%{pkg_libdir} -type d | sed 's/^./%dir /' >> %{_builddir}/%{?buildsubdir}/%{name}-files.nonprof"
-        put "find .%{pkg_libdir} ! \\( -type d -o -name '*_p.a' -o -name '*.p_hi' \\) | sed s/^.// >> %{_builddir}/%{?buildsubdir}/%{name}-files.nonprof"
-        put "sed 's,^/,%exclude /,' %{_builddir}/%{?buildsubdir}/%{name}-files.prof >> %{_builddir}/%{?buildsubdir}/%{name}-files.nonprof"
+        put "echo '%defattr(-,root,root,-)' > %{tar_dir}/%{name}-files.prof"
+        put "find .%{pkg_libdir} \\( -name '*_p.a' -o -name '*.p_hi' \\) | sed s/^.// >> %{tar_dir}/%{name}-files.prof"
+        put "echo '%defattr(-,root,root,-)' > %{tar_dir}/%{name}-files.nonprof"
+        put "find .%{pkg_libdir} -type d | sed 's/^./%dir /' >> %{tar_dir}/%{name}-files.nonprof"
+        put "find .%{pkg_libdir} ! \\( -type d -o -name '*_p.a' -o -name '*.p_hi' \\) | sed s/^.// >> %{tar_dir}/%{name}-files.nonprof"
+        put "sed 's,^/,%exclude /,' %{tar_dir}/%{name}-files.prof >> %{tar_dir}/%{name}-files.nonprof"
     putNewline
-    put "cd ${RPM_BUILD_ROOT}/%{_datadir}/doc/%{hsc_namever}-%{f_pkg_name}-%{version}"
+    put "cd ${RPM_BUILD_ROOT}/%{_datadir}/doc/%{hsc_name}-%{f_pkg_name}-%{version}"
     put $ "rm -rf doc " ++ concat (intersperse " " docs)
     putNewline
     putNewline
@@ -405,7 +428,8 @@
         putNewline
 
         when (rpmLibProf flags) $ do
-            put "%files -n %{hsc_namever}-%{f_pkg_name}-prof -f %{name}-files.prof"
+            put "%files -n %{hsc_name}-%{f_pkg_name}-prof -f %{name}-files.prof"
+            put $ "%%doc " ++ licenseFile pkgDesc
             putNewline
             putNewline
     
@@ -439,8 +463,8 @@
     let docs = filter likely contents
     return $ if (null . licenseFile) pkgDesc
              then docs
-             else let license = licenseFile pkgDesc
-                  in license : filter (/= license) docs
+             else let lf = licenseFile pkgDesc
+                  in lf : filter (/= lf) docs
   where names = ["author", "copying", "doc", "example", "licence", "license",
                  "readme", "todo"]
         likely name = let lowerName = map toLower name
@@ -457,9 +481,12 @@
     name ++ squishedVersion
   where name = case flavour of
                GHC -> "ghc"
+               HBC -> "hbc"
+               Helium -> "helium"
                Hugs -> "hugs"
                JHC -> "jhc"
                NHC -> "nhc"
+               OtherCompiler c -> c
         squishedVersion = (concat . map show . versionBranch) version
 
 -- | Convert from license to RPM-friendly description.  The strings are
@@ -482,13 +509,14 @@
         -> Dependency
         -> Bool
 isBuiltIn cn cv (Dependency pkg version) = maybe False checkVersion $ do
-    (_, _, cb) <- find (\(n, v, _) -> (n,v) == (cn,cv)) builtIns
+    (_, _, cb) <- find (\(n, k, _) -> (n,k) == (cn,cv)) builtIns
     (_, pv) <- find (\(pn, _) -> pn == pkg) cb
     return pv
   where checkVersion = flip withinRange version
-        builtIns = [(GHC, Version [6,6,1] [], ghc661BuiltIns),
-                    (GHC, Version [6,6] [], ghc66BuiltIns),
-                    (GHC, Version [6,8,1] [], ghc681BuiltIns)]
+        builtIns = [(GHC, Version [6,6,1] [], ghc661BuiltIns)
+                   ,(GHC, Version [6,6] [], ghc66BuiltIns)
+                   ,(GHC, Version [6,8,1] [], ghc681BuiltIns)
+                   ,(GHC, Version [6,8,2] [], ghc682Builtins)]
         v n x = (n, Version x [])
         ghc682Builtins = [
             v "Cabal" [1,2,3,0],
@@ -672,19 +700,19 @@
 
 showRpmReq :: Verbosity -> (String -> String) -> Dependency -> IO [String]
 
-showRpmReq verbose f (Dependency pkg AnyVersion) =
+showRpmReq _ f (Dependency pkg AnyVersion) =
     return [f pkg]
-showRpmReq verbose f (Dependency pkg (ThisVersion v)) =
+showRpmReq _ f (Dependency pkg (ThisVersion v)) =
     return [f pkg ++ " = " ++ showVersion v]
-showRpmReq verbose f (Dependency pkg (EarlierVersion v)) =
+showRpmReq _ f (Dependency pkg (EarlierVersion v)) =
     return [f pkg ++ " < " ++ showVersion v]
-showRpmReq verbose f (Dependency pkg (LaterVersion v)) =
+showRpmReq _ f (Dependency pkg (LaterVersion v)) =
     return [f pkg ++ " > " ++ showVersion v]
-showRpmReq verbose f (Dependency pkg (UnionVersionRanges
+showRpmReq _ f (Dependency pkg (UnionVersionRanges
                          (ThisVersion v1)
                          (LaterVersion v2)))
     | v1 == v2 = return [f pkg ++ " >= " ++ showVersion v1]
-showRpmReq verbose f (Dependency pkg (UnionVersionRanges
+showRpmReq _ f (Dependency pkg (UnionVersionRanges
                          (ThisVersion v1)
                          (EarlierVersion v2)))
     | v1 == v2 = return [f pkg ++ " <= " ++ showVersion v1]
diff --git a/src/Distribution/Package/Rpm/Setup.hs b/src/Distribution/Package/Rpm/Setup.hs
--- a/src/Distribution/Package/Rpm/Setup.hs
+++ b/src/Distribution/Package/Rpm/Setup.hs
@@ -18,8 +18,9 @@
     ) where
 
 import Control.Monad (when)
+import Data.Char (toLower)
 import Distribution.Simple.Setup (defaultCompilerFlavor, CompilerFlavor(..))
-import Distribution.Verbosity (Verbosity(..), flagToVerbosity, normal)
+import Distribution.Verbosity (Verbosity, flagToVerbosity, normal)
 import System.Console.GetOpt (ArgDescr (..), ArgOrder (..), OptDescr (..),
                               usageInfo, getOpt')
 import System.Environment (getProgName)
@@ -29,6 +30,7 @@
 data RpmFlags = RpmFlags
     {
       rpmCompiler :: Maybe CompilerFlavor
+    , rpmConfigurationsFlags :: [(String, Bool)]
     , rpmGenSpec :: Bool
     , rpmHaddock :: Bool
     , rpmHelp :: Bool
@@ -48,6 +50,7 @@
 emptyRpmFlags = RpmFlags
     {
       rpmCompiler = defaultCompilerFlavor
+    , rpmConfigurationsFlags = []
     , rpmGenSpec = False
     , rpmHaddock = True
     , rpmHelp = False
@@ -86,7 +89,9 @@
       Option "" ["disable-optimization"] (NoArg (\x -> x { rpmOptimisation = False }))
              "Don't generate optimised code",
       Option "" ["disable-split-objs"] (NoArg (\x -> x { rpmSplitObjs = False }))
-             "Don't split object files up to save space",
+             "Don't split object files to save space",
+      Option "f" ["flags"] (ReqArg (\flags x -> x { rpmConfigurationsFlags = rpmConfigurationsFlags x ++ flagList flags }) "FLAGS")
+             "Set given flags in Cabal conditionals",
       Option "" ["release"] (ReqArg (\rel x -> x { rpmRelease = Just rel }) "RELEASE")
              "Override the default package release",
       Option "" ["topdir"] (ReqArg (\path x -> x { rpmTopDir = Just path }) "TOPDIR")
@@ -97,11 +102,18 @@
              "Override the default package version"
     ]
 
+-- Lifted from Distribution.Simple.Setup, since it's not exported.
+flagList :: String -> [(String, Bool)]
+flagList = map tagWithValue . words
+  where tagWithValue ('-':name) = (map toLower name, False)
+        tagWithValue name       = (map toLower name, True)
+
 printHelp :: Handle -> IO ()
 
 printHelp h = do
     progName <- getProgName
-    hPutStrLn h (usageInfo "Usage:" options)
+    let info = "Usage: " ++ progName ++ " [FLAGS]\n"
+    hPutStrLn h (usageInfo info options)
 
 parseArgs :: [String] -> IO RpmFlags
 
