diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,15 @@
+# 2.0.11 (2022-03-13)
+- take build-tool-depends into account
+- 'spec','update': detect %autorelease and preserve %autochangelog
+- 'spec --standalone': strip executable
+- support %_builddir
+
 # 2.0.10 (2021-08-14)
-* pkgSpecPkgData: try allowing versioned dir
-* update: only output old version if upgrading
-* stack: use final lts17
-* Stackage: bump to LTS 18
-* Spec: drop %ghc_fix_rpath for subpkgs
+- pkgSpecPkgData: try allowing versioned dir
+- update: only output old version if upgrading
+- stack: use final lts17
+- Stackage: bump to LTS 18
+- Spec: drop %ghc_fix_rpath for subpkgs
 
 # 2.0.9 (2021-06-08)
 - spec: doc requires ghc-filesystem
diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -14,6 +14,8 @@
 - in container/clean install: cblrpm local HsOpenSSL fails:
 cabal-rpm: HsOpenSSL-0.11.4.17: getDirectoryContents:openDirStream: does not exist (No such file or directory)
 
+- update: if package becomes meta add obsoletes for base/prof packages
+
 - choose use latest minor PVP release compatible with older lts stream?
 - missingdeps should warn about subpackaged deps
 - installmissing' only installs libs
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:             2.0.10
+Version:             2.0.11
 Synopsis:            RPM packaging tool for Haskell Cabal-based packages
 Description:
     This package provides a RPM packaging tool for Haskell Cabal-based packages.
@@ -16,10 +16,11 @@
 Bug-reports:         https://github.com/juhp/cabal-rpm/issues
 License:             GPL-3
 License-file:        COPYING
-Author:              Jens Petersen <juhpetersen@gmail.com>, Bryan O'Sullivan <bos@serpentine.com>
+Author:              Jens Petersen <juhpetersen@gmail.com>,
+                     Bryan O'Sullivan <bos@serpentine.com>
 Maintainer:          Jens Petersen <petersen@fedoraproject.org>
 Copyright:           2007-2008 Bryan O'Sullivan <bos@serpentine.com>,
-                     2012-2021 Jens Petersen <juhpetersen@gmail.com>
+                     2012-2022 Jens Petersen <juhpetersen@gmail.com>
 Category:            Distribution
 Build-type:          Simple
 Extra-doc-files:     ChangeLog README.md TODO
@@ -27,7 +28,7 @@
 Cabal-version:       1.18
 Tested-with:         GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3,
                      GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4,
-                     GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.2
+                     GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.5
 
 source-repository head
   type:     git
diff --git a/src/Commands/Diff.hs b/src/Commands/Diff.hs
--- a/src/Commands/Diff.hs
+++ b/src/Commands/Diff.hs
@@ -50,6 +50,8 @@
       editSpecField "Release" (currel ++ suffix) speccblrpm
       diffcmd <- words <$> getEnvDefault "CBLRPM_DIFF" "diff -u"
       out <- dropChangelog <$> pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])
+      ---- was for %autorelease:
+      -- out <- pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])
         ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])
       unless (null out) $
         putStrLn out
diff --git a/src/Commands/Spec.hs b/src/Commands/Spec.hs
--- a/src/Commands/Spec.hs
+++ b/src/Commands/Spec.hs
@@ -111,16 +111,21 @@
       pkgid = package pkgDesc
       name = display $ pkgName pkgid
 
+  mspecExists <-
+    case mspec of
+      Nothing -> return Nothing
+      Just spec -> do
+        exists <- doesFileExist spec
+        return $
+          if exists
+          then Just spec
+          else Nothing
+
   standalone <-
     if pkgtype == StandalonePkg then return True
     else
-      case mspec of
-        Nothing -> return False
-        Just spec -> do
-          specExists <- doesFileExist spec
-          if specExists then
-            withSpecHead spec $ return . ("--standalone" `elem`)
-            else return False
+      ifJust mspecExists $ \spec ->
+      withSpecHead spec $ return . ("--standalone" `elem`)
 
   subpackage <-
     if isJust subpkgStream
