packages feed

cabal-rpm 1.0.2 → 1.0.3

raw patch · 17 files changed

+154/−97 lines, 17 files

Files

ChangeLog view
@@ -1,3 +1,8 @@+# 1.0.3 (2019-12-31)+- define %_devel for f30 packaging compatibility+- missingdeps and builddep fixes+- --standalone: add BRs for deps of missing deps+ # 1.0.2 (2019-12-09) - allow newer time for ghc-8.8 - more type refactoring: PackageIdentifier, LibPkgType, RpmPackage
TODO view
@@ -1,10 +1,9 @@ - switch to Cabal 2 for better License handling-- builddep should only install ghc-*-devel not ghc-*-prof-- type for rpm (dep) packages+- check/warn about executable doc files!+  - add rpmlint command+- prof install?  - spec --bounds-- distinguish binlib executable and library build-deps-  and library and testsuite build-tools - rework "BR: ghc-*-static" with %{?_isa} - jump from lts-N to lts-N+1 instead of straight to Hackage - move Main to app?@@ -17,18 +16,11 @@ - read options from header line - use <> instead of ++ -- unify hackage and package deps into a common data structure-  with pkgShow and depShow to render strings-  * add RpmPackage and use Dependency- # Commands - fetch - aliases for missingdeps - allow cmd abbreviations? -## Options-- command-based flags and help (optparse-applicative)- ## spec/packaging - filter or blockformat literate code in description ("> ...") ? use repoquery for missing testdeps@@ -44,31 +36,23 @@  ## standalone - packaging of lib stacks into one deployable rpm-* support creating and building standalone package including its missing deps-  - phase 1: cabal sandbox+* support building standalone package including missing deps   - phase 2: embed src tarballs of missing deps?  ## local - --no-network - llvm flag - running "cabal-rpm local pkg-ver" in pkg/ with existing pkg.spec when newer pkg exists builds old pkg-- use rpmspec + dnf/yum-builddep if needed to install deps not in .cabal -## install-- check ghc version compatible (done?)- ## update - warm about new missing deps - reverse deps and rebuilds * update subpkg sources-- update and git add revised .cabal - sort sources  ## depends - dependency graphs or sorted recursive deps - reverse dependencies-- using repoquery for uninstalled missingdeps-- use rpmspec when available?  (Centos5/6 too old) - use su -c when no sudo ??   - any way to know if user is sudoer? @@ -78,6 +62,5 @@ - scratch builds  ## diff-- filter %changelog - ignore whitespace option - diff two versions
cabal-rpm.cabal view
@@ -1,5 +1,5 @@ Name:                cabal-rpm-Version:             1.0.2+Version:             1.0.3 Synopsis:            RPM packaging tool for Haskell Cabal-based packages Description:     This package provides a RPM packaging tool for Haskell Cabal-based packages.@@ -83,4 +83,3 @@                   Paths_cabal_rpm     Hs-Source-Dirs:     src     GHC-options:        -fwarn-missing-signatures -Wall-    Extensions:         CPP
src/Commands/Depends.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Commands.Depends -- Copyright   :  (C) 2014-2019  Jens Petersen@@ -17,19 +19,19 @@     Depends (..)     ) where -import Dependencies (dependencies, missingPackages, packageDependencies)-import PackageUtils (PackageData (..), prepare, repoquery)+import Dependencies (dependencies, hsDep, missingPackages, notAvail,+                     packageDependencies, recurseMissing, showDep)+import PackageUtils (PackageData (..), prepare) import Types -import SimpleCabal (PackageIdentifier, PackageName)-import SimpleCmd ((+-+))+import SimpleCabal (PackageIdentifier)  #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0)) #else import Control.Applicative ((<$>)) #endif import Control.Monad (filterM, unless, void)-import Data.List (nub, sort, (\\))+import Data.List (nub, sort) import Data.Maybe (mapMaybe) import Distribution.Text (display) import System.FilePath ((<.>))@@ -48,49 +50,10 @@       mapM_ putStrLn $ map display (nub (deps ++ setup)) ++ tools ++ clibs' ++ pkgcfgs'     Requires -> do       (deps, setup, tools, clibs, pkgcfgs) <- packageDependencies pkgDesc-      mapM_ putStrLn $ sort . nub  $ map (show . RpmHsLib Devel) (deps ++ setup) ++ tools ++ clibs ++ pkgcfgs+      mapM_ putStrLn $ sort . nub  $ map (showRpm . RpmHsLib Devel) (deps ++ setup) ++ tools ++ clibs ++ pkgcfgs     Missing -> do       missing <- missingPackages pkgDesc >>= filterM notAvail       mapM_ (putStrLn . showDep) missing       let miss = mapMaybe hsDep missing       unless (null miss) $ putStrLn ""       void $ recurseMissing flags stream [] miss-  where-    showDep :: RpmPackage -> String-    showDep (RpmHsLib _ n) = display n-    showDep (RpmHsBin n) = display n-    showDep p = show p--hsDep :: RpmPackage -> Maybe PackageName-hsDep (RpmHsLib _ n) = Just n-hsDep _ = Nothing--recurseMissing :: Flags -> Stream -> [PackageName] -> [PackageName] -> IO [PackageName]-recurseMissing _ _ already [] = return already-recurseMissing flags stream already (dep:deps) = do-  miss <- missingDepsPkg flags stream dep-  putMissing miss already-  let hmiss = mapMaybe hsDep miss-  let accum = nub $ hmiss ++ already-  -- deeper <- recurseMissing flags stream accum (miss \\ accum)-  -- let accum2 = nub $ accum ++ deeper-  more <- recurseMissing flags stream accum (deps \\ accum)-  return $ nub $ accum ++ more--notAvail :: RpmPackage -> IO Bool-notAvail pkg = null <$> repoquery [] (show pkg)--missingDepsPkg :: Flags -> Stream -> PackageName -> IO [RpmPackage]-missingDepsPkg flags stream pkg = do-  pkgdata <- prepare flags stream (Just (unversionedPkgId pkg)) False-  missingPackages (packageDesc pkgdata) >>= filterM notAvail--putMissing :: [RpmPackage] -> [PackageName] -> IO ()-putMissing [] _ = return ()-putMissing deps already = putStrLn $ "  " ++ "needs:" +-+ unwords (markAlready deps)-  where-    markAlready :: [RpmPackage] -> [String]-    markAlready [] = []-    markAlready (d:ds) =-      let (op, cl) = if maybe False (`elem` already) (hsDep d) then ("(", ")") else ("", "") in-      (op ++ show d ++ cl) : markAlready ds
src/Commands/Diff.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Commands.Diff -- Copyright   :  (C) 2014,2017-2018  Jens Petersen
src/Commands/Install.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Commands.Install -- Copyright   :  (C) 2012-2019 Jens Petersen
src/Commands/Refresh.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Commands.Refresh -- Copyright   :  (C) 2016-2019  Jens Petersen
src/Commands/RpmBuild.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Commands.RpmBuild -- Copyright   :  (C) 2007-2008  Bryan O'Sullivan
src/Commands/Spec.hs view
@@ -21,9 +21,9 @@   ) where  import Dependencies (missingLibraries,-                     missingOtherPkgs, notSrcOrInst,-                     packageDependencies, pkgSuffix, subPackages,-                     testsuiteDependencies')+                     missingOtherPkgs, notSrcOrInst, packageDeps,+                     packageDependencies, pkgSuffix,+                     subPackages, testsuiteDependencies') import Types import PackageUtils (bringTarball, latestPackage, PackageData (..), prepare) import SimpleCabal (buildable, mkPackageName, PackageDescription (..),@@ -170,8 +170,8 @@   when standalone $ do     global "ghc_without_dynamic" "1"     global "ghc_without_shared" "1"-    global "without_prof" "1"-    global "without_haddock" "1"+    put "%undefine with_ghc_prof"+    put "%undefine with_haddock"     global "debug_package" "%{nil}"     putNewline @@ -179,6 +179,13 @@     global "pkg_name" name     global "pkgver" "%{pkg_name}-%{version}"     putNewline+  global "_devel" $+    if hasLib+    -- rpm-4.15 supports %{expr:b?t:f} (not in rhel8)+    then "-%{?ghc_devel_prof}%{!?ghc_devel_prof:devel}"+    -- FIXME: use static%{_isa}+    else "-%{?ghc_devel_prof:static}%{!?ghc_devel_prof:devel}"+  putNewline    let pkgver = if hasLib then "%{pkgver}" else pkg_name ++ "-%{version}" @@ -186,7 +193,7 @@   -- FIXME recursive missingdeps   missingLibs <- do     subs <- if subpackage then subPackages mspec pkgDesc else return []-    miss <- if subpackage || standalone then missingLibraries pkgDesc else return []+    miss <- if subpackage || standalone then missingLibraries hasLibPkg pkgDesc else return []     return $ nub (subs ++ miss)   subpkgs <- if subpackage then     mapM (getsubpkgMacro stream specFile >=>@@ -229,16 +236,14 @@   put "# Begin cabal-rpm deps:"   when (mkPackageName "Cabal" `notElem` deps || not hasLib || not (null setupDeps)) $ do --    put "# Setup"-  -- `not hasLib` is for -static-    when (mkPackageName "Cabal" `notElem` deps {-|| not hasLib-}) $+    when (mkPackageName "Cabal" `notElem` deps) $       putHdr "BuildRequires" "ghc-Cabal-devel"-    mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (show (RpmHsLib Devel d))) setupDeps+    mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Devel d))) setupDeps   putHdr "BuildRequires" $ "ghc-rpm-macros" ++ (if hasSubpkgs then "-extra" else "") -  unless (null deps) $ do+  unless (null deps) $ --    put "# Build"-    let ghcLibDep = RpmHsLib $ if hasLibPkg then Prof else Static-    mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (show (ghcLibDep d))) $ sort deps+    mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Base d) ++ "%{_devel}")) $ sort deps   let otherdeps = sort $ tools ++ clibs ++ pkgcfgs   unless (null otherdeps) $ do --    put "# Other"@@ -251,7 +256,7 @@   let testDeps = sort $ testsuiteDeps \\ (mkPackageName "Cabal" : (deps ++ setupDeps))   unless (null testDeps) $ do     put "%if %{with tests}"-    mapM_ (putHdr "BuildRequires" . show . RpmHsLib Devel) testDeps+    mapM_ (putHdr "BuildRequires" . showRpm . RpmHsLib Devel) testDeps     put "%endif"    let common = binlib && datafiles /= [] && not standalone@@ -259,8 +264,16 @@   when common $     putHdr "Requires" $ "%{name}-common" ++ versionRelease   put "# End cabal-rpm deps"-  when standalone $+  when standalone $ do     putHdr "BuildRequires" "cabal-install > 1.18"+    unless (null missingLibs) $+      let putPkgDeps pkg = do+            more <- packageDeps flags stream pkg+            let moredeps = more \\ (deps ++ missingLibs)+            unless (null moredeps) $ do+              put $ "# deps for missing" +-+ display pkg ++ ":"+              mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Static d))) moredeps+      in mapM_ putPkgDeps missingLibs   putNewline    put "%description"@@ -403,6 +416,17 @@   unless (null testsuiteDeps) $ do     put "%check"     put "%cabal_test"+    sectionNewline++  when hasLibPkg $ do+    put "%if 0%{?fedora} < 31 || 0%{?rhel} < 8"+    put $ "%post" +-+ subpkgParam Devel+    put "%ghc_pkg_recache"+    sectionNewline++    put $ "%postun" +-+ subpkgParam Devel+    put "%ghc_pkg_recache"+    put "%endif"     sectionNewline    let license_macro = "%license"
src/Commands/Update.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Commands.Update -- Copyright   :  (C) 2014-2019  Jens Petersen
src/Dependencies.hs view
@@ -17,15 +17,20 @@  module Dependencies (   dependencies,+  hsDep,   missingLibraries,   missingOtherPkgs,   missingPackages,+  notAvail,   notInstalled,   notSrcOrInst,+  packageDeps,   packageDependencies,   pkgInstallMissing,   pkgInstallMissing',   pkgSuffix,+  recurseMissing,+  showDep,   subPackages,   testsuiteDependencies'   ) where@@ -49,10 +54,10 @@ import Control.Monad (filterM, when, unless)  import Data.List (delete, isSuffixOf, nub, (\\))-import Data.Maybe (catMaybes, fromJust, isNothing)+import Data.Maybe (catMaybes, fromJust, isNothing, mapMaybe)  import Distribution.Text (display)-import Distribution.PackageDescription (allBuildInfo, BuildInfo (..))+import Distribution.PackageDescription (allBuildInfo, BuildInfo (..),  hasLibs)  import System.Directory (doesDirectoryExist, doesFileExist) import System.FilePath ((<.>), (</>))@@ -145,13 +150,22 @@   pcpkgs <- mapM derefPkg pkgcfgs   filterM notSrcOrInst $ nub $ map (RpmHsLib Devel) (deps ++ setup ++ [mkPackageName "Cabal"]) ++ map RpmOther (["ghc-rpm-macros"] ++ tools ++ clibs ++ pcpkgs) -missingLibraries :: PackageDescription -> IO [PackageName]-missingLibraries pkgDesc = do+missingLibraries :: Bool -> PackageDescription -> IO [PackageName]+missingLibraries hasLibPkg pkgDesc = do   (deps, setup, _, _, _) <- packageDependencies pkgDesc-  bdeps <- filterM (notSrcOrInst . RpmHsLib Prof) deps+  let libType = if hasLibPkg then Prof else Devel+  bdeps <- filterM (notSrcOrInst . RpmHsLib libType) deps   sdeps <- filterM (notSrcOrInst . RpmHsLib Devel) $ (mkPackageName "Cabal" : setup) \\ deps   return $ bdeps ++ sdeps +uninstalledLibraries :: Bool -> PackageDescription -> IO [PackageName]+uninstalledLibraries hasLibPkg pkgDesc = do+  (deps, setup, _, _, _) <- packageDependencies pkgDesc+  let libType = if hasLibPkg then Prof else Devel+  bdeps <- filterM (notInstalled . RpmHsLib libType) deps+  sdeps <- filterM (notInstalled . RpmHsLib Devel) $ (mkPackageName "Cabal" : setup) \\ deps+  return $ bdeps ++ sdeps+ missingOtherPkgs :: PackageDescription -> IO [String] missingOtherPkgs pkgDesc = do   (_, _, tools, clibs, pkgcfgs) <- packageDependencies pkgDesc@@ -160,7 +174,7 @@  notSrcOrInst :: RpmPackage -> IO Bool notSrcOrInst pkg = do-  src <- doesDirectoryExist (".." </> show (baseLibPackage pkg))+  src <- doesDirectoryExist (".." </> showRpm (baseLibPackage pkg))   if src then return False     else notInstalled pkg   where@@ -174,7 +188,7 @@   where     quoteShow :: RpmPackage -> String     quoteShow (RpmOther cs) = shellQuote cs-    quoteShow p = show p+    quoteShow p = showRpm p      shellQuote :: String -> String     shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs)@@ -209,24 +223,24 @@ pkgInstallMissing' pkgdata = do   let pkgDesc = packageDesc pkgdata       mspec = specFilename pkgdata-  missing <- missingLibraries pkgDesc+  missing <- uninstalledLibraries (hasLibs pkgDesc) pkgDesc   if null missing then return []     else do     subpkgs <- subPackages mspec pkgDesc     let pkgs = missing \\ subpkgs     pkgconfdir <- fromJust . lookup "Global Package DB" . read <$> cmd "ghc" ["--info"]-    putStrLn $ "Running repoquery" +-+ unwords (map display pkgs)+    putStrLn $ "Running repoquery for" +-+ unwords (map display pkgs)     repopkgs <- catMaybes <$> mapM (repoqueryPackageConf pkgconfdir) pkgs     let missing' = pkgs \\ repopkgs     unless (null missing') $ do       putStrLn "Unavailable dependencies:"       mapM_ (putStrLn . display) missing'     unless (null repopkgs) $ do-      putStrLn "Uninstalled dependencies:"+      putStrLn "Found dependencies:"       mapM_ (putStrLn . display) repopkgs       -- fedora <- rpmEval "%fedora"       -- let nogpgcheck = ["--nogpgcheck" | fedora `elem` []]-      rpmInstall True $ map (show . RpmHsLib Prof) repopkgs+      rpmInstall True $ map (showRpm . RpmHsLib Prof) repopkgs     return missing'       where         repoqueryPackageConf :: String -> PackageName -> IO (Maybe PackageName)@@ -234,3 +248,52 @@               let key = pkgconfd </> display pkg ++ "-[0-9]*.conf"               res <- repoquery ["--qf", "%{name}"] key               return $ if null res then Nothing else  Just pkg++showDep :: RpmPackage -> String+showDep (RpmHsLib _ n) = display n+showDep (RpmHsBin n) = display n+showDep p = showRpm p++hsDep :: RpmPackage -> Maybe PackageName+hsDep (RpmHsLib _ n) = Just n+hsDep _ = Nothing++recurseMissing :: Flags -> Stream -> [PackageName] -> [PackageName] -> IO [PackageName]+recurseMissing _ _ already [] = return already+recurseMissing flags stream already (dep:deps) = do+  miss <- missingDepsPkg dep+  putMissing miss+  let hmiss = mapMaybe hsDep miss+  let accum = nub (dep : hmiss ++ already)+  -- deeper <- recurseMissing flags stream accum (miss \\ accum)+  -- let accum2 = nub $ accum ++ deeper+  more <- recurseMissing flags stream accum (deps \\ accum)+  return $ nub $ accum ++ more+  where+    missingDepsPkg :: PackageName -> IO [RpmPackage]+    missingDepsPkg pkg = do+      pkgdata <- prepare flags stream (Just (unversionedPkgId pkg)) False+      missingPackages (packageDesc pkgdata) >>= filterM notAvail++    putMissing :: [RpmPackage] -> IO ()+    putMissing [] = return ()+    putMissing depends = putStrLn $ "  " ++ "needs:" +-+ unwords (markAlready depends)+      where+        markAlready :: [RpmPackage] -> [String]+        markAlready [] = []+        markAlready (d:ds) =+          let (op, cl) = if alreadyMentioned d then ("(", ")") else ("", "") in+            (op ++ showDep d ++ cl) : markAlready ds++        alreadyMentioned :: RpmPackage -> Bool+        alreadyMentioned d = maybe False (`elem` already) (hsDep d)++notAvail :: RpmPackage -> IO Bool+notAvail pkg = null <$> repoquery [] (showRpm pkg)++packageDeps :: Flags -> Stream -> PackageName -> IO [PackageName]+packageDeps flags stream pkg = do+  pkgdata <- prepare flags stream (Just (unversionedPkgId pkg)) False+  let pkgDesc = packageDesc pkgdata+      (deps, setup, _, _, _) = dependencies pkgDesc+  return $ nub $ (deps ++ setup) \\ [pkg]
src/FileUtils.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  FileUtils -- Copyright   :  (C) 2014, 2016-2019  Jens Petersen
src/Main.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  Main -- Copyright   :  (C) 2007  Bryan O'Sullivan
src/PackageUtils.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  PackageUtils -- Copyright   :  (C) 2013-2019  Jens Petersen
src/Stackage.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-}  -- |
src/SysCmd.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module      :  SysCmd -- Copyright   :  (C) 2013-2019  Jens Petersen
src/Types.hs view
@@ -20,6 +20,7 @@   unversionedPkgId,   readVersion,   RpmPackage(..),+  showRpm,   Stream(..),   nullVersion,   Verbose(..)@@ -61,10 +62,10 @@                 | RpmOther String   deriving Eq -instance Show RpmPackage where-  show (RpmHsLib t n) = "ghc-" ++ display n ++ pkgSuffix t-  show (RpmHsBin n) = display n-  show (RpmOther n) = n+showRpm :: RpmPackage -> String+showRpm (RpmHsLib t n) = "ghc-" ++ display n ++ pkgSuffix t+showRpm (RpmHsBin n) = display n+showRpm (RpmOther n) = n  pkgSuffix :: LibPkgType -> String pkgSuffix lpt =