diff --git a/ChangeLog b/ChangeLog
new file mode 100644
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,122 @@
+* 0.8.7 (2013-12-31)
+- new "install" command wrapping "cabal install"
+- "build" command renamed to "rpm"
+- sort devel Requires
+- cblrpm-diff: allow package arg
+- support copying tarball fetched from another remote-repo (CodeBlock)
+- hlint cleanup
+- support AGPL license in Cabal-1.18
+
+* 0.8.6 (2013-10-04)
+- check for _darcs or .git dir in package topdir not pwd
+
+* 0.8.5 (2013-09-29)
+- fix repoquery when a package update exists for C lib
+- make cblrpm-diff quieter
+
+* 0.8.4 (2013-09-28)
+- use repoquery to determine extra C library dependencies
+- quote "pkgconfig(foo)" for rpm query and yum install
+- show sudo command before sudo password prompt appears
+- exclude hsc2hs from build tool deps
+- devel provides ghc-<pkg>-static
+- drop release from initial changelog entry for packager to add an entry
+- do not try to fetch tarball for a darcs or git source dir
+
+* 0.8.3 (2013-07-12)
+- only try to install missing dependencies
+- for executables depending on own lib add BR chrpath and %ghc_fix_dynamic_rpath
+- word-wrap generic descriptions
+- map ffi to libffi
+- move modules to toplevel
+- Rpm module split into Spec and Build in Commands/
+
+* 0.8.2 (2013-07-02)
+- handle pkg-ver arg, and check cabal list is non-empty
+- sort all generated deps
+- use yum-builddep again to install deps
+- copy tarball into cwd for rpmbuild
+- warn about long synopsis rather than multiline
+- wrap after end of sentence near end of line
+- use _isa in requires ghc-<pkg>
+- --version now outputs to stdout
+- new --force flag to overwrite existing .spec file
+
+* 0.8.1 (2013-06-14)
+- word wrapping of descriptions
+- use generic description for shared subpackage
+- simplify logic for summary and description processing
+
+* 0.8.0 (2013-05-31)
+- new simplier revision to Fedora Packaging
+  - drop %common_summary and %common_description
+  - drop %ghc_package, %ghc_description, %ghc_devel_package,
+    %ghc_devel_description, %ghc_devel_post_postun, %ghc_files,
+    and %ghc_devel_requires
+- check external programs available before use
+- tweaks for ghc-7.6.3 and Cabal-1.16
+
+* 0.7.1 (2013-03-22)
+- add final full-stop to description if missing
+- add ver-rel to initial changelog entry
+- fix use of cblrpm-diff force lib option
+- output warning when .spec already exists
+- fix handling of package names that end in a digit
+- output when trying a path
+- map curl C dep to libcurl
+
+* 0.7.0 (2013-01-22)
+- cabal-rpm command renamed to cblrpm, and cabal-rpm-diff to cblrpm-diff
+- cblrpm now has commands for spec, srpm, and build
+- cblrpm will try to install packaged uninstalled depends with sudo yum install
+- add %ghc_arches_with_ghci for hamlet dep
+- cblrpm-diff supports -l
+- cblrpm --version
+- sort extralibs depends
+- cleanup of unused options and help output
+
+* 0.6.6 (2012-11-21)
+- generate BRs and Req's for C libraries (extra-libraries)
+- initial map for some C libs: libglut, libiw, libz, libX*
+- generate BRs and Req's for pkgconfig-depends
+- generate BRs for build-tools
+- initial map for build-tools: gtk2hs-buildtools
+- map LGPL-2.1 license to LGPLv2+ tag
+- backup suffix changed from .cabal-rpm to .cblrpm
+- don't mistake non-existent file in cwd for a package
+
+* 0.6.5 (2012-11-01)
+- drop hscolour BuildRequires
+- simplify generated BuildRequires: drop version ranges for now,
+  exclude pkg self, base libs, and Cabal
+- use ExclusiveArch ghc_arches_with_ghci for template-haskell dep
+- replace --name option with --library to force Lib
+
+* 0.6.4 (2012-09-25)
+- add cabal-rpm-diff
+- fix manpage generation
+
+* 0.6.3 (2012-09-24)
+- support tarball path argument
+- use a temporary working dir for opening tarball or cabal unpack
+- add a manpage
+
+* 0.6.2 (2012-09-10)
+- fix output of L/GPL version
+
+* 0.6.1 (2012-07-25)
+bugfixes:
+- fix "cabal-rpm pkg" when other *pkg* packages exist in hackage
+- always generate the extra docs list from the pkg src dir!
+- now no backslash at end of common_description
+
+* 0.6.0 (2012-07-24)
+- updated to work with Cabal >= 1.10 and current cabal2spec style packaging
+  using currently actively used ghc-rpm-macros
+- should generate haskell dependencies correctly and also summary and
+  description text
+- some of the generic compiler supported was dropped for simplicity
+- rpmbuild support will be re-introduced in a future version
+
+* 0.5.1 and earlier (2007-2008) released by Bryan O'Sullivan
+- should work with ghc-6.8
diff --git a/NEWS b/NEWS
deleted file mode 100644
--- a/NEWS
+++ /dev/null
@@ -1,113 +0,0 @@
-* 0.8.6 (2013-10-04)
-- check for _darcs or .git dir in package topdir not pwd
-
-* 0.8.5 (2013-09-29)
-- fix repoquery when a package update exists for C lib
-- make cblrpm-diff quieter
-
-* 0.8.4 (2013-09-28)
-- use repoquery to determine extra C library dependencies
-- quote "pkgconfig(foo)" for rpm query and yum install
-- show sudo command before sudo password prompt appears
-- exclude hsc2hs from build tool deps
-- devel provides ghc-<pkg>-static
-- drop release from initial changelog entry for packager to add an entry
-- do not try to fetch tarball for a darcs or git source dir
-
-* 0.8.3 (2013-07-12)
-- only try to install missing dependencies
-- for executables depending on own lib add BR chrpath and %ghc_fix_dynamic_rpath
-- word-wrap generic descriptions
-- map ffi to libffi
-- move modules to toplevel
-- Rpm module split into Spec and Build in Commands/
-
-* 0.8.2 (2013-07-02)
-- handle pkg-ver arg, and check cabal list is non-empty
-- sort all generated deps
-- use yum-builddep again to install deps
-- copy tarball into cwd for rpmbuild
-- warn about long synopsis rather than multiline
-- wrap after end of sentence near end of line
-- use _isa in requires ghc-<pkg>
-- --version now outputs to stdout
-- new --force flag to overwrite existing .spec file
-
-* 0.8.1 (2013-06-14)
-- word wrapping of descriptions
-- use generic description for shared subpackage
-- simplify logic for summary and description processing
-
-* 0.8.0 (2013-05-31)
-- new simplier revision to Fedora Packaging
-  - drop %common_summary and %common_description
-  - drop %ghc_package, %ghc_description, %ghc_devel_package,
-    %ghc_devel_description, %ghc_devel_post_postun, %ghc_files,
-    and %ghc_devel_requires
-- check external programs available before use
-- tweaks for ghc-7.6.3 and Cabal-1.16
-
-* 0.7.1 (2013-03-22)
-- add final full-stop to description if missing
-- add ver-rel to initial changelog entry
-- fix use of cblrpm-diff force lib option
-- output warning when .spec already exists
-- fix handling of package names that end in a digit
-- output when trying a path
-- map curl C dep to libcurl
-
-* 0.7.0 (2013-01-22)
-- cabal-rpm command renamed to cblrpm, and cabal-rpm-diff to cblrpm-diff
-- cblrpm now has commands for spec, srpm, and build
-- cblrpm will try to install packaged uninstalled depends with sudo yum install
-- add %ghc_arches_with_ghci for hamlet dep
-- cblrpm-diff supports -l
-- cblrpm --version
-- sort extralibs depends
-- cleanup of unused options and help output
-
-* 0.6.6 (2012-11-21)
-- generate BRs and Req's for C libraries (extra-libraries)
-- initial map for some C libs: libglut, libiw, libz, libX*
-- generate BRs and Req's for pkgconfig-depends
-- generate BRs for build-tools
-- initial map for build-tools: gtk2hs-buildtools
-- map LGPL-2.1 license to LGPLv2+ tag
-- backup suffix changed from .cabal-rpm to .cblrpm
-- don't mistake non-existent file in cwd for a package
-
-* 0.6.5 (2012-11-01)
-- drop hscolour BuildRequires
-- simplify generated BuildRequires: drop version ranges for now,
-  exclude pkg self, base libs, and Cabal
-- use ExclusiveArch ghc_arches_with_ghci for template-haskell dep
-- replace --name option with --library to force Lib
-
-* 0.6.4 (2012-09-25)
-- add cabal-rpm-diff
-- fix manpage generation
-
-* 0.6.3 (2012-09-24)
-- support tarball path argument
-- use a temporary working dir for opening tarball or cabal unpack
-- add a manpage
-
-* 0.6.2 (2012-09-10)
-- fix output of L/GPL version
-
-* 0.6.1 (2012-07-25)
-bugfixes:
-- fix "cabal-rpm pkg" when other *pkg* packages exist in hackage
-- always generate the extra docs list from the pkg src dir!
-- now no backslash at end of common_description
-
-* 0.6.0 (2012-07-24)
-- updated to work with Cabal >= 1.10 and current cabal2spec style packaging
-  using currently actively used ghc-rpm-macros
-- should generate haskell dependencies correctly and also summary and
-  description text
-- some of the generic compiler supported was dropped for simplicity
-- rpmbuild support will be re-introduced in a future version
-
-* 0.5.1 and earlier (2007-2008) released by Bryan O'Sullivan
-- should work with ghc-6.8
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,13 +3,13 @@
 # cabal-rpm
 
 cabal-rpm creates RPM spec files for packaging Haskell Cabal-based packages.