@@ -131,14 +136,16 @@
         return False
       else return True
     else
-      case mspec of
-        Nothing -> return False
-        Just spec -> do
-          specExists <- doesFileExist spec
-          if specExists then
-            withSpecHead spec $ return . ("--subpackage" `elem`)
-            else return False
+      ifJust mspecExists $ \spec ->
+      withSpecHead spec $ return . ("--subpackage" `elem`)
 
+  autorelease <-
+    ifJust mspecExists $
+    grep_ "^Release:        %autorelease"
+  autochangelog <-
+    ifJust mspecExists $
+    grep_ "^%autochangelog"
+
   let hasExec = hasExes pkgDesc
       hasLib = hasLibs pkgDesc
       hasLibPkg = hasLib && not standalone
@@ -292,9 +299,12 @@
 
   putHdr "Name" (if binlib then "%{pkg_name}" else basename)
   putHdr "Version" version
-  when hasSubpkgs $
-    put "# can only be reset when all subpkgs bumped"
-  putHdr "Release" $ release ++ "%{?dist}"
+  if autorelease
+  then putHdr "Release" "%autorelease"
+  else do
+    when hasSubpkgs $
+      put "# can only be reset when all subpkgs bumped"
+    putHdr "Release" $ release ++ "%{?dist}"
   putHdr "Summary" summary
   putNewline
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
@@ -337,7 +347,7 @@
   let testDeps = testsuiteDeps \\ (mkPackageName "Cabal" : (buildDeps pkgdeps ++ setupDeps pkgdeps))
   when (testable && notNull testDeps) $ do
     put "%if %{with tests}"
-    mapM_ (putHdr "BuildRequires") $ (sort . map showRpm) (map (RpmHsLib Devel) testDeps ++ map RpmOther testsuiteTools)
+    mapM_ (putHdr "BuildRequires") $ (sort . map showRpm) (map (RpmHsLib Devel) testDeps ++ map RpmOther (testsuiteTools \\ toolDeps pkgdeps))
     put "%endif"
 
   let common = binlib && datafiles /= [] && not standalone
@@ -477,7 +487,7 @@
   if standalone then do
     put "mkdir -p %{buildroot}%{_bindir}"
     put "%if 0%{?fedora} >= 33 || 0%{?rhel} > 8"
-    put "cabal install --install-method=copy --installdir=%{buildroot}%{_bindir}"
+    put "cabal install --install-method=copy --enable-executable-stripping --installdir=%{buildroot}%{_bindir}"
     put "%else"
     put "for i in .cabal-sandbox/bin/*; do"
     put "strip -s -o %{buildroot}%{_bindir}/$(basename $i) $i"
@@ -585,11 +595,14 @@
       sectionNewline
 
   put "%changelog"
-  now <- getCurrentTime
-  let date = formatTime defaultTimeLocale "%a %b %e %Y" now
-  packager <- fromMaybe "Fedora Haskell SIG <haskell@lists.fedoraproject.org>" <$> cmdMaybe "rpmdev-packager" []
-  put $ "*" +-+ date +-+ packager ++ " - " ++ version ++ "-" ++ release
-  put $ "- spec file generated by cabal-rpm-" ++ V.showVersion Paths_cabal_rpm.version
+  if autochangelog
+  then put "%autochangelog"
+  else do
+    now <- getCurrentTime
+    let date = formatTime defaultTimeLocale "%a %b %e %Y" now
+    packager <- fromMaybe "Fedora Haskell SIG <haskell@lists.fedoraproject.org>" <$> cmdMaybe "rpmdev-packager" []
+    put $ "*" +-+ date +-+ packager ++ " - " ++ version ++ "-" ++ release
+    put $ "- spec file generated by cabal-rpm-" ++ V.showVersion Paths_cabal_rpm.version
   hClose h
   return outputFile
 
@@ -699,3 +712,7 @@
 notNull :: [a] -> Bool
 notNull = not . null
 #endif
