summaryrefslogtreecommitdiffhomepage
path: root/Setup.lhs
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)