packages feed

cabal2arch 0.1 → 0.1.1

raw patch · 2 files changed

+98/−23 lines, 2 files

Files

Main.hs view
@@ -13,6 +13,8 @@ -- Portability: -- +-- TODO: libraries should be "haskell-$packagefoo"+ import Distribution.PackageDescription import Distribution.Simple.Utils hiding (die) import Distribution.Verbosity@@ -37,11 +39,12 @@ import System.IO import Control.Monad import System.Directory+import Debug.Trace  main :: IO () main =  bracket-   -- Set up a temp dir to work in+   -- We do all our work in a temp directory   (do cwd  <- getCurrentDirectory       etmp <- readProcess "mktemp" ["-d"] []       case etmp of@@ -73,7 +76,7 @@    let pkgbuild' = cabal2pkg cabalsrc     pkgbuild  <- getMD5 pkgbuild'-   let doc      = pkg2doc email pkgbuild+   let doc       = pkg2doc email pkgbuild    putStrLn (render doc)  ------------------------------------------------------------------------@@ -170,34 +173,62 @@     <=> dispNoQuotes (arch_source pkg)  , text "md5sum"     <=> disp (arch_md5sum pkg)+ , hang+    (text "build() {") 4+             (vcat $ (map text) (arch_build pkg))+   $$ char '}'  ]  -- -- | Tranlsate a generic cabal file into a PGKBUILD -- cabal2pkg :: GenericPackageDescription -> PkgBuild+ cabal2pkg GenericPackageDescription     { packageDescription = cabal     , genPackageFlags    = _cabal_genPackageFlags-    , condLibrary        = _cabal_condLibrary+    , condLibrary        = _cabal_condLibrary -- Nothing, if executables only     , condExecutables    = _cabal_condExecutables     }-  = emptyPkgBuild++--  = trace (show _cabal_condExecutables ) $+  =+   emptyPkgBuild     { arch_pkgname = name     , arch_pkgver  = vers-    , arch_url     = homepage   cabal-    , arch_pkgdesc = synopsis   cabal+    , arch_url     = homepage cabal+    , arch_pkgdesc = synopsis cabal     , arch_license = ArchList [license cabal]      -- All Hackage packages depend on GHC at build time+    -- All Haskell libraries are prefixed with "haskell-"     , arch_makedepends = (arch_makedepends emptyPkgBuild)                             `mappend`-                         (ArchList (buildDepends cabal))+                         ArchList+                             [ ArchDep (Dependency ("haskell"++d) v)+                             | Dependency d v <- buildDepends cabal ] +    -- need the dependencies of all flags that are on by default, for all libraries and executables+     -- Hackage programs only need their own source to build     , arch_source  = ArchList . return $           "http://hackage.haskell.org/packages/archive/"        ++ (name </> display vers </> name <-> display vers <.> "tar.gz")++    -- Generate the build/install script+    , arch_build =+        [ "cd $startdir/src/" </> name <-> display vers+        , "runhaskell Setup configure --prefix=/usr || return 1"+        , "runhaskell Setup build                   || return 1"+        , "runhaskell Setup register   --gen-script || return 1"+        , "runhaskell Setup unregister --gen-script || return 1"+        , "install -D -m744 register.sh   $startdir/pkg/usr/share/haskell/$pkgname/register.sh"+        , "install    -m744 unregister.sh $startdir/pkg/usr/share/haskell/$pkgname/unregister.sh"+        , "runhaskell Setup copy --destdir=$startdir/pkg || return 1"+        , "install -D -m644 " ++ licenseFile cabal +++                             " $startdir/pkg/usr/share/licenses/$pkgname/LICENSE || return 1"+        ]+     }   where     name = pkgName (package cabal)@@ -246,13 +277,13 @@         -- should be placed in $pkgdir/usr/share/licenses/$pkgname when         -- building the package. If multiple licenses are applicable for a         -- package, list all of them: license=(´GPL´ ´FDL´).-    , arch_makedepends :: ArchList Dependency+    , arch_makedepends :: ArchList ArchDep         -- ^         -- An array of packages that this package depends on to build, but are         -- not needed at runtime. Packages in this list follow the same format         -- as depends. -    , arch_depends     :: ArchList Dependency+    , arch_depends     :: ArchList ArchDep         -- ^         -- An array of packages that this package depends on to run. Packages         -- in this list should be surrounded with single quotes and contain at@@ -279,6 +310,9 @@         -- supports multiple integrity algorithms and their corresponding         -- arrays (i.e. sha1sums for the SHA1 algorithm); however, official         -- packages use only md5sums for the time being.+    , arch_build        :: [String]+        -- Build hooks+     }     deriving (Show, Eq) @@ -287,25 +321,64 @@ -- emptyPkgBuild :: PkgBuild emptyPkgBuild =-    PkgBuild-        { arch_pkgname     = pkgName (package e)-        , arch_pkgver      = pkgVersion (package e)-        , arch_pkgrel      = 1-        , arch_pkgdesc     = synopsis e-        , arch_arch        = ArchList [X86, X86_64]-        , arch_url         = homepage e-        , arch_license     = ArchList [license e]-        , arch_makedepends = ArchList [(Dependency "ghc" AnyVersion)]-        , arch_depends     = ArchList []-        , arch_source      = ArchList []-        , arch_md5sum      = ArchList []-        }+  PkgBuild+    { arch_pkgname     = pkgName (package e)+    , arch_pkgver      = pkgVersion (package e)+    , arch_pkgrel      = 1+    , arch_pkgdesc     = synopsis e+    , arch_arch        = ArchList [X86, X86_64]+    , arch_url         = homepage e+    , arch_license     = ArchList [license e]+    , arch_makedepends = ArchList [(ArchDep (Dependency "ghc" AnyVersion))]+    , arch_depends     = ArchList []+    , arch_source      = ArchList []+    , arch_md5sum      = ArchList []+    , arch_build       = []+    }   where     e = emptyPackageDescription  ------------------------------------------------------------------------ -- Extra pretty printer instances and types +newtype ArchDep = ArchDep Dependency+  deriving (Eq,Show)++-- the PKGBUILD version spec is less expressive than cabal, we can't really handle+-- unions or intersections well yet.++instance Text ArchDep where+  disp (ArchDep (Dependency name ver)) =+    text name <> mydisp ver+   where+     --  >= (greater than or equal to), <= (less than or+     --  equal to), = (equal to), > (greater than), or <+      mydisp AnyVersion           = empty++      mydisp (ThisVersion    v)   = text "=" <> disp v+      mydisp (LaterVersion   v)   = char '>' <> disp v+      mydisp (EarlierVersion v)   = char '<' <> disp v++      mydisp (UnionVersionRanges (ThisVersion  v1) (LaterVersion v2))+        | v1 == v2 = text ">=" <> disp v1+      mydisp (UnionVersionRanges (LaterVersion v2) (ThisVersion  v1))+        | v1 == v2 = text ">=" <> disp v1+      mydisp (UnionVersionRanges (ThisVersion v1) (EarlierVersion v2))+        | v1 == v2 = text "<=" <> disp v1+      mydisp (UnionVersionRanges (EarlierVersion v2) (ThisVersion v1))+        | v1 == v2 = text "<=" <> disp v1++{-+      mydisp (UnionVersionRanges r1 r2)+        = disp r1 <+> text "||" <+> disp r2++      mydisp (IntersectVersionRanges r1 r2)+        = disp r1 <+> text "&&" <+> disp r2+-}+      mydisp x = error $ "Can't handle this version format yet: " ++ show x++  parse = undefined+ -- -- | Valid linux platforms --@@ -339,6 +412,8 @@          parens (hcat                 (intersperse space                     (map disp xs)))++------------------------------------------------------------------------  ------------------------------------------------------------------------ -- Some extras
cabal2arch.cabal view
@@ -1,5 +1,5 @@ name:               cabal2arch-version:            0.1+version:            0.1.1 homepage:           http://code.haskell.org/~dons/code/cabal2arch synopsis:           Create Arch Linux packages from Cabal packages description:        Create Arch Linux packages from Cabal packages