+
+ifJust :: Maybe a -> (a -> IO Bool) -> IO Bool
+ifJust Nothing _ = return False
+ifJust (Just x) act = act x
diff --git a/src/Commands/Update.hs b/src/Commands/Update.hs
--- a/src/Commands/Update.hs
+++ b/src/Commands/Update.hs
@@ -107,20 +107,25 @@
           currel <- getSpecField "Release" spec
           let suffix = "%{?dist}"
               defrelease = "1"
-          editSpecField "Release" (defrelease ++ suffix) spec
+          autorelease <- grep_ "^Release:        %autorelease" spec
+          unless autorelease $ do
+            editSpecField "Release" (defrelease ++ suffix) spec
           patchSpec False Nothing curspec newspec
           ver' <- readVersion <$> getSpecField "Version" spec
           when (ver' /= newver) $
             editSpecField "Version" (showVersion newver) spec
-          if updated && not subpkg
+          unless autorelease $
+            if updated && not subpkg
             then editSpecField "Release" (defrelease ++ suffix) spec
             else editSpecField "Release" (currel ++ suffix) spec
           rwGit <- rwGitDir
+          autochangelog <- grep_ "^%autochangelog" spec
           when updated $ do
             -- FIXME reset when all subpkgs updated
-            unless subpkg $
+            unless (subpkg || autorelease) $
               editSpecField "Release" ("0" ++ suffix) spec
-            cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ showVersion newver, spec]
+            unless autochangelog $
+              cmd_ "rpmdev-bumpspec" ["-c", "https://hackage.haskell.org/package/" ++ display newPkgId ++ "/changelog" , spec]
             when (rwGit && subpkg) $ do
               cmd_ "cp" ["-p", "sources", "sources.cblrpm"]
               cmd_ "sed" ["-i", "/" ++ display oldPkgId <.> "tar.gz" ++ "/d", "sources.cblrpm"]
@@ -138,7 +143,11 @@
             when newrev $
               cmd_ "git" ["add", display newPkgId <.> "cabal"]
             if updated then
-              cmd_ "git" ["commit", "-a", "-m", "update to" +-+ showVersion newver]
+              cmd_ "git" ["commit", "-a", "-m",
+                          if autochangelog
+                          then "https://hackage.haskell.org/package/"
+                               ++ display newPkgId ++ "/changelog"
+                          else "update to" +-+ showVersion newver]
               else
               when newrev $
               whenM (gitBool "diff-index" ["--quiet", "HEAD"]) $
diff --git a/src/Dependencies.hs b/src/Dependencies.hs
--- a/src/Dependencies.hs
+++ b/src/Dependencies.hs
@@ -91,12 +91,24 @@
                     [ bi | exe <- executables pkgDesc
                          , let bi = buildInfo exe ]
         tools =  nub $ map exeDepName (concatMap buildTools buildinfo)
+        toolDeps' = concatMap buildToolDepends' buildinfo
         pkgcfgs = nub $ map pkgcfgDepName $ concatMap pkgconfigDepends buildinfo
         clibs = nub $ concatMap extraLibs buildinfo
         stdcpp = "stdc++"
         cpp = ["gcc-c++" | stdcpp `elem` clibs]