+It can also act as a cabal-install wrapper which installs dependencies
+packaged in Fedora before running "cabal install".
 
-This version updates the older cabal-rpm-0.5.1 package by Bryan O'Sullivan
-(see README.orig) to work with current Cabal and also updated to current RPM
-packaging conventions defined until now by cabal2spec which is used by Fedora
-and also OpenSuSE.  It is licensed under the terms of the GPL version 3
-(see the COPYING file).  It is designed to replace the simple cabal2spec tool
-shell script made by the maintainer.
+Cabal-rpm was originally created by Bryan O'Sullivan (see README.orig)
+but has since been updated to work with current Cabal and Fedora Packaging
+Guidelines replacing cabal2spec.  It is used by Fedora and (patched) OpenSuSE. 
+It is licensed under the terms of the GPL version 3 (see the COPYING file).
 
 You can build from source as normal by running `cabal install`
 or via Hackage with `cabal install cabal-rpm`.
@@ -19,6 +19,12 @@
 It currently needs Cabal 1.10 or later to build (ie ghc7),
 but it should not be hard to patch it to build at least for ghc-6.12.
 
+## Installation
+The package is on Hackage. If you have cabal-install (part of Haskell Platform)
+you can install simply with
+
+    $ cabal install cabal-rpm
+
 ## Usage
 To create a `.spec` file for a Haskell src package in the current dir:
 
@@ -38,23 +44,28 @@
 
 You can also package directly from hackage:
 
-    $ cblrpm build somepkg
+    $ cblrpm srpm somepkg
 
 or
 
-    $ cblrpm build somepkg-0.1
+    $ cblrpm rpm somepkg-0.1
 
 will unpack the (latest) 'somepkg' package from hackage
 (if the dir does not exist, otherwise it uses the existing dir),
 create a spec file for it, and build it.
 
-cblrpm always creates `.spec` files in the current dir
+cblrpm creates `.spec` files in the current dir
 and if a `.spec` file already exists it will append `.cblrpm`
 to the generated filename to avoid overwriting an existing file.
 
+    $ cblrpm install [pkg][-ver]
+
+will yum install available missing dependencies and
+run "cabal install" to build the package.
+
 ## Development
 The latest source code is available from: https://github.com/juhp/cabal-rpm
 
 ## Plans
-More features are planned and patches welcome, including recursive packaging.
+More features are planned and patches welcome.
 See the TODO file for more details.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,8 @@
+#!/usr/bin/env runghc
+
+module Main where
+
+import Distribution.Simple
+
+main :: IO ()
+main = defaultMain
diff --git a/Setup.lhs b/Setup.lhs
deleted file mode 100644
--- a/Setup.lhs
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env runghc
-
-> module Main where
-
-> import Distribution.Simple
-
-> main :: IO ()
-> main = defaultMain
diff --git a/cabal-rpm.cabal b/cabal-rpm.cabal
--- a/cabal-rpm.cabal
+++ b/cabal-rpm.cabal
@@ -1,26 +1,10 @@
 Name:                cabal-rpm
-Version:             0.8.6
+Version:             0.8.7
 Synopsis:            RPM package creator for Haskell Cabal-based packages
 Description:
     This package generates RPM packages from Haskell Cabal packages.
     .
