Subject: Re: Cabal: Improve Haddock support
From: Henning Thielemann <[email-masked]>
To: Isaac Jones <[email-masked]>
Date: Mon, 12 Jun 2006 12:46:56 +0200 (MEST)

On Mon, 5 Jun 2006, Henning Thielemann wrote:

> I've started hacking on Distribution/Simple in order to improve the haddock 
> support. I do now pass two more things to haddock: The --dump-interface 
> option, which generates the .haddock files which are needed by other haddock 
> documentation that refers to this one, and the --use-package option for 
> linking haddock to existing documentation. However, I have noticed that Cabal 
> does not install haddock documentation so far. Thus I cannot link to 
> documentation of custom Cabal packages, yet. I see the problem of finding an 
> appropriate path for installed documentation. I will add some checks for 
> common documentation paths on Linux in the configure phase.
>
> I'll sent some darcs patches when I'm ready.

I do now send you my improvements for Haddock support in Cabal. The 
packages which a Cabal project depends on are now also forwarded to 
haddock, so that it generate hyperlinks to them. Additionally the 
documentation of a Cabal package is installed in share/package/doc/html. 
Maybe the documentation path should configurable. Since this installation 
depends on the .installed-pkg-config, a generated documentation can only 
be installed after 'Setup build' was started. I think future versions of 
Cabal should generate the documentation within the 'build' step.
  Manuals for executables cannot be properly generated so far, because they 
depend on the installed package, but during the 'Setup haddock' procedure 
the main documentation is not present at the installation path.

New patches:

