cabalmdvrpm-0.0.1: Distribution/MDV/Rpm.hs
module Distribution.MDV.Rpm where
import Distribution.Simple
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo
import Distribution.Version
import Data.List
import Distribution.RpmDeps
interactifHaskell = "runhaskell"
data SpecOpts = SpecOptions {
rpmNamePrefix :: String,
rpmRelease :: String,
rpmGroup :: String,
rpmSource0Suffix :: String,
requires :: [String],
brequires :: [String],
provides :: [String],
conflicts :: [String],
bconflicts :: [String],
obsoletes :: [String]
}
defaultsSpecOptions :: SpecOpts
defaultsSpecOptions = SpecOptions {
rpmNamePrefix = "haskell",
rpmRelease = "%mkrel 1",
rpmGroup = "Development/Other",
rpmSource0Suffix = "tar.gz",
requires = [],
brequires = [],
provides = [],
conflicts = [],
bconflicts = [],
obsoletes = []
}
pcabalName pkgDesc = pkgName $ package pkgDesc
pcabalVersion pkgDesc =
concat . intersperse "." $ map show $ versionBranch $
pkgVersion $ package pkgDesc
rpmpkgName :: SpecOpts -> PackageDescription -> String
rpmpkgName sopts pkgDesc = (rpmNamePrefix sopts) ++ "-" ++ (pcabalName pkgDesc)
buildSpec :: SpecOpts -> PackageDescription -> String
buildSpec sopts pkgDesc = unlines [
buildSpecHeader sopts pkgDesc,
buildSpecPrep sopts pkgDesc,
buildSpecBuild sopts pkgDesc,
buildSpecCheck sopts pkgDesc,
buildSpecInstall sopts pkgDesc,
buildSpecOtherStep sopts pkgDesc,
buildSpecFiles sopts pkgDesc,
buildSpecClean sopts pkgDesc
]
buildSpecHeader :: SpecOpts -> PackageDescription -> String
buildSpecHeader sopts pkgDesc = unlines ([
definemodulename,
"",
pkgname, pkgversion, pkgrelease,
pkgsummary, pkggroup, pkglicense, pkgurl,
source,
buildroot
] ++ builddeps ++ pkgdescription)
where
definemodulename = "%define module " ++ pcabalName pkgDesc
pkgname = "Name: " ++ (
case rpmNamePrefix sopts of
"" -> ""
any@_ -> any ++ "-"
) ++ "%{module}"
pkgversion = "Version: " ++ pcabalVersion pkgDesc
pkgrelease = "Release: " ++ (rpmRelease sopts)
pkgsummary = "Summary: " ++ case (synopsis pkgDesc) of
[] -> description pkgDesc
des@_ -> des
pkgurl = "Url: " ++ (homepage pkgDesc)
pkggroup = "Group: " ++ (rpmGroup sopts)
pkgdescription = [ "", "%description",
(if (length $ description pkgDesc) > 0 then description pkgDesc else synopsis pkgDesc)]
pkglicense = "License: " ++ (show $ license $ pkgDesc)
source = "Source: " ++ "%{module}" ++ "-" ++ (pcabalVersion pkgDesc) ++ "." ++ (rpmSource0Suffix sopts)
buildroot = "BuildRoot: %_tmppath/%name-%version-%release-root"
builddeps = buildrequires ++ buildconflicts
where
buildrequires = map (\x -> "BuildRequires: " ++ x)
((map dependency2rpmdep $ buildDepends pkgDesc) ++ (brequires sopts))
buildconflicts = map (\x -> "BuildConflicts: " ++ x) $ bconflicts sopts
buildSpecPrep :: SpecOpts -> PackageDescription -> String
buildSpecPrep sopts pkgDesc = unlines [
"%prep",
"%setup -q -n %{module}-%{version}"
]
buildSpecBuild :: SpecOpts -> PackageDescription -> String
buildSpecBuild sopts pkgDesc = unlines [
"%build",
"%_cabal_build"
]
buildSpecInstall :: SpecOpts -> PackageDescription -> String
buildSpecInstall sopts pkgDesc = unlines [
"%install",
"%_cabal_install",
"",
"%_cabal_genscripts",
"",
"%_cabal_rpm_gen_deps"
]
buildSpecClean :: SpecOpts -> PackageDescription -> String
buildSpecClean sopts pkgDesc = unlines [
"%clean",
"rm -fr %buildroot"
]
buildSpecFiles :: SpecOpts -> PackageDescription -> String
buildSpecFiles sopts pkgDesc = unlines $ [
"%files",
"%defattr(-,root,root)"
] ++
(map (\x -> "%{_bindir}/" ++ (exeName x)) $ executables pkgDesc)
++
(case library pkgDesc of
Nothing -> []
_ -> ["%_libdir/%{module}-%{version}"]
)
++ [
"%{_datadir}/%{module}-%{version}",
"%_cabal_rpm_files",
"%doc dist/doc/html"
]
buildSpecCheck :: SpecOpts -> PackageDescription -> String
buildSpecCheck sopts pkgDesc = "%check\n%_cabal_check\n"
buildSpecOtherStep sopts pkgDesc = "%{_cabal_scriptlets}"