-    Recent changes:
-    .
-    * 0.8.6: check for _darcs or .git dir in package topdir not pwd
-    .
-    * 0.8.5: fix repoquery when a package update exists for C lib; make cblrpm-diff quieter
-    .
-    * 0.8.4: use repoquery for C deps, pkgconfig quoting, devel provides static
-    .
-    * 0.8.3: only install missing dependencies, word-wrap generic descriptions
-    .
-    * 0.8.2: wrap after sentences near end of line, handle pkg-ver arg, sort deps
-    .
-    * 0.8.1: word wrapping of descriptions
-    .
-    * 0.8.0: new simpler revised Fedora packaging; check external commands available
-    .
-    See <https://github.com/juhp/cabal-rpm/blob/master/NEWS> for more history and details.
+    See <https://github.com/juhp/cabal-rpm/blob/master/ChangeLog> for history details.
 Homepage:            https://github.com/juhp/cabal-rpm
 Bug-reports:         https://github.com/juhp/cabal-rpm/issues
 License:             GPL-3
@@ -31,7 +15,7 @@
                      2012-2013 Jens Petersen <petersen@fedoraproject.org>
 Category:            Distribution
 Build-type:          Simple
-Extra-source-files:  README.md NEWS man/cblrpm.1.md man/cblrpm.1 cblrpm-diff
+Extra-source-files:  README.md ChangeLog man/cblrpm.1.md man/cblrpm.1 cblrpm-diff
 Cabal-version:       >=1.6
 
 source-repository head
@@ -50,8 +34,10 @@
                    time,
                    unix
     Other-modules:
-        Commands.Build,
+        Commands.Install,
+        Commands.RpmBuild,
         Commands.Spec,
+        Depends,
         PackageUtils,
         Setup,
         SysCmd
diff --git a/cblrpm-diff b/cblrpm-diff
--- a/cblrpm-diff
+++ b/cblrpm-diff
@@ -27,19 +27,26 @@
   esac
 fi
 
