packages feed

sindre-0.3: Setup.hs

#!/usr/bin/env runhaskell

import Distribution.Simple.Setup (CopyDest(..),ConfigFlags(..),BuildFlags(..),
                                  CopyFlags(..),RegisterFlags(..),InstallFlags(..),
                                  defaultRegisterFlags,fromFlagOrDefault,Flag(..),
                                  defaultCopyFlags)
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo (absoluteInstallDirs)
import Distribution.PackageDescription (PackageDescription(..))
import Distribution.Simple.InstallDirs
                            (InstallDirs(..))
import Distribution.Simple.Utils
import Distribution.Verbosity
import Data.List (isPrefixOf)
import Data.Version
import Control.Monad (unless)
import System.Posix
import System.Directory
import System.Info (os)
import System.FilePath

main = defaultMainWithHooks sindreHooks
sindreHooks = simpleUserHooks { postInst = sindrePostInst
                              , postCopy = sindrePostCopy }

sindre = "sindre"

isWindows :: Bool
isWindows = os == "mingw" -- XXX

subst :: String -> String -> String -> String
subst t r [] = []
subst t r s@(c:s')
  | t `isPrefixOf` s = r ++ subst t r (drop (length t) s)
  | otherwise = c : subst t r s'

sindrePostInst a (InstallFlags { installPackageDB = db, installVerbosity = v }) =
  sindrePostCopy a (defaultCopyFlags { copyDest = Flag NoCopyDest, copyVerbosity = v })

sindrePostCopy a (CopyFlags { copyDest = cdf, copyVerbosity = vf }) pd lbi =
  do let v         = fromFlagOrDefault normal vf
         cd        = fromFlagOrDefault NoCopyDest cdf
         dirs      = absoluteInstallDirs pd lbi cd
         bin       = combine (bindir dirs)
         substVersion = subst "VERSION" $ showVersion $ packageVersion $ package pd
     unless isWindows $ do
       copyFileVerbose v "sinmenu" (bin "sinmenu")
       fs <- getFileStatus (bin "sindre")
       setFileMode (bin "sinmenu") $ fileMode fs
       putStrLn $ "Installing manpage in " ++ mandir dirs
       createDirectoryIfMissing True $ mandir dirs `combine` "man1"
       withFileContents "sindre.1" $
         writeFileAtomic (mandir dirs `combine` "man1" `combine` "sindre.1") . substVersion
       withFileContents "sinmenu.1" $
         writeFileAtomic (mandir dirs `combine` "man1" `combine` "sinmenu.1") . substVersion