Make our install variables etc compliant with GNU standards; fixes #1924
[ghc-hetmet.git] / utils / ghc-cabal / ghc-cabal.hs
index bd4efc4..8c9612f 100644 (file)
@@ -3,24 +3,22 @@ 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
@@ -33,6 +31,8 @@ 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 +68,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 +142,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 +174,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 +204,15 @@ 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 installedPkgInfo = inplaceInstalledPackageInfo cwd distdir
+                                         pd lib lbi clbi
+                  content = Installed.showInstalledPackageInfo installedPkgInfo ++ "\n"
+              writeFileAtomic (distdir </> "inplace-pkg-config") content
+          _ -> error "Inconsistent lib components; can't happen?"
 
       let
           libBiModules lib = (libBuildInfo lib, libModules lib)