-if [ $# -ne 1 -o ! -r "$1" ]; then
+if [ $# -ne 1 ]; then
     echo "Usage: $(basename $0) [-l] [hackage|hackage.tar.gz|hackage.cabal]"
     echo "  -l      assume BinLib package is Lib"
     exit 1
 fi
 
-FILE=$1
+case $0 in
+    /*) CBLRPM=$(dirname $0)/cblrpm ;;
+    *) CBLRPM=cblrpm ;;
+esac
 
+PKG=$1
+
 WORKDIR=$(mktemp --tmpdir=. -d)
 
 cd $WORKDIR
 
-if ! cblrpm -v0 $FORCE_LIB spec ../$FILE; then
+if [ ! -r ../$PKG ]; then
+    $CBLRPM -v0 $FORCE_LIB spec $PKG
+elif ! $CBLRPM -v0 $FORCE_LIB spec ../$PKG; then
     cd ..
     rm -r $WORKDIR
     exit 1
@@ -50,7 +57,7 @@
 cd ..
 
 if [ ! -r "$SPECFILE" ]; then
-  echo No $SPECFILE file found for $FILE
+  echo "No $SPECFILE file found in current directory"
   rm -r $WORKDIR
   exit 1
 fi
diff --git a/man/cblrpm.1 b/man/cblrpm.1
--- a/man/cblrpm.1
+++ b/man/cblrpm.1
@@ -5,8 +5,9 @@
 .SH SYNOPSIS
 .PP
 cblrpm [\f[I]options\f[]] spec [\f[I]path\-or\-pkg\f[]] cblrpm
-[\f[I]options\f[]] build [\f[I]path\-or\-pkg\f[]] cblrpm
+[\f[I]options\f[]] rpm [\f[I]path\-or\-pkg\f[]] cblrpm
 [\f[I]options\f[]] srpm [\f[I]path\-or\-pkg\f[]]
+[\f[I]options\f[]] install [\f[I]path\-or\-pkg\f[]]
 .SH DESCRIPTION
 .PP
 cblrpm generates RPM .spec files from Haskell Cabal package.
diff --git a/man/cblrpm.1.md b/man/cblrpm.1.md
--- a/man/cblrpm.1.md
+++ b/man/cblrpm.1.md
@@ -7,8 +7,9 @@
 
 # SYNOPSIS
 cblrpm [*options*] spec [*path-or-pkg*]
-cblrpm [*options*] build [*path-or-pkg*]
+cblrpm [*options*] rpm [*path-or-pkg*]
 cblrpm [*options*] srpm [*path-or-pkg*]
+cblrpm [*options*] install [*path-or-pkg*]
 
 # DESCRIPTION
 cblrpm generates RPM .spec files from Haskell Cabal package.
@@ -49,25 +50,27 @@
 : Override the version number in the .spec file.
 
 # EXAMPLES
-Create a .spec file for the Cabal src package in current directory:
+Below CMD can be one of: spec, srpm, rpm, and install.
 
-    cblrpm spec
+Do CMD for the Cabal src package in current directory:
 
-Create a .spec file for package (directory or package name):
+    cblrpm CMD
+
+Do CMD for package (directory or package name):
  
-    cblrpm spec [package]
+    cblrpm CMD [package]
 
-Create a .spec file for package-version (directory or package name):
+Do CMD for package-version (directory or package name):
 
-    cblrpm spec [package-version]
+    cblrpm CMD [package-version]
 
-Create a .spec file for a .cabal file:
+Do CMD on a .cabal file:
 
-    cblrpm spec path/to/some.cabal
+    cblrpm CMD path/to/some.cabal
 
-Create a .spec file from a tarball:
+Do CMD for a tarball:
 
-    cblrpm spec path/to/pkg-ver.tar.gz
+    cblrpm CMD path/to/pkg-ver.tar.gz
 
 # HISTORY
 Cabal-rpm was originally written by Bryan O'Sullivan in 2007-2008
diff --git a/src/Commands/Build.hs b/src/Commands/Build.hs
deleted file mode 100644
--- a/src/Commands/Build.hs
+++ /dev/null
@@ -1,109 +0,0 @@
--- |
--- Module      :  Commands.Build
--- Copyright   :  Bryan O'Sullivan 2007, 2008
---                Jens Petersen 2012-2013
---
--- Maintainer  :  Jens Petersen <petersen@fedoraproject.org>
--- Stability   :  alpha
--- Portability :  portable
---
--- Explanation: Support for building RPM packages.  Can also generate
--- an RPM spec file if you need a basic one to hand-customize.
-
--- This software may be used and distributed according to the terms of
--- the GNU General Public License, incorporated herein by reference.
-
-module Commands.Build (
-    rpmBuild
-    ) where
-
-import Commands.Spec (createSpecFile)
-import PackageUtils (packageName, packageVersion,
-                                      simplePackageDescription)
-import Setup (RpmFlags (..))
-import SysCmd (tryReadProcess, trySystem, optionalSudo, systemBool, (+-+))
-
---import Control.Exception (bracket)
-import Control.Monad    (filterM, liftM, unless, when)
-
-import Distribution.PackageDescription (GenericPackageDescription (..),
-                                        PackageDescription (..),
-                                        hasExes)
-
---import Distribution.Version (VersionRange, foldVersionRange')
-
-import System.Directory (copyFile, doesFileExist, doesDirectoryExist,
-                         getCurrentDirectory)
-import System.Environment (getEnv)
-import System.FilePath.Posix (takeDirectory, (</>))
-
--- autoreconf :: Verbosity -> PackageDescription -> IO ()
--- autoreconf verbose pkgDesc = do
---     ac <- doesFileExist "configure.ac"
---     when ac $ do
---         c <- doesFileExist "configure"
---         when (not c) $ do
---             setupMessage verbose "Running autoreconf" pkgDesc
---             trySystem "autoreconf"
-
-rpmBuild :: FilePath -> GenericPackageDescription -> RpmFlags -> Bool -> IO ()
-rpmBuild cabalPath genPkgDesc flags binary = do
---    let verbose = rpmVerbosity flags
-    pkgDesc <- simplePackageDescription genPkgDesc flags
---    bracket (setFileCreationMask 0o022) setFileCreationMask $ \ _ -> do
---      autoreconf verbose pkgDesc
-    specFile <- specFileName pkgDesc flags
-    specFileExists <- doesFileExist specFile
-    if specFileExists
-      then putStrLn $ "Using existing" +-+ specFile
-      else createSpecFile cabalPath genPkgDesc flags
-    let pkg = package pkgDesc
-        name = packageName pkg
-    when binary $ do
-      br_out <- tryReadProcess "rpmspec" ["-q", "--buildrequires", specFile]
-      missing <- filterM notInstalled $ lines br_out
-      unless (null missing) $ do
-        putStrLn $ "Installing dependencies:"
-        mapM_ putStrLn missing
-        optionalSudo $ "yum install" +-+ (unwords $ map show missing)
-
-    cwd <- getCurrentDirectory
-    home <- getEnv "HOME"
-    let version = packageVersion pkg
-        cachedir = home </> ".cabal/packages/hackage.haskell.org" </> name </> version
-        tarFile = name ++ "-" ++ version ++ ".tar.gz"
-        rpmCmd = if binary then "a" else "s"
-    tarFileExists <- doesFileExist tarFile
-    unless tarFileExists $ do
-      let pkgDir = takeDirectory cabalPath
-      darcsRepo <- doesDirectoryExist $ pkgDir </> "_darcs"
-      unless darcsRepo $ do
-        gitRepo <- doesDirectoryExist $ pkgDir </> ".git"
-        unless (darcsRepo || gitRepo) $ do
-          trySystem ("cabal fetch -v0 --no-dependencies" +-+ name ++ "-" ++ version)
-          copyFile (cachedir </> tarFile) (cwd </> tarFile)
-    tarFileExists' <- doesFileExist tarFile
-    if tarFileExists'
-      then trySystem ("rpmbuild -b" ++ rpmCmd +-+
-                      "--define \"_rpmdir" +-+ cwd ++ "\"" +-+
-                      "--define \"_srcrpmdir" +-+ cwd ++ "\"" +-+
-                      "--define \"_sourcedir" +-+ cwd ++ "\"" +-+
-                      specFile)
-      else error $ "No" +-+ tarFile +-+ "found"
-  where
-    notInstalled :: String -> IO Bool
-    notInstalled br = do
-      liftM not $ systemBool $ "rpm -q --whatprovides" +-+ (shellQuote br)
-    shellQuote :: String -> String
-    shellQuote (c:cs) = (if (elem c "()") then (['\\', c] ++) else (c:)) (shellQuote cs)
-    shellQuote "" = ""
-
-specFileName :: PackageDescription    -- ^pkg description
-               -> RpmFlags            -- ^rpm flags
-               -> IO FilePath
-specFileName pkgDesc flags = do
-    let pkg = package pkgDesc
-        name = packageName pkg
-        pkgname = if isExec then name else "ghc-" ++ name
-        isExec = if (rpmLibrary flags) then False else hasExes pkgDesc
-    return $ pkgname ++ ".spec"
diff --git a/src/Commands/Install.hs b/src/Commands/Install.hs
new file mode 100644
--- /dev/null
+++ b/src/Commands/Install.hs
@@ -0,0 +1,47 @@
+-- |
+-- Module      :  Commands.Install
+-- Copyright   :  Jens Petersen 2012-2013
+--
+-- Maintainer  :  Jens Petersen <petersen@fedoraproject.org>
+-- Stability   :  alpha
+-- Portability :  portable
+--
+-- Explanation: cabal wrapper which yum installs dependencies
+
+-- This software may be used and distributed according to the terms of
+-- the GNU General Public License, incorporated herein by reference.
+
+module Commands.Install (
+    install
+    ) where
+
+import Depends (dependencies)
+import PackageUtils (packageName, simplePackageDescription)
+import Setup (RpmFlags (..))
+import SysCmd (trySystem, systemBool, yumInstall, (+-+))
+
+import Control.Monad    (filterM, liftM)
+
+import Distribution.PackageDescription (GenericPackageDescription (..),
+                                        PackageDescription (..))
+import System.Directory (setCurrentDirectory)
+import System.FilePath.Posix (takeDirectory)
+
+install :: FilePath -> GenericPackageDescription -> RpmFlags -> IO ()
+install cabalPath genPkgDesc flags = do
+    pkgDesc <- simplePackageDescription genPkgDesc flags
+    let pkg = package pkgDesc
+        name = packageName pkg
+    (deps, tools, clibs, pkgcfgs, _) <- dependencies pkgDesc name
+    missing <- filterM notInstalled $ deps ++ tools ++ clibs ++ pkgcfgs
+    yumInstall missing
+    let pkgDir = takeDirectory cabalPath
+    setCurrentDirectory pkgDir
+    trySystem "cabal install"
+  where
+    notInstalled :: String -> IO Bool
+    notInstalled br =
+      liftM not $ systemBool $ "rpm -q --whatprovides" +-+ shellQuote br
+    shellQuote :: String -> String
+    shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs)
+    shellQuote "" = ""
diff --git a/src/Commands/RpmBuild.hs b/src/Commands/RpmBuild.hs
new file mode 100644
--- /dev/null
+++ b/src/Commands/RpmBuild.hs
@@ -0,0 +1,120 @@
+-- |
+-- Module      :  Commands.RpmBuild
+-- Copyright   :  Bryan O'Sullivan 2007, 2008
+--                Jens Petersen 2012-2013
+--
+-- Maintainer  :  Jens Petersen <petersen@fedoraproject.org>
+-- Stability   :  alpha
+-- Portability :  portable
+--
+-- Explanation: Support for building RPM packages.  Can also generate
+-- an RPM spec file if you need a basic one to hand-customize.
+
+-- This software may be used and distributed according to the terms of
+-- the GNU General Public License, incorporated herein by reference.
+
+module Commands.RpmBuild (
+    rpmBuild
+    ) where
+
+import Commands.Spec (createSpecFile)
+import PackageUtils (isScmDir, packageName, packageVersion,
+                                      simplePackageDescription)
+import Setup (RpmFlags (..))
+import SysCmd (tryReadProcess, trySystem, systemBool, yumInstall, (+-+))
+
+--import Control.Exception (bracket)
+import Control.Applicative ((<$>))
+import Control.Monad    (filterM, liftM, unless, when)
+
+import Data.List (isPrefixOf)
+
+import Distribution.PackageDescription (GenericPackageDescription (..),
+                                        PackageDescription (..),
+                                        hasExes)
+
+--import Distribution.Version (VersionRange, foldVersionRange')
+
+import System.Directory (copyFile, doesFileExist,
+                         getCurrentDirectory, getDirectoryContents)
+import System.Environment (getEnv)
+import System.FilePath.Posix (takeDirectory, (</>))
+
+-- autoreconf :: Verbosity -> PackageDescription -> IO ()
+-- autoreconf verbose pkgDesc = do
+--     ac <- doesFileExist "configure.ac"
+--     when ac $ do
+--         c <- doesFileExist "configure"
+--         when (not c) $ do
+--             setupMessage verbose "Running autoreconf" pkgDesc
+--             trySystem "autoreconf"
+
+rpmBuild :: FilePath -> GenericPackageDescription -> RpmFlags -> Bool -> IO ()
+rpmBuild cabalPath genPkgDesc flags binary = do
+--    let verbose = rpmVerbosity flags
+    pkgDesc <- simplePackageDescription genPkgDesc flags
+--    bracket (setFileCreationMask 0o022) setFileCreationMask $ \ _ -> do
+--      autoreconf verbose pkgDesc
+    specFile <- specFileName pkgDesc flags
+    specFileExists <- doesFileExist specFile
+    if specFileExists
+      then putStrLn $ "Using existing" +-+ specFile
+      else createSpecFile cabalPath genPkgDesc flags
+    let pkg = package pkgDesc
+        name = packageName pkg
+    when binary $ do
+      br_out <- tryReadProcess "rpmspec" ["-q", "--buildrequires", specFile]
+      missing <- filterM notInstalled $ lines br_out
+      yumInstall missing
+
+    let version = packageVersion pkg
+        tarFile = name ++ "-" ++ version ++ ".tar.gz"
+        rpmCmd = if binary then "a" else "s"
+
+    tarFileExists <- doesFileExist tarFile
+    unless tarFileExists $ do
+      scmRepo <- isScmDir $ takeDirectory cabalPath
+      when scmRepo $
+        error "No tarball for source repo"
+
+    cwd <- getCurrentDirectory
+    copyTarball name version False cwd
+    trySystem ("rpmbuild -b" ++ rpmCmd +-+
+               "--define \"_rpmdir" +-+ cwd ++ "\"" +-+
+               "--define \"_srcrpmdir" +-+ cwd ++ "\"" +-+
+               "--define \"_sourcedir" +-+ cwd ++ "\"" +-+
+               specFile)
+  where
+    notInstalled :: String -> IO Bool
+    notInstalled br =
+      liftM not $ systemBool $ "rpm -q --whatprovides" +-+ shellQuote br
+    shellQuote :: String -> String
+    shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs)
+    shellQuote "" = ""
+    copyTarball :: String -> String -> Bool -> FilePath -> IO ()
+    copyTarball n v ranFetch dest = do
+      home <- getEnv "HOME"
+      let cacheparent = home </> ".cabal" </> "packages"
+          tarfile = n ++ "-" ++ v ++ ".tar.gz"
+          tarpath = n </> v </> tarfile
+      remotes <- filter (not . isPrefixOf ".") <$> getDirectoryContents cacheparent
+      let paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes
+      -- if more than one tarball, should maybe warn if they are different
+      tarballs <- filterM doesFileExist paths
+      if null tarballs
+        then if ranFetch
+             then error $ "No" +-+ tarfile +-+ "found"
+             else do
+               trySystem ("cabal fetch -v0 --no-dependencies" +-+ n ++ "-" ++ v)
+               copyTarball n v True dest
+        else copyFile (head tarballs) (dest </> tarfile)
+
+specFileName :: PackageDescription    -- ^pkg description
+               -> RpmFlags            -- ^rpm flags
+               -> IO FilePath
+specFileName pkgDesc flags = do
+    let pkg = package pkgDesc
+        name = packageName pkg
+        pkgname = if isExec then name else "ghc-" ++ name
+        isExec = not (rpmLibrary flags) && hasExes pkgDesc
+    return $ pkgname ++ ".spec"
diff --git a/src/Commands/Spec.hs b/src/Commands/Spec.hs
--- a/src/Commands/Spec.hs
+++ b/src/Commands/Spec.hs
@@ -18,16 +18,16 @@
   createSpecFile
   ) where
 
-import PackageUtils (buildDependencies,
-                     depName, packageName, packageVersion,
-                     simplePackageDescription, showDep)
+import Depends (dependencies, showDep)
+import PackageUtils (isScmDir, packageName, packageVersion,
+                     simplePackageDescription)
 import Setup (RpmFlags (..))
-import SysCmd ((+-+), tryReadProcess)
+import SysCmd ((+-+))
 
 --import Control.Exception (bracket)
 import Control.Monad    (unless, when)
 import Data.Char        (toLower)
-import Data.List        (groupBy, isPrefixOf, isSuffixOf, nub, sort)
+import Data.List        (groupBy, isPrefixOf, isSuffixOf, sort)
 import Data.Maybe       (fromMaybe)
 import Data.Time.Clock  (UTCTime, getCurrentTime)
 import Data.Time.Format (formatTime)
@@ -38,18 +38,16 @@
 import Distribution.Simple.Utils (warn)
 
 import Distribution.PackageDescription (PackageDescription (..), exeName,
-                                        hasExes, hasLibs, withExe, allBuildInfo,
-                                        BuildInfo (..))
+                                        hasExes, hasLibs, withExe,
+                                        GenericPackageDescription (..))
 
 --import Distribution.Version (VersionRange, foldVersionRange')
 
-import Distribution.PackageDescription (GenericPackageDescription (..))
 
-import System.Directory (doesDirectoryExist, doesFileExist,
-                         getDirectoryContents)
+import System.Directory (doesFileExist, getDirectoryContents)
 import System.IO     (IOMode (..), hClose, hPutStrLn, openFile)
 import System.Locale (defaultTimeLocale)
-import System.FilePath (dropFileName, takeDirectory, (</>))
+import System.FilePath (dropFileName, takeDirectory)
 
 import qualified Paths_cabal_rpm (version)
 
@@ -57,9 +55,8 @@
 defaultRelease :: FilePath -> UTCTime -> IO String
 defaultRelease cabalPath now = do
     let pkgDir = takeDirectory cabalPath
-    darcsRepo <- doesDirectoryExist $ pkgDir </> "_darcs"
-    gitRepo <- doesDirectoryExist $ pkgDir </> ".git"
-    return $ if (darcsRepo || gitRepo)
+    scmRepo <- isScmDir pkgDir
+    return $ if scmRepo
                then formatTime defaultTimeLocale "0.%Y%m%d" now
                else "1"
 
@@ -89,11 +86,11 @@
         version = packageVersion pkg
         release = fromMaybe defRelease (rpmRelease flags)
         specFile = pkgname ++ ".spec"
-        isExec = if (rpmLibrary flags) then False else hasExes pkgDesc
+        isExec = not (rpmLibrary flags) && hasExes pkgDesc
         isLib = hasLibs pkgDesc
         isBinLib = isExec && isLib
     specAlreadyExists <- doesFileExist specFile
-    let specFilename = specFile ++ if (not $ rpmForce flags) && specAlreadyExists then ".cblrpm" else ""
+    let specFilename = specFile ++ if not (rpmForce flags) && specAlreadyExists then ".cblrpm" else ""
     when specAlreadyExists $ putStrLn $ specFile +-+ "exists:" +-+ "creating" +-+ specFilename
     h <- openFile specFilename WriteMode
     let putHdr hdr val = hPutStrLn h (hdr ++ ":" ++ padding hdr ++ val)
@@ -111,19 +108,19 @@
     let syn = synopsis pkgDesc
     when (null syn) $
       warn verbose "this package has no synopsis."
-    let syn' = if (null syn)
-              then ("Haskell" +-+ name +-+ "package")
-              else (unwords $ lines syn)
+    let syn' = if null syn
+              then "Haskell" +-+ name +-+ "package"
+              else unwords $ lines syn
     let summary = rstrip (== '.') syn'
-    when ((length $ "Summary     : " ++ syn') > 79) $
+    when (length ("Summary     : " ++ syn') > 79) $
       warn verbose "this package has a long synopsis."
 
     let descr = description pkgDesc
     when (null descr) $
       warn verbose "this package has no description."
     let descLines = (formatParagraphs . lines . finalPeriod) $
-          if (null descr) then syn' else descr
-        finalPeriod cs = if (last cs == '.') then cs else cs ++ "."
+          if null descr then syn' else descr
+        finalPeriod cs = if last cs == '.' then cs else cs ++ "."
 
     when isLib $ do
       putDef "pkg_name" name
@@ -139,26 +136,14 @@
     putHdr "Source0" $ "http://hackage.haskell.org/packages/archive/" ++ pkg_name ++ "/%{version}/" ++ pkg_name ++ "-%{version}.tar.gz"
     putNewline
     putHdr "BuildRequires" "ghc-Cabal-devel"
-    putHdr "BuildRequires" $ "ghc-rpm-macros"
-
-    let (deps, selfdep) = buildDependencies pkgDesc name
-        buildinfo = allBuildInfo pkgDesc
-        excludedTools n = notElem n ["ghc", "hsc2hs", "perl"]
-        mapTools "gtk2hsC2hs" = "gtk2hs-buildtools"
-        mapTools "gtk2hsHookGenerator" = "gtk2hs-buildtools"
-        mapTools "gtk2hsTypeGen" = "gtk2hs-buildtools"
-        mapTools tool = tool
-        chrpath = if selfdep then ["chrpath"] else []
-        tools = filter excludedTools $ nub $ (map (mapTools . depName) $ concat (map buildTools buildinfo)) ++ chrpath
-        pkgcfgs = nub $ map depName $ concat (map pkgconfigDepends buildinfo)
-        showPkgCfg p = "pkgconfig(" ++ p ++ ")"
+    putHdr "BuildRequires" "ghc-rpm-macros"
 
-    clibs <- mapM repoqueryLib $ concat (map extraLibs buildinfo)
-    when (not . null $ deps ++ tools ++ clibs ++ pkgcfgs) $ do
+    (deps, tools, clibs, pkgcfgs, selfdep) <- dependencies pkgDesc name
+    unless (null $ deps ++ tools ++ clibs ++ pkgcfgs) $ do
       put "# Begin cabal-rpm deps:"
-      let pkgdeps = sort $ map showDep deps ++ tools ++ map (++ "%{?_isa}") clibs ++ map showPkgCfg pkgcfgs
+      let pkgdeps = sort $ deps ++ tools ++ clibs ++ pkgcfgs
       mapM_ (putHdr "BuildRequires") pkgdeps
-      when (any (\ d -> elem d ["template-haskell", "hamlet"]) deps) $
+      when (any (\ d -> d `elem` map showDep ["template-haskell", "hamlet"]) deps) $
         putHdr "ExclusiveArch" "%{ghc_arches_with_ghci}"
       put "# End cabal-rpm deps"
 
@@ -185,10 +170,9 @@
       putHdr "Requires(post)" "ghc-compiler = %{ghc_version}"
       putHdr "Requires(postun)" "ghc-compiler = %{ghc_version}"
       putHdr "Requires" $ (if isExec then "ghc-%{name}" else "%{name}") ++ "%{?_isa} = %{version}-%{release}"
-      when (not . null $ clibs ++ pkgcfgs) $ do
+      unless (null $ clibs ++ pkgcfgs) $ do
         put "# Begin cabal-rpm deps:"
-        mapM_ (putHdr "Requires") $ map (++ "%{?_isa}") clibs
-        mapM_ (putHdr "Requires") $ map showPkgCfg pkgcfgs
+        mapM_ (putHdr "Requires") $ sort $ clibs ++ pkgcfgs
         put "# End cabal-rpm deps"
       putNewline
       put $ "%description" +-+ ghcPkgDevel
@@ -215,14 +199,14 @@
     putNewline
 
     when isLib $ do
+      let putInstallScript = do
+            put "%ghc_pkg_recache"
+            putNewline
+            putNewline
       put $ "%post" +-+ ghcPkgDevel
-      put "%ghc_pkg_recache"
-      putNewline
-      putNewline
+      putInstallScript
       put $ "%postun" +-+ ghcPkgDevel
-      put "%ghc_pkg_recache"
-      putNewline
-      putNewline
+      putInstallScript
 
     docs <- findDocs cabalPath pkgDesc
 
@@ -293,15 +277,19 @@
 showLicense (Apache Nothing) = "ASL ?"
 showLicense (Apache (Just ver)) = "ASL" +-+ showVersion ver
 #endif
+#if MIN_VERSION_Cabal(1,18,0)
+showLicense (AGPL Nothing) = "AGPLv?"
+showLicense (AGPL (Just ver)) = "AGPLv" ++ showVersion ver
+#endif
 
 -- from http://stackoverflow.com/questions/930675/functional-paragraphs
 -- using split would be: map unlines . (Data.List.Split.splitWhen null)
 paragraphs :: [String] -> [String]
-paragraphs = map unlines . map (filter $ not . null) . groupBy (const $ not . null)
+paragraphs = map (unlines . filter (not . null)) . groupBy (const $ not . null)
 
 -- http://rosettacode.org/wiki/Word_wrap#Haskell
 wordwrap :: Int -> String -> String
-wordwrap maxlen = (wrap_ 0 False) . words where
+wordwrap maxlen = wrap_ 0 False . words where
 	wrap_ _ _ [] = "\n"
 	wrap_ pos eos (w:ws)
 		-- at line start: put down the word no matter what
@@ -314,13 +302,3 @@
 
 formatParagraphs :: [String] -> [String]
 formatParagraphs = map (wordwrap 79) . paragraphs
-
-repoqueryLib :: String -> IO String
-repoqueryLib lib = do
-  let lib_path = "/usr/lib/lib" ++ lib ++ ".so"
-  out <- tryReadProcess "repoquery" ["--qf=%{name}", "-qf", lib_path]
-  let pkgs = nub $ words out
-  case pkgs of
-    [pkg] -> return pkg
-    [] -> error $ "Could not resolve package that provides lib" ++ lib_path
-    _ -> error $ "More than one package seems to provide lib" ++ lib_path ++ ": " ++ (show pkgs)
diff --git a/src/Depends.hs b/src/Depends.hs
new file mode 100644
--- /dev/null
+++ b/src/Depends.hs
@@ -0,0 +1,68 @@
+-- |
+-- Module      :  Depends
+-- Copyright   :  Jens Petersen 2012-2013
+--
+-- Maintainer  :  Jens Petersen <petersen@fedoraproject.org>
+-- Stability   :  alpha
+-- Portability :  portable
+--
+-- Explanation: Dependency info
+
+-- This software may be used and distributed according to the terms of
+-- the GNU General Public License, incorporated herein by reference.
+
+module Depends (
+  dependencies, showDep
+  ) where
+
+import SysCmd (tryReadProcess)
+
+import Data.List        (nub)
+
+import Distribution.Package  (Dependency (..), PackageName (..))
+import Distribution.PackageDescription (PackageDescription (..),
+                                        allBuildInfo,
+                                        BuildInfo (..))
+
+-- returns list of deps and whether package is self-dependent
+buildDependencies :: PackageDescription -> String -> ([String], Bool)
+buildDependencies pkgDesc self =
+  let deps = nub $ map depName (buildDepends pkgDesc)
+      excludedPkgs n = notElem n [self, "Cabal", "base", "ghc-prim", "integer-gmp"] in
+  (filter excludedPkgs deps, self `elem` deps)
+
+depName :: Dependency -> String
+depName (Dependency (PackageName n) _) = n
+
+showDep :: String -> String
+showDep p = "ghc-" ++ p ++ "-devel"
+
+dependencies :: PackageDescription  -- ^pkg description
+                -> String           -- ^pkg name
+                -> IO ([String], [String], [String], [String], Bool)
+                -- ^depends, tools, c-libs, pkgcfg, selfdep
+dependencies pkgDesc self = do
+    let (deps, selfdep) = buildDependencies pkgDesc self
+        buildinfo = allBuildInfo pkgDesc
+        excludedTools n = n `notElem` ["ghc", "hsc2hs", "perl"]
+        mapTools "gtk2hsC2hs" = "gtk2hs-buildtools"
+        mapTools "gtk2hsHookGenerator" = "gtk2hs-buildtools"
+        mapTools "gtk2hsTypeGen" = "gtk2hs-buildtools"
+        mapTools tool = tool
+        chrpath = ["chrpath" | selfdep]
+        tools = filter excludedTools $ nub $ map (mapTools . depName) (concatMap buildTools buildinfo) ++ chrpath
+        pkgcfgs = nub $ map depName $ concatMap pkgconfigDepends buildinfo
+
+    clibs <- mapM repoqueryLib $ concatMap extraLibs buildinfo
+    let showPkgCfg p = "pkgconfig(" ++ p ++ ")"
+    return (map showDep deps, tools, map (++ "%{?_isa}") clibs, map showPkgCfg pkgcfgs, selfdep)
+    
+repoqueryLib :: String -> IO String
+repoqueryLib lib = do
+  let lib_path = "/usr/lib/lib" ++ lib ++ ".so"
+  out <- tryReadProcess "repoquery" ["--qf=%{name}", "-qf", lib_path]
+  let pkgs = nub $ words out
+  case pkgs of
+    [pkg] -> return pkg
+    [] -> error $ "Could not resolve package that provides lib" ++ lib_path
+    _ -> error $ "More than one package seems to provide lib" ++ lib_path ++ ": " ++ show pkgs
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -14,7 +14,8 @@
 
 module Main where
 
-import Commands.Build (rpmBuild)
+import Commands.Install (install)
+import Commands.RpmBuild (rpmBuild)
 import Commands.Spec (createSpecFile)
 import Setup (RpmFlags (..), parseArgs)
 import SysCmd (tryReadProcess, trySystem)
@@ -45,9 +46,11 @@
           case cmd of
                "spec" ->  createSpecFile cabalPath genPkgDesc opts
                "srpm" ->  rpmBuild cabalPath genPkgDesc opts False
-               "build" -> rpmBuild cabalPath genPkgDesc opts True
+               "rpm" -> rpmBuild cabalPath genPkgDesc opts True
+               "install" -> install cabalPath genPkgDesc opts
+--               "builddep" -> 
+--               "depends" -> 
 --               "install" ->
---               "builddep" ->
 --               "showdeps" ->
                c -> error $ "Unknown cmd: " ++ c
           maybe (return ()) removeDirectoryRecursive mtmp
@@ -77,13 +80,12 @@
     else do
       isfile <- doesFileExist path
       if not isfile
-        then if (isJust $ matchRegex pkg_re path)
-             then do
-               tryUnpack path
+        then if isJust $ matchRegex pkg_re path
+             then tryUnpack path
              else error $ path ++ ": No such file or directory"
         else if takeExtension path == ".cabal"
              then return (path, Nothing)
-             else if isSuffixOf ".tar.gz" path
+             else if ".tar.gz" `isSuffixOf` path
                   then do
                     tmpdir <- mktempdir
                     trySystem $ "tar zxf " ++ path ++ " -C " ++ tmpdir ++ " *.cabal"
@@ -95,11 +97,11 @@
 
 tryUnpack :: String -> IO (FilePath, Maybe FilePath)
 tryUnpack pkg = do
-  pkgver <- if elem '.' pkg then return pkg
+  pkgver <- if '.' `elem` pkg then return pkg
             else do
               contains_pkg <- tryReadProcess "cabal" ["list", "--simple-output", pkg]
-              let pkgs = filter ((== pkg) . fst . break (== ' ')) $ lines contains_pkg
-              if (null pkgs)
+              let pkgs = filter ((== pkg) . takeWhile (not . (== ' '))) $ lines contains_pkg
+              if null pkgs
                 then error $ pkg ++ " hackage not found"
                 else return $ map (\c -> if c == ' ' then '-' else c) $ last pkgs
   isdir <- doesDirectoryExist pkgver
diff --git a/src/PackageUtils.hs b/src/PackageUtils.hs
--- a/src/PackageUtils.hs
+++ b/src/PackageUtils.hs
@@ -12,22 +12,19 @@
 -- the GNU General Public License, incorporated herein by reference.
 
 module PackageUtils (
-  buildDependencies,
-  depName,
+  isScmDir,
   packageName,
   packageVersion,
-  simplePackageDescription,
-  showDep
+  simplePackageDescription
     ) where
 
 import Setup (RpmFlags (..))
 
-import Data.List     (nub)
 import Data.Version     (showVersion)
 
 import Distribution.Compiler (CompilerFlavor (..))
 
-import Distribution.Package  (Dependency (..), PackageIdentifier (..),
+import Distribution.Package  (PackageIdentifier (..),
                               PackageName (..))
 import Distribution.PackageDescription (GenericPackageDescription (..),
                                         PackageDescription (..))
@@ -41,6 +38,9 @@
 
 import Distribution.System            (Platform (..), buildArch, buildOS)
 
+import System.Directory (doesDirectoryExist)
+import System.FilePath.Posix ((</>))
+
 simplePackageDescription :: GenericPackageDescription -> RpmFlags
                          -> IO PackageDescription
 simplePackageDescription genPkgDesc flags = do
@@ -58,17 +58,13 @@
   where PackageName name = pkgName pkg
 
 packageVersion :: PackageIdentifier -> String
-packageVersion pkg = (showVersion . pkgVersion) pkg
-
--- returns list of deps and whether package is self-dependent
-buildDependencies :: PackageDescription -> String -> ([String], Bool)
-buildDependencies pkgDesc self =
-  let deps = nub $ map depName (buildDepends pkgDesc)
-      excludedPkgs n = notElem n $ [self, "Cabal", "base", "ghc-prim", "integer-gmp"] in
-  (filter excludedPkgs deps, elem self deps)
+packageVersion = showVersion . pkgVersion
 
-depName :: Dependency -> String
-depName (Dependency (PackageName n) _) = n
+(<||>) :: IO Bool -> IO Bool -> IO Bool
+(<||>) f s = do
+  one <- f
+  if one then return True else s
 
-showDep :: String -> String
-showDep p = "ghc-" ++ p ++ "-devel"
+isScmDir :: FilePath -> IO Bool
+isScmDir dir =
+  doesDirectoryExist (dir </> ".git") <||> doesDirectoryExist (dir </> "_darcs")
diff --git a/src/Setup.hs b/src/Setup.hs
--- a/src/Setup.hs
+++ b/src/Setup.hs
@@ -91,8 +91,8 @@
             ++ "Commands:\n"
             ++ "  spec\t generate a spec file\n"
             ++ "  srpm\t generate a src rpm file\n"
-            ++ "  build\t build rpm package\n"
---             ++ "  install\t install rpm package\n"
+            ++ "  rpm\t build rpm package\n"
+            ++ "  install user install package\n"
 --             ++ "  mock\t mock build package\n"
             ++ "\n"
             ++ "Options:"
@@ -106,7 +106,7 @@
        printHelp stdout
        exitSuccess
      when (rpmVersion opts) $ do
-       hPutStrLn stdout $ showVersion version
+       putStrLn $ showVersion version
        exitSuccess
      unless (null errs) $ do
        hPutStrLn stderr "Error:"
@@ -116,7 +116,7 @@
        hPutStr stderr "Unrecognised options: "
        hPutStrLn stderr $ unwords unknown
        exitWith (ExitFailure 1)
-     when ((null args') || (notElem (head args') ["spec", "srpm", "build", "install"])) $ do
+     when (null args' || notElem (head args') ["spec", "srpm", "rpm", "install"]) $ do
        printHelp stderr
        exitWith (ExitFailure 1)
      when (length args' > 2) $ do
diff --git a/src/SysCmd.hs b/src/SysCmd.hs
--- a/src/SysCmd.hs
+++ b/src/SysCmd.hs
@@ -16,16 +16,17 @@
   requireProgram,
   trySystem,
   tryReadProcess,
-  optionalSudo,
   systemBool,
+  yumInstall,
   (+-+)) where
 
-import Control.Monad    (when)
+import Control.Monad    (when, unless)
 import Data.Maybe       (isJust, isNothing)
 
 import Distribution.Simple.Utils (die, warn, findProgramLocation)
 import Distribution.Verbosity (normal)
 
+import System.Posix.User (getEffectiveUserID)
 import System.Process (readProcess, system)
 import System.Exit (ExitCode(..))
 
@@ -40,22 +41,6 @@
     when (isNothing mavail) $ warn normal (cmd ++ ": command not found")
     return $ isJust mavail
 
-optionalSudo :: String -> IO ()
-optionalSudo cmd = do
-    havesudo <- optionalProgram "sudo"
-    when havesudo $ do
-      let argv = words cmd
-          cmd0 =  head argv 
-      mavail <- findProgramLocation normal cmd0
-      case mavail of
-        Nothing -> warn normal $ cmd0 ++ ": command not found"
-        Just _ -> do
-          putStrLn $ "Running:" +-+ "sudo" +-+ cmd
-          ret <- system $ "sudo" +-+ cmd
-          case ret of
-            ExitSuccess -> return ()
-            ExitFailure n -> warn normal ("\"" ++ cmd ++ "\"" +-+ "failed with status" +-+ show n)
-
 trySystem :: String -> IO ()
 trySystem cmd = do
     requireProgram $ head $ words cmd
@@ -82,3 +67,22 @@
 s +-+ "" = s
 s +-+ t = s ++ " " ++ t
 
+yumInstall :: [String] -> IO ()
+yumInstall pkgs =
+  unless (null pkgs) $ do
+    putStrLn "Uninstalled dependencies:"
+    mapM_ putStrLn pkgs
+    uid <- getEffectiveUserID
+    cmdprefix <-
+      if uid == 0
+      then return ""
+      else do
+        havesudo <- optionalProgram "sudo"
+        return $ if havesudo then "sudo" else ""
+    requireProgram "yum"
+    let args = unwords $ map showPkg pkgs
+    putStrLn $ "Running:" +-+ cmdprefix +-+ "yum install" +-+ args
+    trySystem $ cmdprefix +-+ "yum install" +-+ args
+
+showPkg :: String -> String
+showPkg p = if '(' `elem` p then show p else p