[generate .haddock interface file when running haddock
[email-masked]**20060604195216] {
hunk ./Distribution/Simple.hs 391
+
+getModulePaths :: BuildInfo -> [String] -> IO [FilePath]
+getModulePaths bi =
+   fmap concat .
+      mapM (flip (moduleToFilePath (hsSourceDirs bi)) ["hs", "lhs"])
+
hunk ./Distribution/Simple.hs 401
-                      let haddockName = programName $ haddockProgram
+                      let haddockName = programName haddockProgram
hunk ./Distribution/Simple.hs 403
-                      case mHaddock of
-                        Nothing -> (die "haddock command not found")
-                        Just h  -> return h
+                      maybe (die "haddock command not found") return mHaddock
hunk ./Distribution/Simple.hs 410
-    
+
hunk ./Distribution/Simple.hs 413
+    let replaceLitExts = map (joinFileName tmpDir . flip changeFileExt "hs")
+    let mockAll bi = mapM_ (mockPP ["-D__HADDOCK__"] pkg_descr bi lbi tmpDir verbose)
+
hunk ./Distribution/Simple.hs 418
-        inFiles <- sequence [moduleToFilePath (hsSourceDirs bi) m ["hs", "lhs"]
-                               | m <- exposedModules lib ++ otherModules bi] >>= return . concat
-        mapM_ (mockPP ["-D__HADDOCK__"] pkg_descr bi lbi tmpDir verbose) inFiles
+        inFiles <- getModulePaths bi (exposedModules lib ++ otherModules bi)
+        mockAll bi inFiles
hunk ./Distribution/Simple.hs 422
-        writeFile prologName ((description pkg_descr) ++ "\n")
-        let outFiles = map (joinFileName tmpDir)
-                       (map ((flip changeFileExt) "hs") inFiles)
+        writeFile prologName (description pkg_descr ++ "\n")
+        let outFiles = replaceLitExts inFiles
+        let haddockFile = joinFileExt (pkgName (package pkg_descr)) "haddock"
hunk ./Distribution/Simple.hs 430
-                  "-p", prologName] ++ (programArgs confHaddock)
-                ++ (if verbose > 4 then ["-v"] else [])
-                ++ outFiles
-                ++ map ((++) "--hide=") (otherModules bi)
+                  "-D", joinFileName targetDir haddockFile,
+                  "-p", prologName]
+                 ++ programArgs confHaddock
+                 ++ (if verbose > 4 then ["-v"] else [])
+                 ++ outFiles
+                 ++ map ("--hide=" ++) (otherModules bi)
hunk ./Distribution/Simple.hs 442
-        inFiles' <- sequence [moduleToFilePath (hsSourceDirs bi) m ["hs", "lhs"]
-                               | m <- otherModules bi] >>= return . concat
+        inFiles' <- getModulePaths bi (otherModules bi)
hunk ./Distribution/Simple.hs 445
-        mapM_ (mockPP ["-D__HADDOCK__"] pkg_descr bi lbi tmpDir verbose) inFiles
-        let outFiles = map (joinFileName tmpDir)
-                       (map ((flip changeFileExt) "hs") inFiles)
+        mockAll bi inFiles
+        let outFiles = replaceLitExts inFiles
hunk ./Distribution/Simple.hs 450
-                  "-t", exeName exe] ++ (programArgs confHaddock)
-                ++ (if verbose > 4 then ["-v"] else [])
-                ++ outFiles
+                  "-t", exeName exe]
+                 ++ programArgs confHaddock
+                 ++ (if verbose > 4 then ["-v"] else [])
+                 ++ outFiles
hunk ./Distribution/Simple.hs 471
-        needsCpp p | not (hasLibs p) = False
-                   | otherwise = any (== CPP) (extensions $ libBuildInfo $ fromJust $ library p)
+        needsCpp p =
+           hasLibs p &&
+           any (== CPP) (extensions $ libBuildInfo $ fromJust $ library p)
hunk ./Distribution/Simple.hs 485
-        inFiles <- sequence [moduleToFilePath (hsSourceDirs bi) m ["hs", "lhs"]
-                                | m <- mods] >>= return . concat
+        inFiles <- getModulePaths bi mods
hunk ./Distribution/Simple.hs 524
-                s <- sequence [moduleToFilePath dirs (x ++"_stub") ["h", "c"]
-                                 | x <- mods ]
-                mapM_ removeFile (concat s)
+            s <- mapM (\x -> moduleToFilePath dirs (x ++"_stub") ["h", "c"]) mods
+            mapM_ removeFile (concat s)
hunk ./Distribution/Simple.hs 541
-  die ("Unrecognised flags: " ++ concat (intersperse "," (extra_flags)))
+  die ("Unrecognised flags: " ++ concat (intersperse "," extra_flags))
}

