Haddock 在 #if #else #endif 子句上崩溃

Haddock breaks down on #if #else #endif clauses

我正在尝试使用黑线鳕为 github 库生成文档。这是我输入的代码:

$ find -name '*.hs' | xargs haddock --html -o docs
src/Reflex/Dom/Xhr.hs:154:0:
     error: missing binary operator before token "("
     #if MIN_VERSION_aeson(1,0,0)
     ^

然后我查看了我源代码的相关部分Xhr.hs第154行:

import Data.Aeson
#if MIN_VERSION_aeson(1,0,0)
import Data.Aeson.Text
#else
import Data.Aeson.Encode
#endif

我不知道 #if#else#endif 是 Haskell 的一部分,但我能猜到它的意思。根据版本,代码应导入 Aeson.TextAeson.Encode。为了以防万一,我查了一下版本:

$ ghc-pkg list | grep aeson
    aeson-0.11.3.0

这足以给黑线鳕带来困难。信息页面被发送到名为 docs 的文件夹,其中包含一些空的 html 文件,等待用 Reflex.Dom 库的详细信息填充。

该代码使用 -cpp。预处理器指令不是常用 Haskell 语言的一部分。为了正确解析该代码,您需要 specify additional options to Haddock:

2.1. Using literate or pre-processed source

Since Haddock uses GHC internally, both plain and literate Haskell sources are accepted without the need for the user to do anything. To use the C pre-processor, however, the user must pass the the -cpp option to GHC using --optghc. [emphasis mine]

但是有两个问题。如果包已公开,您发布的 C 预处理器宏扩展将仅适用于 GHC 8.0 (or later)。但是,无论 GHC 的版本如何,它都应该与 cabal haddockstack haddock 一起工作。顺便说一下,如果您尝试构建 cabal/stack 包的文档,建议使用后一种变体。

如果您仍然知道自己在做什么,请使用 haddock --optghc=-cpp