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