[stripPrefix -> dropPrefix
[email-masked]**20060604195549] {
hunk ./Distribution/Compat/FilePath.hs 11
-         , joinPaths         
+         , joinPaths
hunk ./Distribution/Compat/FilePath.hs 85
-      [_]                          -> path1   -- don't remove the trailing slash if 
+      [_]                          -> path1   -- don't remove the trailing slash if
hunk ./Distribution/Compat/FilePath.hs 123
--- | Split the path into directory, file name and extension. 
+-- | Split the path into directory, file name and extension.
hunk ./Distribution/Compat/FilePath.hs 143
--- | The 'joinFileName' function is the opposite of 'splitFileName'. 
+-- | The 'joinFileName' function is the opposite of 'splitFileName'.
hunk ./Distribution/Compat/FilePath.hs 184
-  | otherwise          = 
+  | otherwise          =
hunk ./Distribution/Compat/FilePath.hs 193
-  
+
hunk ./Distribution/Compat/FilePath.hs 197
-                                    -- Specify an empty string to remove an existing 
+                                    -- Specify an empty string to remove an existing
hunk ./Distribution/Compat/FilePath.hs 237
--- 
+--
hunk ./Distribution/Compat/FilePath.hs 247
--- 
--- >  stripPrefix "." "Src/Test.hs" == "Src/Test.hs"
--- >  stripPrefix "Src" "Src/Test.hs" == "Test.hs"
+--
+-- >  dropPrefix "." "Src/Test.hs" == "Src/Test.hs"
+-- >  dropPrefix "Src" "Src/Test.hs" == "Test.hs"
hunk ./Distribution/Compat/FilePath.hs 257
--- The function is useful in case if you want to create 
--- some file but you aren\'t sure whether all directories 
+-- The function is useful in case if you want to create
+-- some file but you aren\'t sure whether all directories
hunk ./Distribution/Compat/FilePath.hs 260
--- 
+--
hunk ./Distribution/Compat/FilePath.hs 280
--- Note that if the file is relative then the current directory (\".\") 
+-- Note that if the file is relative then the current directory (\".\")
hunk ./Distribution/Compat/FilePath.hs 302
-       inits cs = 
+       inits cs =
hunk ./Distribution/Compat/FilePath.hs 315
-commonParent paths@(p:ps) = 
+commonParent paths@(p:ps) =
hunk ./Distribution/Compat/FilePath.hs 318
-    Nothing | all (not . isAbsolutePath) paths -> 
+    Nothing | all (not . isAbsolutePath) paths ->
hunk ./Distribution/Compat/FilePath.hs 320
-         getDrive (d:':':_) ds 
+         getDrive (d:':':_) ds
hunk ./Distribution/Compat/FilePath.hs 344
-    removeSep i acc cs pacc []          = 
+    removeSep i acc cs pacc []          =
hunk ./Distribution/Compat/FilePath.hs 369
-        []     -> [chunk] 
+        []     -> [chunk]
hunk ./Distribution/Compat/FilePath.hs 372
-        chunk = 
+        chunk =
hunk ./Distribution/Compat/FilePath.hs 414
--- | A platform-specific character used to separate search path strings in 
--- environment variables. The separator is a colon (\":\") on Unix and Macintosh, 
+-- | A platform-specific character used to separate search path strings in
+-- environment variables. The separator is a colon (\":\") on Unix and Macintosh,
}

[Distribution.simple: haddock option --use-package tells which packages to hyperlink to
[email-masked]**20060605183304] {
hunk ./Distribution/Simple.hs 415
+    let showPkg     = showPackageId (package pkg_descr)
+    let showDepPkgs = map showPackageId (packageDeps lbi)
hunk ./Distribution/Simple.hs 422
-        let showPkg = showPackageId (package pkg_descr)
hunk ./Distribution/Simple.hs 430
-                  "-t", showPkg,
+                  "-t", showPkg ++ ": " ++ synopsis pkg_descr,
+                  "-k", showPkg,
hunk ./Distribution/Simple.hs 434
+                 ++ map ("--use-package=" ++) showDepPkgs
hunk ./Distribution/Simple.hs 454
+                 ++ map ("--use-package=" ++) (showPkg:showDepPkgs)
}

[Distribution.Compat.Directory: added getDirectoryContentsWithoutSpecial
[email-masked]**20060609192421] {
hunk ./Distribution/Compat/Directory.hs 3
-        removeDirectoryRecursive, module System.Directory
+        removeDirectoryRecursive, module System.Directory,
+        getDirectoryContentsWithoutSpecial
hunk ./Distribution/Compat/Directory.hs 114
-  cont <- getDirectoryContents startLoc
-  sequence_ [rm (startLoc `joinFileName` x) | x <- cont, x /= "." && x /= ".."]
+  cont <- getDirectoryContentsWithoutSpecial startLoc
+  mapM_ (rm . joinFileName startLoc) cont
hunk ./Distribution/Compat/Directory.hs 128
+
+getDirectoryContentsWithoutSpecial :: FilePath -> IO [FilePath]
+getDirectoryContentsWithoutSpecial =
+   fmap (filter (not . flip elem [".", ".."])) . getDirectoryContents
}

[Distribution.Simple.Utils: copyDirectoryRecursiveVerbose
[email-masked]**20060609192715] {
hunk ./Distribution/Simple/Utils.hs 56
+        copyDirectoryRecursiveVerbose,
hunk ./Distribution/Simple/Utils.hs 70
+        haddockPref,
hunk ./Distribution/Simple/Utils.hs 88
-import Control.Monad(when, filterM)
+import Control.Monad(when, filterM, unless)
hunk ./Distribution/Simple/Utils.hs 99
-	(splitFileName, splitFileExt, joinFileName, joinFileExt,
+	(splitFileName, splitFileExt, joinFileName, joinFileExt, joinPaths,
hunk ./Distribution/Simple/Utils.hs 102
-			, doesFileExist, removeFile, getPermissions
+			, doesDirectoryExist, doesFileExist, removeFile, getPermissions
hunk ./Distribution/Simple/Utils.hs 105
-import Distribution.Compat.Directory (copyFile,findExecutable,createDirectoryIfMissing)
+import Distribution.Compat.Directory
+           (copyFile, findExecutable, createDirectoryIfMissing,
+            getDirectoryContentsWithoutSpecial)
hunk ./Distribution/Simple/Utils.hs 275
--- |The path name that represents the current directory.  May be
--- system-specific.  In Unix, it's @\".\"@.
+-- adaptation of removeDirectoryRecursive
+copyDirectoryRecursiveVerbose :: Int -> FilePath -> FilePath -> IO ()
+copyDirectoryRecursiveVerbose verbose srcDir destDir = do
+  when (verbose > 0) $
+    putStrLn ("copy directory '" ++ srcDir ++ "' to '" ++ destDir ++ "'.")
+  let aux src dest =
+         let cp :: FilePath -> IO ()
+             cp f = let srcFile  = joinPaths src  f
+                        destFile = joinPaths dest f
+                    in  do success <- try (copyFileVerbose verbose srcFile destFile)
+                           case success of
+                              Left e  -> do isDir <- doesDirectoryExist srcFile
+                                            -- If f is not a directory, re-throw the error
+                                            unless isDir $ ioError e
+                                            aux srcFile destFile
+                              Right _ -> return ()
+         in  do createDirectoryIfMissing False dest
+                getDirectoryContentsWithoutSpecial src >>= mapM_ cp
+   in aux srcDir destDir
+
+
+
+
+-- | The path name that represents the current directory.
+-- In Unix, it's @\".\"@, but this is system-specific.
+-- (E.g. AmigaOS uses the empty string @\"\"@ for the current directory.)
hunk ./Distribution/Simple/Utils.hs 328
+
+haddockPref :: FilePath
+haddockPref = foldl1 joinPaths [distPref, "doc", "html"]
+
}

[PackageDescription: added toMaybe, some logical simplifications
[email-masked]**20060609193508] {
hunk ./Distribution/PackageDescription.hs 86
-import Data.Maybe(fromMaybe, fromJust, isNothing, catMaybes)
-import Data.List (nub)
+import Data.Maybe(fromMaybe, isNothing, catMaybes)
+import Data.List (nub,lookup)
hunk ./Distribution/PackageDescription.hs 185
-    = (maybe [] exposedModules lib)
-      ++ (maybe [] (otherModules . libBuildInfo) lib)
+    = maybe [] exposedModules lib
+       ++ maybe [] (otherModules . libBuildInfo) lib
hunk ./Distribution/PackageDescription.hs 196
+
+-- |'Maybe' version of 'hasLibs'
+maybeHasLibs :: PackageDescription -> Maybe Library
+maybeHasLibs p =
+   library p >>= (\lib -> toMaybe (buildable (libBuildInfo lib)) lib)
hunk ./Distribution/PackageDescription.hs 271
-withLib pkg_descr a f = if hasLibs pkg_descr
-                        then f (fromJust (library pkg_descr))
-                        else return a
+withLib pkg_descr a f =
+   maybe (return a) f (maybeHasLibs pkg_descr)
hunk ./Distribution/PackageDescription.hs 527
-            Nothing           -> syntaxError lineNo $ "No 'Main-Is' field found for " ++ eName ++ " stanza"
+            Nothing    -> syntaxError lineNo $ "No 'Main-Is' field found for " ++ eName ++ " stanza"
hunk ./Distribution/PackageDescription.hs 541
+        lookupField x sts = lookup x (map (\(n,f,v) -> (f,(n,v))) sts)
hunk ./Distribution/PackageDescription.hs 543
-        lookupField x ((n,f,v):st)
-          | x == f      = Just (n,v)
-          | otherwise   = lookupField x st
-        lookupField _ [] = Nothing
hunk ./Distribution/PackageDescription.hs 548
-  case mLib of
-    Nothing      -> do biExes <- mapM parseExe stanzas
-                       return (Nothing, biExes)
-    lib@(Just _) -> do biExes <- mapM parseExe exes
-                       return (lib, biExes)
+  biExes <- mapM parseExe (maybe stanzas (const exes) mLib)
+  return (mLib, biExes)
hunk ./Distribution/PackageDescription.hs 662
+
+toMaybe :: Bool -> a -> Maybe a
+toMaybe b x = if b then Just x else Nothing
hunk ./Distribution/PackageDescription.hs 675
-              = if null (f pkg_descr)
-                 then Just $ "Missing field: " ++ n
-                 else Nothing
+              = toMaybe (null (f pkg_descr)) ("Missing field: " ++ n)
hunk ./Distribution/PackageDescription.hs 678
-sanityCheckLib Nothing  = Nothing
-sanityCheckLib (Just l)
-    = if null $ exposedModules l
-      then Just "Non-empty library, but empty exposed modules list. Cabal may not build this library correctly"
-      else Nothing
+sanityCheckLib ml =
+   ml >>= (\l ->
+      toMaybe (null $ exposedModules l)
+              ("Non-empty library, but empty exposed modules list. " ++
+               "Cabal may not build this library correctly"))
hunk ./Distribution/PackageDescription.hs 685
-checkSanity False _  = Nothing
-checkSanity True  s  = Just s
+checkSanity = toMaybe
hunk ./Distribution/PackageDescription.hs 688
-hasMods pkg_descr
-    | isNothing (library pkg_descr) = null $ executables pkg_descr
-    | otherwise = null (executables pkg_descr)
-                   && null (exposedModules (fromJust (library pkg_descr)))
+hasMods pkg_descr =
+   null (executables pkg_descr) &&
+      maybe True (null . exposedModules) (library pkg_descr)
+
hunk ./Distribution/PackageDescription.hs 867
-                          in if e1 == e2
-                              then Nothing
-                              else Just (er ++ " Expected: " ++ show e1
-                                            ++ " Got: " ++ show e2)
+                          in toMaybe (e1 /= e2)
+                                     (er ++ " Expected: " ++ show e1
+                                              ++ " Got: " ++ show e2)
}

[PackageDescription: haddockName generates the name of the .haddock file
[email-masked]**20060609193924] {
hunk ./Distribution/PackageDescription.hs 78
+        haddockName,
hunk ./Distribution/PackageDescription.hs 107
+import Distribution.Compat.FilePath(joinFileExt)
hunk ./Distribution/PackageDescription.hs 341
+
+haddockName :: PackageDescription -> FilePath
+haddockName pkg_descr =
+   joinFileExt (pkgName (package pkg_descr)) "haddock"
}

[install Haddock documentation in share/package/doc/html and register that path in the ghc-pkg
[email-masked]**20060609194058] {
hunk ./Distribution/Simple.hs 85
-import Distribution.Simple.Configure(LocalBuildInfo(..), getPersistBuildConfig, maybeGetPersistBuildConfig,
+import Distribution.Simple.Configure(getPersistBuildConfig, maybeGetPersistBuildConfig,
hunk ./Distribution/Simple.hs 88
+import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..))
hunk ./Distribution/Simple.hs 92
-                                  moduleToFilePath, findFile, distPref, srcPref)
+                                  moduleToFilePath, findFile,
+                                  distPref, srcPref, haddockPref)
hunk ./Distribution/Simple.hs 106
-import Data.Maybe       ( isNothing, isJust, fromJust )
+import Data.Maybe       ( isJust, fromJust )
hunk ./Distribution/Simple.hs 111
-import Distribution.Compat.FilePath(joinFileName, joinPaths, splitFileName, joinFileExt,
-                                    splitFileExt, changeFileExt)
+import Distribution.Compat.FilePath(joinFileName, joinPaths, joinFileExt,
+                                    splitFileName, splitFileExt, changeFileExt)
hunk ./Distribution/Simple.hs 407
-    let targetDir = joinPaths distPref (joinPaths "doc" "html")
hunk ./Distribution/Simple.hs 409
-    createDirectoryIfMissing True targetDir
+    createDirectoryIfMissing True haddockPref
hunk ./Distribution/Simple.hs 426
-        let haddockFile = joinFileExt (pkgName (package pkg_descr)) "haddock"
+        let haddockFile = joinFileName haddockPref (haddockName pkg_descr)
hunk ./Distribution/Simple.hs 430
-                  "-o", targetDir,
+                  "-o", haddockPref,
hunk ./Distribution/Simple.hs 433
-                  "-D", joinFileName targetDir haddockFile,
+                  "-D", haddockFile,
hunk ./Distribution/Simple.hs 444
-            exeTargetDir = targetDir `joinFileName` exeName exe
+            exeTargetDir = haddockPref `joinFileName` exeName exe
hunk ./Distribution/Simple/Install.hs 70
-        LocalBuildInfo(..), mkLibDir, mkBinDir, mkDataDir, mkProgDir)
-import Distribution.Simple.Utils(smartCopySources, copyFileVerbose, mkLibName,
-                                 mkProfLibName, mkGHCiLibName, die, rawSystemVerbose)
+        LocalBuildInfo(..),
+        mkLibDir, mkBinDir, mkDataDir, mkProgDir, mkHaddockDir)
+import Distribution.Simple.Utils (
+          smartCopySources, copyFileVerbose,
+          mkLibName, mkProfLibName, mkGHCiLibName, die,
+          rawSystemVerbose, copyDirectoryRecursiveVerbose, haddockPref)
hunk ./Distribution/Simple/Install.hs 83
-                                     findExecutable)
+                                     findExecutable, doesDirectoryExist)
hunk ./Distribution/Simple/Install.hs 99
-  when (not (null (dataFiles pkg_descr))) $ do
+  let dataFilesExist = not (null (dataFiles pkg_descr))
+  docExists <- doesDirectoryExist haddockPref
+  when (verbose >= 4)
+       (putStrLn ("directory " ++ haddockPref ++
+                  " does exist: " ++ show docExists))
+  when (dataFilesExist || docExists) $ do
hunk ./Distribution/Simple/Install.hs 111
+    when docExists $ do
+      let targetDir = mkHaddockDir pkg_descr lbi copydest
+      createDirectoryIfMissing True targetDir
+      copyDirectoryRecursiveVerbose verbose haddockPref targetDir
+      -- setPermissionsRecursive [Read] targetDir
hunk ./Distribution/Simple/Install.hs 124
-                withExe pkg_descr $ installExeJHC verbose binPref buildPref pkg_descr
+                withExe pkg_descr    $ installExeJHC verbose binPref buildPref pkg_descr
hunk ./Distribution/Simple/Install.hs 129
-     _    -> die ("only installing with GHC or Hugs is implemented")
+     _    -> die ("only installing with GHC, JHC or Hugs is implemented")
hunk ./Distribution/Simple/LocalBuildInfo.hs 53
-	mkLibDir, mkLibDirRel, mkBinDir, mkBinDirRel, mkLibexecDir, mkLibexecDirRel, mkDataDir, mkDataDirRel, mkProgDir,
+	mkLibDir, mkLibDirRel, mkBinDir, mkBinDirRel, mkLibexecDir, mkLibexecDirRel, mkDataDir, mkDataDirRel, mkHaddockDir, mkProgDir,
hunk ./Distribution/Simple/LocalBuildInfo.hs 253
+
+mkHaddockDir :: PackageDescription -> LocalBuildInfo -> CopyDest -> FilePath
+mkHaddockDir pkg_descr lbi copydest =
+  foldl1 joinPaths [mkDataDir pkg_descr lbi copydest, "doc", "html"]
+
+
hunk ./Distribution/Simple/Register.hs 65
-import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), mkLibDir)
+import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), mkLibDir, mkHaddockDir)
hunk ./Distribution/Simple/Register.hs 69
-					BuildInfo(..), Library(..))
+					BuildInfo(..), Library(..), haddockName)
hunk ./Distribution/Simple/Register.hs 85
-import Distribution.Compat.FilePath (joinFileName)
+import Distribution.Compat.FilePath (joinFileName, joinPaths, joinFileExt)
hunk ./Distribution/Simple/Register.hs 224
+        haddockDir = mkHaddockDir pkg_descr lbi NoCopyDest
+        haddockFile = joinPaths haddockDir (haddockName pkg_descr)
hunk ./Distribution/Simple/Register.hs 253
-	IPI.haddockInterfaces = [],
-	IPI.haddockHTMLs      = []
+	IPI.haddockInterfaces = [haddockFile],
+	IPI.haddockHTMLs      = [haddockDir]
}

