I would be happy to work around it if I could, but I can't. As far as I can tell, I can't pass any flags to Haddock via the Cabal file. I would love to tell Hackage to run Haddock like so, "cabal haddock --haddock-option=--optghc=-D__HADDOCK__", but I don't know how.
Let's suppose that I do actually want to define __HADDOCK__ for my library. Can I do this with a user-defined hook using the Cabal library?
main :: IO ()
main = defaultMainWithHooks hooks where
hooks = simpleUserHooks { haddockHook = haddockHook' }
-- Define CPP __HADDOCK__ macro when running haddock.
haddockHook' p l h f =
do putStrLn ("f=\"" ++ show f ++ "\"")
putStrLn ("f'=\"" ++ show f' ++ "\"")
haddock p l (hookedPreProcessors h) f'
where
-- The Haddock flag to pass a flag to GHC to define the macro.
define__HADDOCK__ = ("haddock",["--optghc=-D__HADDOCK__"])
-- Add the flag to the the other flags.
f' = f `mappend` emptyHaddockFlags { haddockProgramArgs = [define__HADDOCK__] }
I got the value for define__HADDOCK__ from passing the "--haddock-option=--optghc=-D__HADDOCK__" flag at the command line.
If I run "cabal haddock --verbose=3", I get:
f="HaddockFlags {haddockProgramPaths = [], haddockProgramArgs = [], haddockHoogle = Flag False, haddockHtmlLocation = NoFlag, haddockExecutables = Flag False, haddockInternal = Flag False, haddockCss = NoFlag, haddockHscolour = Flag False, haddockHscolourCss = NoFlag, haddockDistPref = Flag "dist", haddockVerbosity = Flag Deafening}"
f'="HaddockFlags {haddockProgramPaths = [], haddockProgramArgs = [("haddock",["--optghc=-D__HADDOCK__"])], haddockHoogle = Flag False, haddockHtmlLocation = NoFlag, haddockExecutables = Flag False, haddockInternal = Flag False, haddockCss = NoFlag, haddockHscolour = Flag False, haddockHscolourCss = NoFlag, haddockDistPref = Flag "dist", haddockVerbosity = Flag Deafening}"
[...]
("/.../haddock",["--html", ...
My flag shows up in f' but not in the actual call to haddock. Thus, it doesn't work.
With "cabal haddock --verbose=3 --haddock-option=--optghc=-D__HADDOCK__", I get:
f="HaddockFlags {haddockProgramPaths = [], haddockProgramArgs = [("haddock",["--optghc=-D__HADDOCK__"])], haddockHoogle = Flag False, haddockHtmlLocation = NoFlag, haddockExecutables = Flag False, haddockInternal = Flag False, haddockCss = NoFlag, haddockHscolour = Flag False, haddockHscolourCss = NoFlag, haddockDistPref = Flag "dist", haddockVerbosity = Flag Deafening}"
f'="HaddockFlags {haddockProgramPaths = [], haddockProgramArgs = [("haddock",["--optghc=-D__HADDOCK__"]),("haddock",["--optghc=-D__HADDOCK__"])], haddockHoogle = Flag False, haddockHtmlLocation = NoFlag, haddockExecutables = Flag False, haddockInternal = Flag False, haddockCss = NoFlag, haddockHscolour = Flag False, haddockHscolourCss = NoFlag, haddockDistPref = Flag "dist", haddockVerbosity = Flag Deafening}"
[...]
("/.../haddock",["--optghc=-D__HADDOCK__","--html", ...
Now, the command-line flag shows up in all 3. And, of course, it works.
Is there something wrong with my hook code?
Regards,
Sean