cabal-rpm 1.0.2 → 1.0.3
raw patch · 17 files changed
+154/−97 lines, 17 files
Files
- ChangeLog +5/−0
- TODO +4/−21
- cabal-rpm.cabal +1/−2
- src/Commands/Depends.hs +8/−45
- src/Commands/Diff.hs +2/−0
- src/Commands/Install.hs +2/−0
- src/Commands/Refresh.hs +2/−0
- src/Commands/RpmBuild.hs +2/−0
- src/Commands/Spec.hs +38/−14
- src/Commands/Update.hs +2/−0
- src/Dependencies.hs +74/−11
- src/FileUtils.hs +2/−0
- src/Main.hs +2/−0
- src/PackageUtils.hs +2/−0
- src/Stackage.hs +1/−0
- src/SysCmd.hs +2/−0
- src/Types.hs +5/−4
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 =