X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=utils%2Fghc-cabal%2Fghc-cabal.hs;h=8ee1304fb8086ef079a5d23251fd2b55e7ca2746;hb=72547264724117d689a7fa400104185557fb2a0c;hp=b5463c503ac9b34017d9f64ffa09f18f4602cfe3;hpb=0d9b5f10e97a7afe621e154979d737d91d8b7688;p=ghc-hetmet.git diff --git a/utils/ghc-cabal/ghc-cabal.hs b/utils/ghc-cabal/ghc-cabal.hs index b5463c5..8ee1304 100644 --- a/utils/ghc-cabal/ghc-cabal.hs +++ b/utils/ghc-cabal/ghc-cabal.hs @@ -3,36 +3,37 @@ module Main (main) where import qualified Distribution.ModuleName as ModuleName import Distribution.PackageDescription +import Distribution.PackageDescription.Check hiding (doesFileExist) import Distribution.PackageDescription.Configuration import Distribution.PackageDescription.Parse import Distribution.Simple import Distribution.Simple.Configure import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Program -import Distribution.Simple.Utils (defaultPackageDesc) +import Distribution.Simple.Utils (defaultPackageDesc, writeFileAtomic) import Distribution.Simple.Build (writeAutogenFiles) -import Distribution.Simple.Register (writeInstalledConfig) -import Distribution.Simple.PackageIndex +import Distribution.Simple.Register import Distribution.Text import Distribution.Verbosity import qualified Distribution.InstalledPackageInfo as Installed - ( InstalledPackageInfo_(..) ) import qualified Distribution.Simple.PackageIndex as PackageIndex - ( topologicalOrder, lookupPackageName, insert ) -import Control.Monad +import Data.List import Data.Maybe import System.IO import System.Directory import System.Environment import System.Exit import System.FilePath +import Data.Char main :: IO () main = do args <- getArgs case args of "haddock" : distDir : dir : args' -> runHaddock distDir dir args' + "check" : dir : [] -> + doCheck dir "install" : ghcpkg : ghcpkgconfig : directory : distDir : myDestDir : myPrefix : myLibdir : myDocdir : args' -> doInstall ghcpkg ghcpkgconfig directory distDir @@ -68,6 +69,20 @@ withCurrentDirectory directory io userHooks :: UserHooks userHooks = autoconfUserHooks +doCheck :: FilePath -> IO () +doCheck directory + = withCurrentDirectory directory + $ do let verbosity = normal + gpdFile <- defaultPackageDesc verbosity + gpd <- readPackageDescription verbosity gpdFile + case partition isFailure $ checkPackage gpd Nothing of + ([], []) -> return () + ([], warnings) -> mapM_ print warnings + (errs, _) -> do mapM_ print errs + exitWith (ExitFailure 1) + where isFailure (PackageDistSuspicious {}) = False + isFailure _ = True + runHaddock :: FilePath -> FilePath -> [String] -> IO () runHaddock distdir directory args = withCurrentDirectory directory @@ -128,7 +143,7 @@ doInstall ghcpkg ghcpkgconf directory distDir myDestDir myPrefix myLibdir myDocd idts' = idts { prefix = toPathTemplate myPrefix, libdir = toPathTemplate myLibdir, libsubdir = toPathTemplate "$pkgid", - docdir = toPathTemplate (myDocdir "$pkgid"), + docdir = toPathTemplate (myDocdir "$pkg"), htmldir = toPathTemplate "$docdir" } progs = withPrograms lbi prog = ConfiguredProgram { @@ -160,8 +175,16 @@ generate config_args distdir directory withArgs (["configure", "--distdir", distdir] ++ config_args) (case buildType (flattenPackageDescription gpd) of Just Configure -> defaultMainWithHooks autoconfUserHooks - _other -> defaultMain) - -- not quite right, but good enough for us + -- time has a "Custom" Setup.hs, but it's actually Configure + -- plus a "./Setup test" hook. However, Cabal is also + -- "Custom", but doesn't have a configure script. + Just Custom -> + do configureExists <- doesFileExist "configure" + if configureExists + then defaultMainWithHooks autoconfUserHooks + else defaultMain + -- not quite right, but good enough for us: + _ -> defaultMain) lbi <- getPersistBuildConfig distdir let pd0 = localPkgDescr lbi @@ -182,9 +205,17 @@ generate config_args distdir directory writeAutogenFiles verbosity pd lbi -- generate inplace-pkg-config - when (isJust $ library pd) $ - writeInstalledConfig distdir pd lbi True - (distdir "inplace-pkg-config") + case (library pd, libraryConfig lbi) of + (Nothing, Nothing) -> return () + (Just lib, Just clbi) -> do + cwd <- getCurrentDirectory + let ipid = InstalledPackageId (display (packageId pd) ++ "-inplace") + let installedPkgInfo = inplaceInstalledPackageInfo cwd distdir + pd lib lbi clbi + final_ipi = installedPkgInfo{ Installed.installedPackageId = ipid } + content = Installed.showInstalledPackageInfo final_ipi ++ "\n" + writeFileAtomic (distdir "inplace-pkg-config") content + _ -> error "Inconsistent lib components; can't happen?" let libBiModules lib = (libBuildInfo lib, libModules lib) @@ -214,22 +245,26 @@ generate config_args distdir directory -- stricter than gnu ld). Thus we remove the ldOptions for -- GHC's rts package: hackRtsPackage index = - case PackageIndex.lookupPackageName index (PackageName "rts") of - [rts] -> PackageIndex.insert rts { Installed.ldOptions = [] } index + case PackageIndex.lookupInstalledPackageByName index (PackageName "rts") of + [rts] -> PackageIndex.addToInstalledPackageIndex rts { Installed.ldOptions = [] } index _ -> error "No (or multiple) ghc rts package is registered!!" + dep_ids = map (packageId.getLocalPackageInfo lbi) $ + externalPackageDeps lbi + let variablePrefix = directory ++ '_':distdir let xs = [variablePrefix ++ "_VERSION = " ++ display (pkgVersion (package pd)), variablePrefix ++ "_MODULES = " ++ unwords (map display modules), variablePrefix ++ "_HS_SRC_DIRS = " ++ unwords (hsSourceDirs bi), - variablePrefix ++ "_DEPS = " ++ unwords (map display (externalPackageDeps lbi)), - variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) (externalPackageDeps lbi)), + variablePrefix ++ "_DEPS = " ++ unwords (map display dep_ids), + variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) dep_ids), variablePrefix ++ "_INCLUDE_DIRS = " ++ unwords (includeDirs bi), variablePrefix ++ "_INCLUDES = " ++ unwords (includes bi), variablePrefix ++ "_INSTALL_INCLUDES = " ++ unwords (installIncludes bi), variablePrefix ++ "_EXTRA_LIBRARIES = " ++ unwords (extraLibs bi), variablePrefix ++ "_EXTRA_LIBDIRS = " ++ unwords (extraLibDirs bi), variablePrefix ++ "_C_SRCS = " ++ unwords (cSources bi), + variablePrefix ++ "_CMM_SRCS = $(addprefix cbits/,$(notdir $(wildcard " ++ directory ++ "/cbits/*.cmm)))", -- XXX This includes things it shouldn't, like: -- -odir dist-bootstrapping/build variablePrefix ++ "_HC_OPTS = " ++ escape (unwords