blob: d7acc7fa81e362c7709138f565accb8a6099b290 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#!/usr/bin/env runhaskell
> import Distribution.Simple
> import Distribution.PackageDescription
> import Distribution.Setup
> import Distribution.Simple.Utils
> import Distribution.Simple.LocalBuildInfo
> import Distribution.Program
> import Distribution.PreProcess
> import System.FilePath.Posix
> import System.Directory
> import Data.List
> main = defaultMainWithHooks defaultUserHooks {haddockHook = xmonadHaddock}
> -- a different implementation of haddock hook from
> -- from Distribution.Simple: will use synopsis and description for
> -- building executables' documentation.
> xmonadHaddock pkg_descr lbi hooks (HaddockFlags hoogle verbose) = do
> confHaddock <- do let programConf = withPrograms lbi
> haddockName = programName haddockProgram
> mHaddock <- lookupProgram haddockName programConf
> maybe (die "haddock command not found") return mHaddock
> let tmpDir = (buildDir lbi) </> "tmp"
> createDirectoryIfMissing True tmpDir
> createDirectoryIfMissing True haddockPref
> preprocessSources pkg_descr lbi verbose (allSuffixHandlers hooks)
> setupMessage "Running Haddock for" pkg_descr
> let outputFlag = if hoogle then "--hoogle" else "--html"
> showPkg = showPackageId (package pkg_descr)
> showDepPkgs = map showPackageId (packageDeps lbi)
> withExe pkg_descr $ \exe -> do
> let bi = buildInfo exe
> inFiles <- getModulePaths bi (otherModules bi)
> srcMainPath <- findFile (hsSourceDirs bi) (modulePath exe)
> let prologName = showPkg ++ "-haddock-prolog.txt"
> writeFile prologName (description pkg_descr ++ "\n")
> let exeTargetDir = haddockPref </> exeName exe
> outFiles = srcMainPath : inFiles
> haddockFile = exeTargetDir </> (haddockName pkg_descr)
> createDirectoryIfMissing True exeTargetDir
> rawSystemProgram verbose confHaddock
> ([outputFlag,
> "--odir=" ++ exeTargetDir,
> "--title=" ++ showPkg ++ ": " ++ synopsis pkg_descr,
> "--package=" ++ showPkg,
> "--dump-interface=" ++ haddockFile,
> "--prologue=" ++ prologName
> ]
> ++ map ("--use-package=" ++) showDepPkgs
> ++ programArgs confHaddock
> ++ (if verbose > 4 then ["--verbose"] else [])
> ++ outFiles
> )
> removeFile prologName
> getModulePaths :: BuildInfo -> [String] -> IO [FilePath]
> getModulePaths bi =
> fmap concat .
> mapM (flip (moduleToFilePath (hsSourceDirs bi)) ["hs", "lhs"])
> allSuffixHandlers :: Maybe UserHooks
> -> [PPSuffixHandler]
> allSuffixHandlers hooks
> = maybe knownSuffixHandlers
> (\h -> overridesPP (hookedPreProcessors h) knownSuffixHandlers)
> hooks
> where
> overridesPP :: [PPSuffixHandler] -> [PPSuffixHandler] -> [PPSuffixHandler]
> overridesPP = unionBy (\x y -> fst x == fst y)
|