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