packages feed

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}"