diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+* 0.11.2 (2017-07-31)
+- fix cblrpm update --subpackage
+- fix rpm installation when no sudo (#49)
+- fix handling of no exposed modules (#50)
+- fix license handling for selfdep binlib (#51)
+
 * 0.11.1 (2017-03-13)
 - support building meta (compat) packages
 - invocation of optional stackage-query to update to LTS now works
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 [![Build Status](https://travis-ci.org/juhp/cabal-rpm.png)](https://travis-ci.org/juhp/cabal-rpm)
 [![Hackage](http://img.shields.io/hackage/v/cabal-rpm.png)](http://hackage.haskell.org/package/cabal-rpm)
+[![Stackage LTS](http://stackage.org/package/cabal-rpm/badge/lts)](http://stackage.org/lts/package/cabal-rpm)
+[![Stackage Nightly](http://stackage.org/package/cabal-rpm/badge/nightly)](http://stackage.org/nightly/package/cabal-rpm)
 
 # cabal-rpm
 
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.11.1
+Version:             0.11.2
 Synopsis:            RPM packaging tool for Haskell Cabal-based packages
 Description:
     This package provides a RPM packaging tool for Haskell Cabal-based packages.
@@ -24,7 +24,7 @@
 Extra-source-files:  README.md ChangeLog man/cabal-rpm.1.md man/cabal-rpm.1
 Cabal-version:       >=1.6
 Tested-with:         GHC == 7.0.4, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4,
-                     GHC == 7.10.3, GHC == 8.0.1
+                     GHC == 7.10.3, GHC == 8.0.2
 
 source-repository head
   type:     git
diff --git a/src/Commands/Spec.hs b/src/Commands/Spec.hs
--- a/src/Commands/Spec.hs
+++ b/src/Commands/Spec.hs
@@ -20,8 +20,8 @@
   createSpecFile, createSpecFile_
   ) where
 
-import Dependencies (notInstalled, missingPackages, packageDependencies,
-                     showDep, testsuiteDependencies)
+import Dependencies (notInstalled, packageDependencies, showDep,
+                     subPackages, testsuiteDependencies)
 import Distro (Distro(..), detectDistro)
 import Options (RpmFlags (..))
 import PackageUtils (copyTarball, getPkgName, isScmDir, latestPackage,
@@ -178,14 +178,15 @@
   let pkgver = if hasLib then "%{pkgver}" else pkg_name ++ "-%{version}"
 
   -- FIXME sort by build order
-  missing <- if rpmSubpackage flags then missingPackages pkgDesc else return []
-  subpackages <-
+  -- FIXME recursive missingdeps
+  missing <- if rpmSubpackage flags then subPackages (if specAlreadyExists then mspec else Nothing) pkgDesc else return []
+  subpkgs <-
     mapM ((getsubpkgMacro >=>
            \(m,pv) -> put ("%global" +-+ m +-+ pv) >> return ("%{" ++ m ++ "}"))
            . stripPkgDevel) missing
-  let hasSubpkgs = notNull subpackages
+  let hasSubpkgs = notNull subpkgs
   when hasSubpkgs $ do
-    put $ "%global subpkgs" +-+ unwords subpackages
+    put $ "%global subpkgs" +-+ unwords subpkgs
     putNewline
 
   unless (null testsuiteDeps) $ do
@@ -218,7 +219,7 @@
   putHdr "License" $ (showLicense distro . license) pkgDesc
   putHdr "Url" $ "https://hackage.haskell.org/package" </> pkg_name
   putHdr "Source0" $ sourceUrl pkgver
-  mapM_ (\ (n,p) -> putHdr ("Source" ++ n) (sourceUrl p)) $ number subpackages
+  mapM_ (\ (n,p) -> putHdr ("Source" ++ n) (sourceUrl p)) $ number subpkgs
   when (revision /= "0") $
     if distro == SUSE
     then putHdr "Source1" $ "https://hackage.haskell.org/package" </> pkgver </> "revision" </> revision ++ ".cabal#" </> pkg_name ++ ".cabal"
@@ -296,7 +297,7 @@
     put "%global main_version %{version}"
     putNewline
     put "%if %{defined ghclibdir}"
-    mapM_ (\p -> put $ "%ghc_lib_subpackage" +-+ p) subpackages
+    mapM_ (\p -> put $ "%ghc_lib_subpackage" +-+ p) subpkgs
     put "%endif"
     putNewline
     put "%global version %{main_version}"
@@ -304,7 +305,7 @@
 
   put "%prep"
   put $ "%setup -q" ++ (if pkgname /= name then " -n" +-+ pkgver else "") +-+
-    (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpackages) else  "")
+    (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpkgs) else  "")
   when (distro == SUSE && revision /= "0") $
     put $ "cp -p %{SOURCE1}" +-+ pkg_name ++ ".cabal"
   sectionNewline
@@ -316,7 +317,9 @@
     let cabalFlags = [ "-f" ++ (if b then "" else "-") ++ n | (FlagName n, b) <- rpmConfigurationsFlags flags ]
     put $ "%define cabal_configure_options " ++ unwords cabalFlags
   let pkgType = if hasLib then "lib" else "bin"
-  put $ "%ghc_" ++ pkgType ++ "_build"
+  if hasLib && not exposesModules
+    then put $ "%ghc_" ++ pkgType ++ "_build_without_haddock"
+    else put $ "%ghc_" ++ pkgType ++ "_build"
   sectionNewline
 
   put "%install"
@@ -351,8 +354,8 @@
   when (hasLib && not exposesModules) $
     put "mv %{buildroot}%{_ghcdocdir}{,-devel}"
 
-  when selfdep $
-    put "mv %{buildroot}%{_ghcdocdir}/{,ghc-}%{name}"
+  when (selfdep && binlib) $
+    put "mv %{buildroot}%{_ghclicensedir}/{,ghc-}%{name}"
 
   sectionNewline
 
diff --git a/src/Dependencies.hs b/src/Dependencies.hs
--- a/src/Dependencies.hs
+++ b/src/Dependencies.hs
@@ -21,6 +21,7 @@
   notInstalled,
   packageDependencies,
   showDep,
+  subPackages,
   testsuiteDependencies
   ) where
 
@@ -33,7 +34,7 @@
 #endif
 import Control.Monad (filterM, when)
 
-import Data.List (delete, nub)
+import Data.List (delete, isSuffixOf, nub)
 import Data.Maybe (catMaybes, isNothing)
 
 import Distribution.Package  (Dependency (..), PackageName (..))
@@ -168,3 +169,11 @@
     singleLine :: String -> String
     singleLine "" = ""
     singleLine s = (head . lines) s
+
+subPackages :: Maybe FilePath -> PackageDescription -> IO [String]
+subPackages mspec pkgDesc = do
+  develSubpkgs <- filter ("-devel" `isSuffixOf`) . lines <$> maybe (return "") (\ f -> cmd "rpmspec" ["-q", "--qf", "%{name}\n", f]) mspec
+  let self = packageName $ package pkgDesc
+      subpkgs = delete (showDep self) develSubpkgs
+  missing <- missingPackages pkgDesc
+  return $ nub (subpkgs ++ missing)
diff --git a/src/PackageUtils.hs b/src/PackageUtils.hs
--- a/src/PackageUtils.hs
+++ b/src/PackageUtils.hs
@@ -28,6 +28,7 @@
   pkgInstall,
   prepare,
   removePrefix,
+  removeSuffix,
   repoquery,
   rpmbuild,
   rpmInstall,
@@ -368,7 +369,7 @@
       else do
         createDirectoryIfMissing True dir
         copyFile (head tarballs) dest
-        -- cabal fetch creates tarballs with mode 0600
+        -- cabal-1.18 fetch creates tarballs with mode 0600
         stat <- getFileStatus dest
         when (fileMode stat /= 0o100644) $
           setFileMode dest 0o0644
@@ -457,7 +458,7 @@
       let exec = if hard then cmd_ else trySystem
       fedora <- cmd "rpm" ["--eval", "%fedora"]
       let nogpgcheck = ["--nogpgcheck" | fedora `elem` ["22", "23"]]
-      exec (fromMaybe pkginstaller maybeSudo) $ maybe [] (const pkginstaller) maybeSudo : "install" : args ++ nogpgcheck
+      exec (fromMaybe pkginstaller maybeSudo) $ maybe [] (const [pkginstaller]) maybeSudo ++ ("install" : args ++ nogpgcheck)
         where
           showPkg :: String -> String
           showPkg p = if '(' `elem` p then show p else p
diff --git a/src/SysCmd.hs b/src/SysCmd.hs
--- a/src/SysCmd.hs
+++ b/src/SysCmd.hs
@@ -86,7 +86,7 @@
   requireProgram c
   (ret, out, err) <- readProcessWithExitCode c args ""
   case ret of
-    ExitSuccess -> return $removeTrailingNewline out
+    ExitSuccess -> return $ removeTrailingNewline out
     ExitFailure n -> die ("\"" ++ c +-+ unwords args ++ "\"" +-+ "failed with status" +-+ show n ++ "\n" ++ err)
 
 -- hide stdout