-    in (deps, setup \\ (mkPackageName "Cabal" : deps), delete (display self) tools ++ cpp, clibs \\ ["m", stdcpp], pkgcfgs)
+    in (deps, setup \\ (mkPackageName "Cabal" : deps), delete (display self) tools ++ cpp ++ toolDeps', clibs \\ ["m", stdcpp], pkgcfgs)
 
+buildToolDepends' :: BuildInfo -> [String]
+#if MIN_VERSION_Cabal(2,0,0)
+buildToolDepends' buildinfo =
+  map prettyShow $ buildToolDepends buildinfo
+  where
+    prettyShow (ExeDependency pn _ _) = unPackageName pn
+#else
+buildToolDepends' _ =
+      []
+#endif
+
 data QueryBackend = Rpm | Repoquery deriving Eq
 
 resolveLib :: String -> IO (Maybe String)
@@ -167,14 +179,7 @@
   where
     tests = map testBuildInfo $ testSuites pkgDesc
     testTools = map exeDepName $ concatMap buildTools tests
-    testToolDeps =
-#if MIN_VERSION_Cabal(2,0,0)
-      map prettyShow $ concatMap buildToolDepends tests
-
-    prettyShow (ExeDependency pn _ _) = unPackageName pn
-#else
-      []
-#endif
+    testToolDeps = concatMap buildToolDepends' tests
 
 missingPackages :: PackageDescription -> IO [RpmPackage]
 missingPackages pkgDesc = do
diff --git a/src/PackageUtils.hs b/src/PackageUtils.hs
--- a/src/PackageUtils.hs
+++ b/src/PackageUtils.hs
@@ -36,7 +36,7 @@
   ) where
 
 import FileUtils (assertFileNonEmpty, filesWithExtension, fileWithExtension,
-                  listDirectory', mktempdir, withCurrentDirectory,
+                  listDirectory', mktempdir,
                   withTempDirectory)
 import SimpleCabal (finalPackageDescription, licenseFiles, mkPackageName,
                     PackageDescription, PackageIdentifier(..), PackageName,
@@ -70,11 +70,7 @@
 
 import Distribution.Text (display, simpleParse)
 
-import System.Directory (copyFile, createDirectoryIfMissing, doesDirectoryExist,
-                         doesFileExist, getCurrentDirectory,
-                         getModificationTime,
-                         removeDirectoryRecursive, renameFile,
-                         setCurrentDirectory)
+import System.Directory
 import System.Environment (getEnv)
 import System.FilePath
 import System.IO (hIsTerminalDevice, stdout)
@@ -88,6 +84,8 @@
   (docs, licensefiles) <- findDocsLicenses (dropFileName cabalfile) final
   return (final, docs, licensefiles)
 
+-- FIXME only include (doc) files listed in the .cabal file
+-- eg ChangeLog.md may exist but not dist packaged
 findDocsLicenses :: FilePath -> PackageDescription -> IO ([FilePath], [FilePath])
 findDocsLicenses dir pkgDesc = do
   contents <- listDirectory' dir
@@ -179,6 +177,13 @@
       then getCurrentDirectory
       else fromJust <$> rpmEval "%{_sourcedir}"
 
+getBuildDir :: IO FilePath
+getBuildDir = do
+    git <- isGitDir "."
+    if git
+      then getCurrentDirectory
+      else fromJust <$> rpmEval "%{_builddir}"
+
 getRevisedCabal :: PackageIdentifier -> IO Bool
 getRevisedCabal pkgid = do
   let file = display (pkgName pkgid) <.> "cabal"
@@ -191,7 +196,8 @@
       else do
       revised <- grep_ "x-revision" file
       when revised $
-        renameFile file $ dir </> display pkgid <.> "cabal"
+        -- renameFile can fail across fs devices
+        copyFile file $ dir </> display pkgid <.> "cabal"
       return revised
 
 data RpmStage = Binary | Source | Prep
@@ -394,18 +400,20 @@
           case simpleParse namever of
             Nothing -> error "pkgid could not be parsed"
             Just pkgid -> bringTarball pkgid revise (Just specFile)
-          dExists <- doesDirectoryExist namever
+          builddir <- getBuildDir
+          let pkgsrcdir = builddir </> namever
+          dExists <- doesDirectoryExist pkgsrcdir
           if dExists
             then do
             specTime <- modificationTime <$> getFileStatus specFile
-            dirTime <- accessTime <$> getFileStatus namever
+            dirTime <- accessTime <$> getFileStatus pkgsrcdir
             when (specTime > dirTime) $ do
               rpmbuild True Prep specFile
-              dExists' <- doesDirectoryExist namever
-              when dExists' $ cmd_ "touch" [namever]
+              dExists' <- doesDirectoryExist pkgsrcdir
+              when dExists' $ cmd_ "touch" [pkgsrcdir]
             else
             rpmbuild True Prep specFile
-          tryFindPackageDesc namever
+          tryFindPackageDesc pkgsrcdir
 
 -- findSpecFile :: PackageDescription -> RpmFlags -> IO (FilePath, Bool)
 -- findSpecFile pkgDesc flags = do
