hackport 0.3.1 → 0.3.2
raw patch · 11 files changed
+213/−101 lines, 11 files
Files
- .gitignore +1/−0
- .gitmodules +3/−0
- Cabal2Ebuild.hs +3/−30
- Merge.hs +61/−7
- Merge/Dependencies.hs +20/−6
- Portage/EBuild.hs +47/−26
- Portage/GHCCore.hs +41/−10
- Status.hs +3/−2
- TODO +1/−12
- cabal/.gitignore +25/−0
- hackport.cabal +8/−8
+ .gitignore view
@@ -0,0 +1,1 @@+dist/
+ .gitmodules view
@@ -0,0 +1,3 @@+[submodule "cabal"]+ path = cabal+ url = git://github.com/gentoo-haskell/cabal.git
Cabal2Ebuild.hs view
@@ -39,6 +39,7 @@ import Portage.Dependency import qualified Portage.PackageId as Portage import qualified Portage.EBuild as Portage+import qualified Portage.GHCCore as Portage import qualified Portage.Resolve as Portage import qualified Portage.EBuild as E import qualified Portage.Overlay as O@@ -65,7 +66,7 @@ ++ (if hasTests then ["test-suite"] else []) } where cabalPkgName = display $ Cabal.pkgName (Cabal.package pkg)- hasExe = (not . null) (Cabal.executables pkg) + hasExe = (not . null) (Cabal.executables pkg) hasTests = (not . null) (Cabal.testSuites pkg) thisHomepage = if (null $ Cabal.homepage pkg) then E.homepage E.ebuildTemplate@@ -76,7 +77,7 @@ convertDependency :: O.Overlay -> Portage.Category -> Cabal.Dependency -> [Dependency] convertDependency _overlay _category (Cabal.Dependency pname@(Cabal.PackageName _name) _)- | pname `elem` coreLibs = [] -- no explicit dep on core libs+ | pname `elem` Portage.coreLibs = [] -- no explicit dep on core libs convertDependency overlay category (Cabal.Dependency pname versionRange) = convert versionRange where@@ -96,31 +97,3 @@ )(\r1 r2 -> r1 ++ r2 -- ^ @\"_ && _\"@ intersection )(\dp -> [AllOf dp ] -- ^ @\"(_)\"@ parentheses )--coreLibs :: [Cabal.PackageName]-coreLibs = map Cabal.PackageName- ["array"- ,"base"- ,"bytestring" -- intentionally no ebuild. use ghc's version- -- to avoid dreaded 'diamond dependency' problem- ,"containers"- ,"directory"- --,"editline"- ,"filepath" -- intentionally no ebuild. use ghc's version- ,"ghc"- ,"ghc-prim"- ,"haskell98"- ,"hpc" --has ebuild, but only in the overlay- ,"integer" -- up to ghc-6.10- ,"integer-gmp" -- ghc-6.12+- ,"old-locale"- ,"old-time"- ,"packedstring"- ,"pretty"- ,"process"- -- ,"random" -- not a core package since ghc-7.2- ,"rts"- -- ,"syb" -- was splitted off from ghc again- ,"template-haskell"- ,"unix" -- unsafe to upgrade- ]
Merge.hs view
@@ -7,6 +7,7 @@ import Control.Monad.Error import Control.Exception import qualified Data.ByteString.Lazy.Char8 as BL+import Data.Char (isSpace) import Data.Maybe import Data.List as L import Data.Version@@ -32,6 +33,7 @@ -- others import System.Directory ( getCurrentDirectory+ , getDirectoryContents , setCurrentDirectory , createDirectoryIfMissing , doesFileExist@@ -62,11 +64,8 @@ {- Requested features:- * Copy the old keywords and ~arch them- * Add files to darcs?+ * Add files to git? * Print diff with the next latest version?-BUGS:- * Dependencies are always expected to be in dev-haskell -} readPackageString :: [String]@@ -199,10 +198,23 @@ forM_ excludePkgs $ \(Cabal.PackageName name) -> info verbosity $ "Excluded packages (comes with ghc): " ++ name - let ebuild = (\e -> e { E.depend = Merge.dep edeps } )+ let p_flag (Cabal.FlagName fn, True) = fn+ p_flag (Cabal.FlagName fn, False) = '-':fn++ -- appends 's' to each line except the last one+ -- handy to build multiline shell expressions+ icalate _s [] = []+ icalate _s [x] = [x]+ icalate s (x:xs) = (x ++ s) : icalate s xs++ selected_flags [] = []+ selected_flags fs = icalate " \\" $ "haskell-cabal_src_configure" : map (("\t--flag=" ++) . p_flag) fs++ ebuild = (\e -> e { E.depend = Merge.dep edeps } ) . (\e -> e { E.depend_extra = Merge.dep_e edeps } ) . (\e -> e { E.rdepend = Merge.rdep edeps } ) . (\e -> e { E.rdepend_extra = Merge.rdep_e edeps } )+ . (\e -> e { E.src_configure = selected_flags flags } ) $ C2E.cabal2ebuild pkgDesc mergeEbuild verbosity overlayPath (Portage.unCategory cat) ebuild@@ -232,8 +244,42 @@ (\_ -> setCurrentDirectory oldDir) (\_ -> action) +extractKeywords :: FilePath -> String -> Maybe [String]+extractKeywords ebuild_path s_ebuild =+ let ltrim :: String -> String+ ltrim = dropWhile isSpace+ lns = lines s_ebuild+ -- TODO: nicer pattern match and errno+ in case (findIndices (isPrefixOf "KEYWORDS=\"" . ltrim) lns) of+ [] -> Nothing+ [kw_ln] -> let kw_line = lns !! kw_ln+ kw_str = (fst . break (== '"') . tail . snd . break (== '"')) kw_line+ keywords = words kw_str+ in Just keywords+ other -> error $ ebuild_path ++ ": parse_ebuild: strange KEYWORDS lines: " ++ show other++findExistingKeywords :: FilePath -> IO (Maybe [String])+findExistingKeywords edir =+ do ebuilds <- filter (isPrefixOf (reverse ".ebuild") . reverse) `fmap` getDirectoryContents edir+ -- TODO: version sort+ e_kw_s <- forM ebuilds $ \e ->+ do let e_path = edir </> e+ e_conts <- readFile e_path+ return (e, extractKeywords e_path e_conts)+ if null e_kw_s+ then return Nothing+ else return (snd $ last e_kw_s)++-- "amd64" -> "~amd64"+to_unstable :: String -> String+to_unstable kw =+ case kw of+ '~':_ -> kw+ '-':_ -> kw+ _ -> '~':kw+ mergeEbuild :: Verbosity -> FilePath -> String -> E.EBuild -> IO () -mergeEbuild verbosity target cat ebuild = do +mergeEbuild verbosity target cat ebuild = do let edir = target </> cat </> E.name ebuild elocal = E.name ebuild ++"-"++ E.version ebuild <.> "ebuild" epath = edir </> elocal@@ -241,8 +287,16 @@ mpath = edir </> emeta default_meta = BL.pack $ Portage.makeDefaultMetadata (E.long_desc ebuild) createDirectoryIfMissing True edir+ existing_keywords <- findExistingKeywords edir++ let new_keywords = maybe (E.keywords ebuild) (map to_unstable) (existing_keywords)+ ebuild' = ebuild { E.keywords = new_keywords }+ s_ebuild' = display ebuild'++ notice verbosity $ "Current keywords: " ++ show existing_keywords ++ " -> " ++ show new_keywords+ notice verbosity $ "Writing " ++ elocal- BL.writeFile epath (BL.pack $ display ebuild)+ (length s_ebuild') `seq` BL.writeFile epath (BL.pack s_ebuild') yet_meta <- doesFileExist mpath if (not yet_meta) -- TODO: add --force-meta-rewrite to opts
Merge/Dependencies.hs view
@@ -123,8 +123,11 @@ cabal_dep = cabalDependency overlay pkg compiler ghc_dep = compilerIdToDependency compiler extra_libs = findCLibs pkg- build_tools = buildToolsDependencies pkg- pkg_config = pkgConfigDependencies overlay pkg+ pkg_config_libs = pkgConfigDependencies overlay pkg+ pkg_config_tools = if null pkg_config_libs+ then []+ else [Portage.AnyVersionOf (Portage.mkPackageName "virtual" "pkgconfig") Portage.AnySlot []]+ build_tools = buildToolsDependencies pkg ++ pkg_config_tools edeps | treatAsLibrary = emptyEDep {@@ -135,7 +138,7 @@ rdep = set_build_slot ghc_dep : haskell_deps ++ extra_libs- ++ pkg_config+ ++ pkg_config_libs } | otherwise = emptyEDep {@@ -145,7 +148,7 @@ ++ haskell_deps ++ test_deps, dep_e = [ "${RDEPEND}" ],- rdep = extra_libs ++ pkg_config+ rdep = extra_libs ++ pkg_config_libs } add_profile = Portage.addDepUseFlag (Portage.mkQUse "profile") set_build_slot = Portage.setSlotDep Portage.AnyBuildTimeSlot@@ -245,6 +248,15 @@ , ("libzip", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "libzip") Portage.AnySlot []) , ("ssl", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "openssl") Portage.AnySlot []) , ("Judy", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "judy") Portage.AnySlot [])+ , ("fcgi", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "fcgi") Portage.AnySlot [])+ , ("gnutls", Portage.AnyVersionOf (Portage.mkPackageName "net-libs" "gnutls") Portage.AnySlot [])+ , ("idn", Portage.AnyVersionOf (Portage.mkPackageName "net-dns" "libidn") Portage.AnySlot [])+ , ("tre", Portage.AnyVersionOf (Portage.mkPackageName "dev-libs" "tre") Portage.AnySlot [])+ , ("m", Portage.AnyVersionOf (Portage.mkPackageName "virtual" "libc") Portage.AnySlot [])+ , ("asound", Portage.AnyVersionOf (Portage.mkPackageName "media-libs" "alsa-lib") Portage.AnySlot [])+ , ("sqlite3", Portage.OrLaterVersionOf (Portage.Version [3,0] Nothing [] 0) (Portage.mkPackageName "dev-db" "sqlite") Portage.AnySlot [])+ , ("stdc++", Portage.AnyVersionOf (Portage.mkPackageName "sys-devel" "gcc") Portage.AnySlot [Portage.mkUse "cxx"])+ , ("crack", Portage.AnyVersionOf (Portage.mkPackageName "sys-libs" "cracklib") Portage.AnySlot []) ] ---------------------------------------------------------------@@ -303,7 +315,7 @@ | pkg@(Cabal.Dependency (Cabal.PackageName pn) _range) <- cdeps ] resolvePkgConfig :: Portage.Overlay -> Cabal.Dependency -> Maybe Portage.Dependency-resolvePkgConfig overlay (Cabal.Dependency (Cabal.PackageName pn) _cabalVersion) = do+resolvePkgConfig _overlay (Cabal.Dependency (Cabal.PackageName pn) _cabalVersion) = do (cat,portname, slot) <- lookup pn table return $ Portage.AnyVersionOf (Portage.mkPackageName cat portname) slot [] @@ -371,5 +383,7 @@ ,("libxml2", ("dev-libs", "libxml2", Portage.AnySlot)) ,("libgsasl", ("virtual", "gsasl", Portage.AnySlot)) ,("libzip", ("dev-libs", "libzip", Portage.AnySlot))-+ ,("gnutls", ("net-libs", "gnutls", Portage.AnySlot))+ ,("libidn", ("net-dns", "libidn", Portage.AnySlot))+ ,("libxml-2.0", ("dev-libs", "libxml2", Portage.AnySlot)) ]
Portage/EBuild.hs view
@@ -33,6 +33,8 @@ rdepend_extra :: [String], features :: [String], my_pn :: Maybe String -- ^ Just 'myOldName' if the package name contains upper characters+ , src_prepare :: [String] -- ^ raw block for src_prepare() contents+ , src_configure :: [String] -- ^ raw block for src_configure() contents } getHackportVersion :: Version -> String@@ -58,6 +60,8 @@ rdepend_extra = [], features = [], my_pn = Nothing+ , src_prepare = []+ , src_configure = [] } instance Text EBuild where@@ -77,7 +81,7 @@ showEBuild :: EBuild -> String showEBuild ebuild =- ss "# Copyright 1999-2012 Gentoo Foundation". nl.+ ss "# Copyright 1999-2013 Gentoo Foundation". nl. ss "# Distributed under the terms of the GNU General Public License v2". nl. ss "# $Header: $". nl. nl.@@ -107,33 +111,50 @@ dep_str "DEPEND" ( depend_extra ebuild) ( depend ebuild). (case my_pn ebuild of Nothing -> id- Just _ -> nl. ss "S=". quote ("${WORKDIR}/${MY_P}"). nl)- $ []- where expandVars = replaceMultiVars [ ( name ebuild, "${PN}")+ Just _ -> nl. ss "S=". quote ("${WORKDIR}/${MY_P}"). nl).+ verbatim (nl. ss "src_prepare() {" . nl)+ (src_prepare ebuild)+ (ss "}" . nl).+ verbatim (nl. ss "src_configure() {" . nl)+ (src_configure ebuild)+ (ss "}" . nl).+ id $ []+ where+ expandVars = replaceMultiVars [ ( name ebuild, "${PN}") , (hackage_name ebuild, "${HACKAGE_N}") ]- toMirror = replace "http://hackage.haskell.org/" "mirror://hackage/" + toMirror = replace "http://hackage.haskell.org/" "mirror://hackage/" -ss :: String -> String -> String+type DString = String -> String++ss :: String -> DString ss = showString -sc :: Char -> String -> String+sc :: Char -> DString sc = showChar -nl :: String -> String+nl :: DString nl = sc '\n' -dep_str :: String -> [String] -> [Dependency] -> (String -> String)+verbatim :: DString -> [String] -> DString -> DString+verbatim pre s post =+ if null s+ then id+ else pre .+ (foldl (\acc v -> acc . ss "\t" . ss v . nl) id s) .+ post++dep_str :: String -> [String] -> [Dependency] -> DString dep_str var extra deps = ss var. sc '='. quote' (sepBy "\n\t\t" $ extra ++ map display deps). nl -quote :: String -> String -> String+quote :: String -> DString quote str = sc '"'. ss (esc str). sc '"' where esc = concatMap esc' esc' '"' = "\"" esc' c = [c] -quote' :: (String -> String) -> String -> String+quote' :: DString -> DString quote' str = sc '"'. str. sc '"' sepBy :: String -> [String] -> ShowS@@ -142,31 +163,31 @@ sepBy s (x:xs) = ss x. ss s. sepBy s xs getRestIfPrefix ::- String -> -- ^ the prefix- String -> -- ^ the string- Maybe String+ String -> -- ^ the prefix+ String -> -- ^ the string+ Maybe String getRestIfPrefix (p:ps) (x:xs) = if p==x then getRestIfPrefix ps xs else Nothing getRestIfPrefix [] rest = Just rest getRestIfPrefix _ [] = Nothing subStr ::- String -> -- ^ the search string- String -> -- ^ the string to be searched- Maybe (String,String) -- ^ Just (pre,post) if string is found+ String -> -- ^ the search string+ String -> -- ^ the string to be searched+ Maybe (String,String) -- ^ Just (pre,post) if string is found subStr sstr str = case getRestIfPrefix sstr str of- Nothing -> if null str then Nothing else case subStr sstr (tail str) of- Nothing -> Nothing- Just (pre,post) -> Just (head str:pre,post)- Just rest -> Just ([],rest)+ Nothing -> if null str then Nothing else case subStr sstr (tail str) of+ Nothing -> Nothing+ Just (pre,post) -> Just (head str:pre,post)+ Just rest -> Just ([],rest) replaceMultiVars ::- [(String,String)] -> -- ^ pairs of variable name and content- String -> -- ^ string to be searched- String -- ^ the result+ [(String,String)] -> -- ^ pairs of variable name and content+ String -> -- ^ string to be searched+ String -- ^ the result replaceMultiVars [] str = str replaceMultiVars whole@((pname,cont):rest) str = case subStr cont str of- Nothing -> replaceMultiVars rest str- Just (pre,post) -> (replaceMultiVars rest pre)++pname++(replaceMultiVars whole post)+ Nothing -> replaceMultiVars rest str+ Just (pre,post) -> (replaceMultiVars rest pre)++pname++(replaceMultiVars whole post) -- map the cabal license type to the gentoo license string format convertLicense :: Cabal.License -> String
Portage/GHCCore.hs view
@@ -1,7 +1,8 @@ -- Guess GHC version from packages depended upon. module Portage.GHCCore- ( minimumGHCVersionToBuildPackage+ ( coreLibs+ , minimumGHCVersionToBuildPackage , cabalFromGHC , defaultGHC ) where@@ -64,7 +65,7 @@ -- Packages that are not core will always be accepted, packages that are -- core in any ghc must be satisfied by the 'PackageIndex'. dependencySatisfiable :: PackageIndex -> Dependency -> Bool-dependencySatisfiable pi dep@(Dependency pn rang)+dependencySatisfiable pi dep@(Dependency pn _rang) | pn == PackageName "Win32" = False -- only exists on windows, not in linux | not . null $ lookupDependency pi dep = True -- the package index satisfies the dep | packageIsCoreInAnyGHC pn = False -- some other ghcs support the dependency@@ -161,7 +162,7 @@ , p "pretty" [1,1,1,0] , p "process" [1,1,0,2] , p "template-haskell" [2,8,0,0] -- used by libghc--- , p "time" [1,4,0,1] -- upgradeable, but used by haskell98+ , p "time" [1,4,0,1] -- used by haskell98, unix, directory, hpc, ghc. unsafe to upgrade , p "unix" [2,6,0,0] ] @@ -188,7 +189,7 @@ , p "pretty" [1,1,1,0] , p "process" [1,1,0,1] , p "template-haskell" [2,7,0,0] -- used by libghc--- , p "time" [1,4] -- upgradeable, but used by haskell98+ , p "time" [1,4] , p "unix" [2,5,1,1] ] @@ -215,7 +216,7 @@ , p "pretty" [1,1,1,0] , p "process" [1,1,0,1] , p "template-haskell" [2,7,0,0] -- used by libghc--- , p "time" [1,4] -- upgradeable, but used by haskell98+ , p "time" [1,4] , p "unix" [2,5,1,0] ] @@ -241,7 +242,7 @@ , p "process" [1,0,1,5] -- , p "random" [1,0,0,3] -- will not be shipped starting from ghc-7.2 , p "template-haskell" [2,5,0,0]--- , p "time" [1,2,0,3] package is upgradeable+ , p "time" [1,2,0,3] , p "unix" [2,4,2,0] ] @@ -269,7 +270,7 @@ -- , p "random" [1,0,0,2] -- will not be shipped starting from ghc-7.2 -- , p "syb" [0,1,0,2] -- not distributed with ghc-7 , p "template-haskell" [2,4,0,1]--- , p "time" [1,1,4] package is upgradeable+ , p "time" [1,1,4] , p "unix" [2,4,0,2] -- , p "utf8-string" [0,3,4] package is upgradeable ]@@ -297,7 +298,7 @@ -- , p "random" [1,0,0,2] -- will not be shipped starting from ghc-7.2 -- , p "syb" [0,1,0,2] -- not distributed with ghc-7 , p "template-haskell" [2,4,0,1]--- , p "time" [1,1,4] package is upgradeable+ , p "time" [1,1,4] , p "unix" [2,4,0,1] -- , p "utf8-string" [0,3,4] package is upgradeable ]@@ -325,7 +326,7 @@ -- , p "random" [1,0,0,2] -- will not be shipped starting from ghc-7.2 -- , p "syb" [0,1,0,2] -- not distributed with ghc-7 , p "template-haskell" [2,4,0,0]--- , p "time" [1,1,4] package is upgradeable+ , p "time" [1,1,4] , p "unix" [2,4,0,0] -- , p "utf8-string" [0,3,4] package is upgradeable ]@@ -353,9 +354,39 @@ -- , p "random" [1,0,0,1] -- will not be shipped starting from ghc-7.2 -- , p "syb" [0,1,0,1] -- not distributed with ghc-7 , p "template-haskell" [2,3,0,1]--- , p "time" [1,1,4] package is upgradeable , p "unix" [2,3,2,0] ] p :: String -> [Int] -> PackageIdentifier p pn vs = PackageIdentifier (PackageName pn) (Version vs [])++coreLibs :: [PackageName]+coreLibs = map PackageName+ ["array"+ ,"base"+ ,"bytestring" -- intentionally no ebuild. use ghc's version+ -- to avoid dreaded 'diamond dependency' problem+ ,"containers"+ ,"directory"+ --,"editline"+ ,"filepath" -- intentionally no ebuild. use ghc's version+ ,"ghc"+ ,"ghc-prim"+ ,"haskell98"+ ,"hpc" --has ebuild, but only in the overlay+ ,"integer" -- up to ghc-6.10+ ,"integer-gmp" -- ghc-6.12++ ,"old-locale"+ ,"old-time"+ ,"packedstring"+ ,"pretty"+ ,"process"+ -- ,"random" -- not a core package since ghc-7.2+ ,"rts"+ -- ,"syb" -- was splitted off from ghc again+ ,"template-haskell"+ ,"time" -- ghc-6.12+. startig from ghc-7.6.1 it is very+ -- unsafe to unpgrade as most others (like directory)+ -- depend on it+ ,"unix" -- unsafe to upgrade+ ]
Status.hs view
@@ -155,7 +155,8 @@ -- * Newer version in overlay than in portage toPortageFilter :: Map PackageName [FileStatus ExistingEbuild] -> Map PackageName [FileStatus ExistingEbuild] toPortageFilter = Map.mapMaybe $ \ sts ->- let inPortage = flip filter sts $ \st ->+ let filter_out_lives = filter (not . V.is_live . pkgVersion . ebuildId . fromStatus)+ inPortage = flip filter sts $ \st -> case st of OverlayOnly _ -> False HackageOnly _ -> False@@ -166,7 +167,7 @@ Differs _ _ -> True _ | pkgVersion (ebuildId (fromStatus st)) > latestPortageVersion -> True | otherwise -> False- in if not (null inPortage) && not (null interestingPackages)+ in if not (null inPortage) && not (null $ filter_out_lives interestingPackages) then Just sts else Nothing
TODO view
@@ -9,31 +9,20 @@ still are any missing. set good default values, and make sure we don't get any 'fromFlag' errors due to missing defaults for all commands -* catch base constraints and upgrade ghc requirement- (like in vty-4.0.0.1: base >= 4 leads to ghc >= 6.10)- Harder ====== -* translate the dev-db/libpq dependency into dev-db/postgresql-base- the cabal field to describe c libs should be translated if we know the- proper gentoo package name.- * see if PackageIndex and IndexUtils from cabal install can be used instead of Index see Distribution.Simple.PackageIndex PackageIndex Ebuild? -* make clear destinction of Hackage.Package and Portage.Package (notice the namespaces)+* make clear distinction of Hackage.Package and Portage.Package (notice the namespaces) Look into Portage, P2 and whatever other hacks there might be and properly separate them into the two categories. See the already existing Portage.PackageId -* look into Ebuild's field ePkgDesc and its uses- * Merge the separate tool keyword-stat into hackport, and make it use the hackport API. See http://code.haskell.org/gentoo/keyword-stat/ * Pick keywords from latest available ebuild--* hacport status --to-portage should warn about different 'ChangeLog' and 'metadata.xml' files
+ cabal/.gitignore view
@@ -0,0 +1,25 @@+# trivial gitignore file++cabal-dev/+Cabal/dist/+cabal-install/dist/+.hpc/+*.hi+*.o+*.p_hi+*.prof+*.tix++# editor temp files++*#+.#*+*~+.*.swp++# GHC build++Cabal/GNUmakefile+Cabal/dist-boot/+Cabal/dist-install/+Cabal/ghc.mk
hackport.cabal view
@@ -1,11 +1,11 @@ Name: hackport-Version: 0.3.1-License: GPL+Version: 0.3.2+License: GPL License-file: LICENSE-Author: Henning Günther, Duncan Coutts, Lennart Kolmodin+Author: Henning Günther, Duncan Coutts, Lennart Kolmodin Maintainer: Gentoo Haskell team <haskell@gentoo.org> Category: Distribution-Synopsis: Hackage and Portage integration tool+Synopsis: Hackage and Portage integration tool Description: A command line tool to manage an overlay of Gentoo ebuilds that are generated from a hackage repo of Cabal packages. Build-Type: Simple@@ -17,8 +17,8 @@ Flag split-base -Executable hackport- Main-Is: Main.hs+Executable hackport+ Main-Is: Main.hs Default-Language: Haskell98 Hs-Source-Dirs: ., cabal, cabal/Cabal, cabal/cabal-install Build-Depends:@@ -89,8 +89,8 @@ Util -Executable hackport-guess-ghc-version- Main-Is: Main-GuessGHC.hs+Executable hackport-guess-ghc-version+ Main-Is: Main-GuessGHC.hs Default-Language: Haskell98 Buildable: False -- this was used as a test while developing the