Context:

[Cabal.xml: entity greencard was mixed up with haddock
[email-masked]**20060411161212] 
[GHC FFI flag should be -fffi not -ffi, the latter merely happens to work.
Duncan Coutts <[email-masked]>**20060318022010] 
[Make ghc-6.2 packages be exposed by default.
Duncan Coutts <[email-masked]>**20060221135026
 For ghc-6.4 when Cabal registers packages it exposes them by default.
 However it does not do the same fo ghc-6.2. This change corrects the
 discrepancy. This patch is already being used in Gentoo with Cabal 1.1.3.
] 
[test case for buildinfo with multiple executables
[email-masked]**20060408213048] 
[It is no longer necessary to run 'configure' before 'clean' or 'sdist', addressing http://haskell.galois.com/trac/hackage/ticket/12.
Nick Alexander <[email-masked]>**20060404054127
 In order to change this behaviour, it was necessary to modify the hook interface, specifically cleanHook, postClean, sDistHook, postSDist.  They now take a Maybe LocalBuildInfo, since a LocalBuildInfo might not be available in .setup-config.
] 
[windows patch from [email-masked]
[email-masked]**20060404171731] 
[oops, don't enable -split-objs by default
Simon Marlow <[email-masked]>**20060314124358] 
[export configDependency
Simon Marlow <[email-masked]>**20060303155527] 
[comment fix
Simon Marlow <[email-masked]>**20060303155516] 
[don't check cabal-version during parsing, it doesn't work
Simon Marlow <[email-masked]>**20060303155500
 because parsers are evaluated multiple times due to backtracking.
] 
[no need to use a verbatim copy of System.Console.GetOpt, omit if possible
Simon Marlow <[email-masked]>**20060303144025] 
[Support for -split-objs with GHC
Simon Marlow <[email-masked]>**20060302170907
 New configure option: --enable-split-objs creates libraries using
 -split-objs with GHC (current HEAD or later only, the configure checks
 for version 6.5).  Fixes ticket #19.
] 
[Initial support for JHC
Einar Karttunen <[email-masked]>**20060206233543] 
[added some fields to test suite for duncan's mods
[email-masked]**20060204223256] 
[fixup PackageDescription test code
Duncan Coutts <[email-masked]>**20060201183912
 just ignore the extra ParseOk warnings field
] 
[ignore "x-" extension fields without a warning
Duncan Coutts <[email-masked]>**20060201183145] 
[Make unknown fields a warning rather than an error
Duncan Coutts <[email-masked]>**20060201182944
 Add support for warnings to the ParseResult type. Change existing
 warnings from using Debug.Trace to use this new warning support.
] 
[fix conflict
Simon Marlow <[email-masked]>**20060206095833] 
[push and pull all
[email-masked]**20060201185441] 
[combine GNUmakefile and Makefile
Simon Marlow <[email-masked]>**20060206095400] 
[now build Setup.lhs instead of using runghc on it. still uses runhugs.
[email-masked]**20060130054810] 
[cabal-install uses defaultMain if it can't find Setup.lhs
[email-masked]**20060130050710] 
[cleaned up suffix handler params to hooks
[email-masked]**20060116064811
 
 Summary if last few changes: I modified the hooks interface quite a
 bit, again.  There's good news and bad news about this.  The good news
 is that it's cleaned up and should be easier to maintain and to avoid
 future modifications.  The bad news is that this change itself will
 break stuff, of course.
 
 If you have any trouble building your Setup scripts, please let me
 know.  I really think that it was best to bite the bullet right now in
 one big go instead of down the road with lots of little changes.  I
 have a lot more confidence in the hooks interface, and I don't
 actually expect that it'll change as often.
 
 I made the types more consistent, and made sure there are accessor
 functions on each of the Flags types so that if the flags types change
 in the future, it shouldn't break lots of code.
 
 Another piece of good / bad news is that I decided not to get rid of
 the pre & post hooks.  They are nice for convenience and it wouldn't
 be nearly so easy to write hooks without them.
 
 That's bad because the interface to hooks is still pretty big, which
 means that there's more likelihood that it'll change in the future.
 
 Another weakness in the Hooks interface is that with command hooks
 (like sDistHook) it's tempting to add parameters to them; basically
 the stuff that we compute between the preSDist and sDist hook.  I
 removed such params and have their values computed elsewhere.
 
 Cabal hackers, please avoid adding parameters to these command hooks
 if at all possible in order to keep the interface steady.  If you need
 to compute a value to pass to these functions, compute it in the
 function and / or make it available as a function that someone
 crafting hooks can use as well, or consider whether it belongs in one
 of the parameters already being passed to the hooks,
 PackageDescription, LocalBuildInfo, UserHooks, Flags.
 
] 
[make the order of params to cmd hooks consistent
[email-masked]**20060116055858] 
[remove some flags from sdist, some cleanup
[email-masked]**20060116053818] 
[clarifying and making flags types consistent
[email-masked]**20060116035033] 
[changing tuple types to records w/ fields
[email-masked]**20060115234317] 
[moving TODO stuff to wiki
[email-masked]**20060115234303] 
[fix version number in fptools makefile to match .cabal file
[email-masked]**20060201183331] 
[Add extraGHCiLibraries to the InstalledPackageInfo and extend the parser.
Duncan Coutts <[email-masked]>**20060131163640] 
[re-add the GNUmakefiles
Simon Marlow <[email-masked]>*-20060123115236
 These are now safe after we added "-f Makefile" to the make args when invoked
 from the GHC build system.  This repo should now be useable as the main
 Cabal repo.
] 
[re-add the GNUmakefiles
Simon Marlow <[email-masked]>**20060123115236
 These are now safe after we added "-f Makefile" to the make args when invoked
 from the GHC build system.  This repo should now be useable as the main
 Cabal repo.
] 
[TAG checkpoint
[email-masked]**20060113152542] 
Patch bundle hash:
8664d322719cb37279d41cc51a268d04f48d3bbc