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