Make ghc-cabal handle "Custom" Setup.hs files that have a configure script
[ghc-hetmet.git] / utils / ghc-cabal / ghc-cabal.hs
index c806d3c..7d2f522 100644 (file)
@@ -9,15 +9,14 @@ 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.Register
+import Distribution.Simple.PackageIndex
 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.Maybe
@@ -105,13 +104,12 @@ doInstall ghcpkg ghcpkgconf directory distDir myDestDir myPrefix myLibdir myDocd
      defaultMainWithHooksArgs hooks ("register" : "--builddir" : distDir : args)
     where
       hooks = userHooks {
-                  copyHook = modHook (copyHook userHooks),
+                  copyHook = noGhcPrimHook (modHook (copyHook userHooks)),
                   regHook  = modHook (regHook userHooks)
               }
 
-      modHook f pd lbi us flags
-              = let
-                    pd'
+      noGhcPrimHook f pd lbi us flags
+              = let pd'
                      | packageName pd == PackageName "ghc-prim" =
                         case library pd of
                         Just lib ->
@@ -122,7 +120,9 @@ doInstall ghcpkg ghcpkgconf directory distDir myDestDir myPrefix myLibdir myDocd
                         Nothing ->
                             error "Expected a library, but none found"
                      | otherwise = pd
-                    idts = installDirTemplates lbi
+                in f pd' lbi us flags
+      modHook f pd lbi us flags
+              = let idts = installDirTemplates lbi
                     idts' = idts { prefix    = toPathTemplate myPrefix,
                                    libdir    = toPathTemplate myLibdir,
                                    libsubdir = toPathTemplate "$pkgid",
@@ -143,12 +143,12 @@ doInstall ghcpkg ghcpkgconf directory distDir myDestDir myPrefix myLibdir myDocd
                                    installDirTemplates = idts',
                                    withPrograms = progs'
                                }
-                in f pd' lbi' us flags
+                in f pd lbi' us flags
 
 generate :: [String] -> FilePath -> FilePath -> IO ()
 generate config_args distdir directory
  = withCurrentDirectory directory
- $ do let verbosity = verbose
+ $ do let verbosity = normal
       gpdFile <- defaultPackageDesc verbosity
       gpd <- readPackageDescription verbosity gpdFile
 
@@ -158,14 +158,22 @@ 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
 
       hooked_bi <-
-           if (buildType pd0 == Just Configure)
+           if (buildType pd0 == Just Configure) || (buildType pd0 == Just Custom)
            then do
               maybe_infoFile <- defaultHookedPackageDesc
               case maybe_infoFile of
@@ -180,12 +188,19 @@ generate config_args distdir directory
       writeAutogenFiles verbosity pd lbi
 
       -- generate inplace-pkg-config
-      when (isJust $ library pd) $
-          writeInstalledConfig distdir pd lbi True Nothing
+      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 pd)
-          exeBiModules exe = (buildInfo exe, ModuleName.main : exeModules pd)
+          libBiModules lib = (libBuildInfo lib, libModules lib)
+          exeBiModules exe = (buildInfo exe, ModuleName.main : exeModules exe)
           biModuless = (maybeToList $ fmap libBiModules $ library pd)
                     ++ (map exeBiModules $ executables pd)
           buildableBiModuless = filter isBuildable biModuless
@@ -219,14 +234,15 @@ generate config_args distdir directory
       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 (packageDeps lbi)),
-                variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) (packageDeps lbi)),
+                variablePrefix ++ "_DEPS = " ++ unwords (map display (externalPackageDeps lbi)),
+                variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) (externalPackageDeps lbi)),
                 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 
@@ -244,3 +260,4 @@ generate config_args distdir directory
       writeFile (distdir ++ "/package-data.mk") $ unlines xs
   where
      escape = foldr (\c xs -> if c == '#' then '\\':'#':xs else c:xs) []
+