Commit a4bef988 authored by Simon Marlow's avatar Simon Marlow

Invoke Haddock directly from the build system, instead of via Cabal

Partly this is cleaner as we only have to preprocess the source files
once, but also it is necessary to avoid Haddock recompiling source
files when Template Haskell is in use, saving some time in validate
and fixing a problem whereby when HADDOCK_DOCS=YES, make always
re-haddocks the DPH packages.  This also needs an additional fix to
GHC.

HsColour support still uses Cabal, and hence preprocesses the source
files again. We could move this into the build system too, but there
is a version dependency that would mean adding extra autoconf stuff.
parent a2199855
...@@ -395,7 +395,7 @@ compiler_stage3_CONFIGURE_OPTS := $(compiler_stage2_CONFIGURE_OPTS) ...@@ -395,7 +395,7 @@ compiler_stage3_CONFIGURE_OPTS := $(compiler_stage2_CONFIGURE_OPTS)
compiler_stage1_CONFIGURE_OPTS += --ghc-option=-DSTAGE=1 compiler_stage1_CONFIGURE_OPTS += --ghc-option=-DSTAGE=1
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DSTAGE=2 compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DSTAGE=2
compiler_stage3_CONFIGURE_OPTS += --ghc-option=-DSTAGE=3 compiler_stage3_CONFIGURE_OPTS += --ghc-option=-DSTAGE=3
compiler_stage2_HADDOCK_OPTS += --haddock-option=--optghc=-DSTAGE=2 compiler_stage2_HADDOCK_OPTS += --optghc=-DSTAGE=2
compiler_stage1_CONFIGURE_OPTS += --ghc-options='$(GhcStage1HcOpts)' compiler_stage1_CONFIGURE_OPTS += --ghc-options='$(GhcStage1HcOpts)'
compiler_stage2_CONFIGURE_OPTS += --ghc-options='$(GhcStage2HcOpts)' compiler_stage2_CONFIGURE_OPTS += --ghc-options='$(GhcStage2HcOpts)'
......
...@@ -442,9 +442,8 @@ PRIMOPS_TXT = $(GHC_COMPILER_DIR)/prelude/primops.txt ...@@ -442,9 +442,8 @@ PRIMOPS_TXT = $(GHC_COMPILER_DIR)/prelude/primops.txt
libraries/ghc-prim/dist-install/build/GHC/PrimopWrappers.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT) | $$(dir $$@)/. libraries/ghc-prim/dist-install/build/GHC/PrimopWrappers.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT) | $$(dir $$@)/.
"$(GENPRIMOP_INPLACE)" --make-haskell-wrappers <$(PRIMOPS_TXT) >$@ "$(GENPRIMOP_INPLACE)" --make-haskell-wrappers <$(PRIMOPS_TXT) >$@
libraries/ghc-prim/GHC/Prim.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT) # Required so that Haddock documents the primops.
"$(GENPRIMOP_INPLACE)" --make-haskell-source <$(PRIMOPS_TXT) >$@ libraries/ghc-prim_dist-install_EXTRA_HADDOCK_SRCS = libraries/ghc-prim/dist-install/build/autogen/GHC/Prim.hs
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Include build instructions from all subdirs # Include build instructions from all subdirs
...@@ -729,7 +728,7 @@ install_perl : $(INPLACE_PERL) ...@@ -729,7 +728,7 @@ install_perl : $(INPLACE_PERL)
endif # Windows endif # Windows
ifneq "$(BINDIST)" "YES" ifneq "$(BINDIST)" "YES"
$(ghc-prim_HADDOCK_FILE): \ $(ghc-prim-$(libraries/ghc-prim_dist-install_VERSION)_HADDOCK_FILE): \
libraries/ghc-prim/dist-install/build/autogen/GHC/Prim.hs \ libraries/ghc-prim/dist-install/build/autogen/GHC/Prim.hs \
libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs
endif # BINDIST endif # BINDIST
......
...@@ -15,31 +15,42 @@ define haddock # args: $1 = dir, $2 = distdir ...@@ -15,31 +15,42 @@ define haddock # args: $1 = dir, $2 = distdir
ifneq "$$($1_$2_DO_HADDOCK)" "NO" ifneq "$$($1_$2_DO_HADDOCK)" "NO"
ifeq "$$($$($1_PACKAGE)_HADDOCK_FILE)" "" ifeq "$$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE)" ""
$$($1_PACKAGE)_HADDOCK_FILE = $1/$2/doc/html/$$($1_PACKAGE)/$$($1_PACKAGE).haddock $$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE = $1/$2/doc/html/$$($1_PACKAGE)/$$($1_PACKAGE).haddock
ALL_HADDOCK_FILES += $$($$($1_PACKAGE)_HADDOCK_FILE) ALL_HADDOCK_FILES += $$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE)
else else
$$(error Already got a haddock file for $$($1_PACKAGE)) $$(error Already got a haddock file for $$($1_PACKAGE))
endif endif
haddock: $$($$($1_PACKAGE)_HADDOCK_FILE) haddock: $$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE)
ifeq "$$(HADDOCK_DOCS)" "YES" ifeq "$$(HADDOCK_DOCS)" "YES"
$(call all-target,$1_$2_haddock,html_$1) $(call all-target,$1_$2_haddock,html_$1)
endif endif
.PHONY: html_$1 .PHONY: html_$1
html_$1 : $$($$($1_PACKAGE)_HADDOCK_FILE) html_$1 : $$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE)
$$($1_PACKAGE)_HADDOCK_DEPS = $$(foreach n,$$($1_$2_DEP_NAMES),$$($$n_HADDOCK_FILE)) $$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_DEPS = $$(foreach n,$$($1_$2_DEPS),$$($$n_HADDOCK_FILE))
ifeq "$$(HSCOLOUR_SRCS)" "YES" ifeq "$$(HSCOLOUR_SRCS)" "YES"
$1_$2_HADDOCK_FLAGS += --hyperlink-source $1_$2_HADDOCK_FLAGS += --source-module=src/%{MODULE/./-}.html --source-entity=src/%{MODULE/./-}.html#%{NAME}
endif endif
ifneq "$$(BINDIST)" "YES" ifneq "$$(BINDIST)" "YES"
$$($$($1_PACKAGE)_HADDOCK_FILE) : $$(INPLACE_BIN)/haddock$$(exeext) $$(GHC_CABAL_INPLACE) $$($1_$2_HS_SRCS) $$($$($1_PACKAGE)_HADDOCK_DEPS) | $$$$(dir $$$$@)/. $$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE) : $$(INPLACE_BIN)/haddock$$(exeext) $$(GHC_CABAL_INPLACE) $$($1_$2_HS_SRCS) $$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_DEPS) | $$$$(dir $$$$@)/.
"$$(GHC_CABAL_INPLACE)" haddock $2 $1 --with-haddock=$$(TOP)/$$(INPLACE_BIN)/haddock --with-ghc=$$(TOP)/$$(INPLACE_BIN)/ghc-stage2 $$($1_$2_HADDOCK_FLAGS) $$($1_$2_HADDOCK_OPTS) "$$(GHC_CABAL_INPLACE)" hscolour $2 $1
"$$(TOP)/$$(INPLACE_BIN)/haddock" \
--odir="$1/$2/doc/html/$$($1_PACKAGE)" \
--dump-interface=$$($$($1_PACKAGE)-$$($1_$2_VERSION)_HADDOCK_FILE) \
--html \
--title="$$($1_PACKAGE)-$$($1_$2_VERSION)$$(if $$(strip $$($1_$2_SYNOPSIS)),: $$(strip $$($1_$2_SYNOPSIS)),)" \
--prologue="$1/$2/haddock-prologue.txt" \
$$(foreach pkg,$$($1_$2_DEPS),$$(if $$($$(pkg)_HADDOCK_FILE),--read-interface=../$$(pkg)$$(comma)$$($$(pkg)_HADDOCK_FILE))) \
$$(foreach opt,$$($1_$2_v_ALL_HC_OPTS),--optghc=$$(opt)) \
$$($1_$2_HADDOCK_FLAGS) $$($1_$2_HADDOCK_OPTS) \
$$($1_$2_HS_SRCS) \
$$($1_$2_EXTRA_HADDOCK_SRCS)
# Make the haddocking depend on the library .a file, to ensure # Make the haddocking depend on the library .a file, to ensure
# that we wait until the library is fully build before we haddock it # that we wait until the library is fully build before we haddock it
......
...@@ -30,8 +30,8 @@ import System.FilePath ...@@ -30,8 +30,8 @@ import System.FilePath
main :: IO () main :: IO ()
main = do args <- getArgs main = do args <- getArgs
case args of case args of
"haddock" : distDir : dir : args' -> "hscolour" : distDir : dir : args' ->
runHaddock distDir dir args' runHsColour distDir dir args'
"check" : dir : [] -> "check" : dir : [] ->
doCheck dir doCheck dir
"install" : ghc : ghcpkg : strip : topdir : directory : distDir "install" : ghc : ghcpkg : strip : topdir : directory : distDir
...@@ -52,7 +52,7 @@ syntax_error :: [String] ...@@ -52,7 +52,7 @@ syntax_error :: [String]
syntax_error = syntax_error =
["syntax: ghc-cabal configure <configure-args> -- <distdir> <directory>...", ["syntax: ghc-cabal configure <configure-args> -- <distdir> <directory>...",
" ghc-cabal install <ghc-pkg> <directory> <distdir> <destdir> <prefix> <args>...", " ghc-cabal install <ghc-pkg> <directory> <distdir> <destdir> <prefix> <args>...",
" ghc-cabal haddock <distdir> <directory> <args>..."] " ghc-cabal hscolour <distdir> <directory> <args>..."]
die :: [String] -> IO a die :: [String] -> IO a
die errs = do mapM_ (hPutStrLn stderr) errs die errs = do mapM_ (hPutStrLn stderr) errs
...@@ -111,32 +111,10 @@ doCheck directory ...@@ -111,32 +111,10 @@ doCheck directory
where isFailure (PackageDistSuspicious {}) = False where isFailure (PackageDistSuspicious {}) = False
isFailure _ = True isFailure _ = True
runHaddock :: FilePath -> FilePath -> [String] -> IO () runHsColour :: FilePath -> FilePath -> [String] -> IO ()
runHaddock distdir directory args runHsColour distdir directory args
= withCurrentDirectory directory = withCurrentDirectory directory
$ defaultMainWithHooksArgs hooks ("haddock" : "--builddir" : distdir : args) $ defaultMainArgs ("hscolour" : "--builddir" : distdir : args)
where
hooks = userHooks {
haddockHook = modHook (haddockHook userHooks)
}
modHook f pd lbi us flags
| packageName pd == PackageName "ghc-prim"
= let pd' = case library pd of
Just lib ->
let ghcPrim = fromJust (simpleParse "GHC.Prim")
ems = filter (ghcPrim /=)
(exposedModules lib)
lib' = lib { exposedModules = ems }
in pd { library = Just lib' }
Nothing ->
error "Expected a library, but none found"
pc = withPrograms lbi
pc' = userSpecifyArgs "haddock"
["dist-install/build/autogen/GHC/Prim.hs"] pc
lbi' = lbi { withPrograms = pc' }
in f pd' lbi' us flags
| otherwise
= f pd lbi us flags
doInstall :: FilePath -> FilePath -> FilePath -> FilePath -> FilePath doInstall :: FilePath -> FilePath -> FilePath -> FilePath -> FilePath
-> FilePath -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
...@@ -358,6 +336,7 @@ generate config_args distdir directory ...@@ -358,6 +336,7 @@ generate config_args distdir directory
let variablePrefix = directory ++ '_':distdir let variablePrefix = directory ++ '_':distdir
let xs = [variablePrefix ++ "_VERSION = " ++ display (pkgVersion (package pd)), let xs = [variablePrefix ++ "_VERSION = " ++ display (pkgVersion (package pd)),
variablePrefix ++ "_MODULES = " ++ unwords (map display modules), variablePrefix ++ "_MODULES = " ++ unwords (map display modules),
variablePrefix ++ "_SYNOPSIS =" ++ synopsis pd,
variablePrefix ++ "_HS_SRC_DIRS = " ++ unwords (hsSourceDirs bi), variablePrefix ++ "_HS_SRC_DIRS = " ++ unwords (hsSourceDirs bi),
variablePrefix ++ "_DEPS = " ++ unwords (map display dep_ids), variablePrefix ++ "_DEPS = " ++ unwords (map display dep_ids),
variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) dep_ids), variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) dep_ids),
...@@ -384,6 +363,9 @@ generate config_args distdir directory ...@@ -384,6 +363,9 @@ generate config_args distdir directory
variablePrefix ++ "_DEP_EXTRA_LIBS = " ++ unwords (forDeps Installed.extraLibraries), variablePrefix ++ "_DEP_EXTRA_LIBS = " ++ unwords (forDeps Installed.extraLibraries),
variablePrefix ++ "_DEP_LD_OPTS = " ++ unwords (forDeps Installed.ldOptions)] variablePrefix ++ "_DEP_LD_OPTS = " ++ unwords (forDeps Installed.ldOptions)]
writeFile (distdir ++ "/package-data.mk") $ unlines xs writeFile (distdir ++ "/package-data.mk") $ unlines xs
writeFile (distdir ++ "/haddock-prologue.txt") $
if null (description pd) then synopsis pd
else description pd
where where
escape = foldr (\c xs -> if c == '#' then '\\':'#':xs else c:xs) [] escape = foldr (\c xs -> if c == '#' then '\\':'#':xs else c:xs) []
wrap = map (\s -> "\'" ++ s ++ "\'") wrap = map (\s -> "\'" ++ s ++ "\'")
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment