On Fri, Oct 13, 2006 at 08:33:27PM +0100, Ian Lynagh wrote:
> On Thu, Oct 12, 2006 at 07:57:02PM +0100, Ian Lynagh wrote:
> > 
> > GHC 6.6 for x86 and amd64 unstable should now be in Haskell Unsafe
> > http://haskell-unsafe.alioth.debian.org/haskell-unsafe.html
> > 
> > Extralibs will follow.
> 
> About half of them are now done for x86 unstable:
> 
>     HGL fgl haskell-src hunit mtl network x11

All but GLUT, OpenAL and ALUT are now there for amd64 unstable.

I've also attached a small Haskell program for building the packages in
the right order with pbuilder. Use at your own risk, etc etc.

> Please let me know of any problems with any of them.


Thanks
Ian

{-
find /home/ian/public_html/haskell_deb_archive/ -type f \! -name "ghc6*" -exec 
rm {} \;
for i in packages/*; do cd $i; dpkg-source -x *.dsc; cd ../..; done
runghc Build.hs packages/*/*/ 2>&1 | tee log
-}

-- We make no attempt at efficiency here. In particular, after building
-- any package we re-sort the whole list of packages to be built.

-- We assume that each package appears only in the arguments, and that
-- there are no overlaps with packages that come with GHC.

module Main (main) where

import Control.Monad
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Simple.Utils
import Distribution.Version
import Data.List
import Data.Ord
import System.Cmd
import System.Environment
import System.Exit

type Command = String -- XXX security!
type PackageName = String
type Directory = FilePath
data Package = Package PackageDescription Directory deriving Show
data PackageDeps = PackageDeps Package [PackageName] deriving Show

-- XXX Can we get this from somewhere sensible?
packagesThatComeWithGHC :: [PackageName]
packagesThatComeWithGHC = ["Cabal", "Win32", "base", "haskell98",
                           "parsec", "readline",
                           "regex-base", "regex-compat", "regex-posix",
                           "stm", "template-haskell", "unix"]

extraPackagesDone :: [PackageName]
extraPackagesDone = []

archiveDir :: Directory
archiveDir = "/home/ian/public_html/haskell_deb_archive/"

main :: IO ()
main = do dirs <- getArgs
          buildAll (packagesThatComeWithGHC ++ extraPackagesDone) dirs

buildAll :: [PackageName] -> [Directory] -> IO ()
buildAll prebuilt dirs
 = do packages <- mapM mkPackage dirs
      let packageDepss = map mkPackagesDeps packages
          packageDepss' = foldr markBuilts packageDepss prebuilt
      doBuilds [] [] packageDepss'

mkPackage :: Directory -> IO Package
mkPackage dir = do fp <- findPackageDesc dir
                   pd <- readPackageDescription (dir ++ "/" ++ fp)
                   return (Package pd dir)

mkPackagesDeps :: Package -> PackageDeps
mkPackagesDeps p@(Package pd _) = PackageDeps p ps
    where ps = nub $ map getDepPackageName $ buildDepends pd

getDepPackageName :: Dependency -> PackageName
getDepPackageName (Dependency pn _) = pn

markBuilts :: PackageName -> [PackageDeps] -> [PackageDeps]
markBuilts pn = sortPackageDeps . map (markBuilt pn)

markBuilt :: PackageName -> PackageDeps -> PackageDeps
markBuilt pn (PackageDeps pd pns) = PackageDeps pd (delete pn pns)

sortPackageDeps :: [PackageDeps] -> [PackageDeps]
sortPackageDeps = sortBy (comparing numDeps)
    where numDeps (PackageDeps _ deps) = length deps

doBuilds :: [PackageName] -- Done (in reverse order)
         -> [PackageName] -- Failed (in reverse order)
         -> [PackageDeps] -- To build
         -> IO ()
doBuilds done fails pds
 = do printStatus fails pds
      case pds of
          (PackageDeps (Package pd dir) []):pds' ->
              do built <- doBuild dir
                 let pn = packageName pd
                 if built
                   then doBuilds (pn:done) fails $ markBuilts pn pds'
                   else doBuilds done (pn:fails) pds'
          _ -> putStrLn ("Done: " ++ unwords (reverse done))

-- XXX We trust dir to not be nasty
doBuild :: Directory -> IO Bool
doBuild dir = runCommands
    [-- Get the package ready to be built
     inDir dir "debian/rules update-generated-files",
     "find " ++ dir ++ "/../ -name \"*.dsc\" -exec rm {} \\;",
     inDir dir "dpkg-buildpackage -S -rfakeroot -us -uc",
     -- Make a clean build result directory
     "rm -rf buildres",
     "mkdir buildres",
     -- Get the archive ready
     inDir archiveDir "dpkg-scanpackages . . > Packages",
     inDir archiveDir "gzip -f Packages",
     -- Make sure pbuilder knows about the archive
     asRoot "pbuilder update",
     -- Go for it!
     asRoot ("pbuilder build --buildresult buildres " ++ dir ++ "/../*.dsc"),
     -- And put the result in the archive
     "mv buildres/* " ++ archiveDir
    ]
                           
inDir :: Directory -> Command -> Command
inDir dir c = "cd " ++ dir ++ " && " ++ c

asRoot :: Command -> Command
asRoot cmd = "sudo " ++ cmd

runCommands :: [Command] -> IO Bool
runCommands [] = return True
{-
runCommands (c:cs) = do putStrLn c
                        runCommands cs
-}
runCommands (c:cs) = do putStrLn ("Executing: " ++ c)
                        res <- system c
                        case res of
                            ExitSuccess -> do putStrLn "Success"
                                              runCommands cs
                            _ -> do putStrLn "Failed"
                                    return False

printStatus :: [PackageName] -> [PackageDeps] -> IO ()
printStatus fails pds
 = do let nullFails = null fails
          nullPds = null pds
      unless nullFails $ putStrLn ("Failed: " ++ unwords fails)
      unless nullPds $ do putStrLn "Still to do:"
                          mapM_ (putStrLn . f) pds
      unless (nullFails && nullPds) $ putStrLn "---"
    where f (PackageDeps (Package pd _) deps)
              = let pn = packageName pd
                in case length deps of
                   0 -> "Ready: " ++ pn
                   1 ->          "1 dep for "  ++ pn ++ ": " ++ unwords deps
                   n -> show n ++ " deps for " ++ pn ++ ": " ++ unwords deps

packageName :: PackageDescription -> PackageName
packageName pd = pkgName $ package pd

_______________________________________________
debian-haskell mailing list
[email protected]
http://urchin.earth.li/mailman/listinfo/debian-haskell

Reply via email to