【发布时间】:2017-08-20 01:34:36
【问题描述】:
我使用 Stack 9.0 作为我的项目的 Haskell 构建系统。
我刚刚注意到,当我用 Stack 编译我的 Haskell 项目时,所有的断言都被关闭了。相比之下,在命令行进行“正常”GHC 构建时,断言默认打开,除非使用 -fignore-asserts 标志 (link) 明确关闭。
例如,这个简单的 main 函数无法抛出断言错误
import Control.Exception.Base
main :: IO ()
main = assert (1==2) $ print "Hello World!"
如何编辑项目的 .cabal 文件以启用断言?目前在我的 .cabal 文件中,我看到了以下 ghc 选项
ghc-options: -threaded -rtsopts -with-rtsopts=-N
这很奇怪,因为在此列表中没有明确关闭断言。
编辑:
在运行stack --version 后我有Version 1.1.2 x86_64 hpack-0.14.0。特别是,我使用stack lts 9.0 和ghc 8.0.2
【问题讨论】:
-
你有哪个版本的堆栈
stack --version?哪个 ghc? -
@epsilonhalbe 请参阅编辑。
-
在某个时候,cabal 决定将
-O添加到ghc --make命令(我已经在我的机器上使用堆栈 1.1.3 和 cabal 1.24.2.0 确认了这一点)。正如文档所述,这也会导致断言被关闭。我实际上不确定为什么-也许会有更多知识渊博的人出现并解释它。您可以通过将-fno-ignore-asserts添加到ghc-options(或-O0我猜,但这可能会产生不良副作用)来解决它。 -
@user2407038 嗯,即使添加了
-fno-ignore-asserts标志,我也看不到任何区别。您如何查看用于构建特定可执行文件的标志,以便我可以检查断言是否被禁用? -
将
-v(或-v2或-v3)添加到ghc-options字段。但我也验证了这种行为(即stack build,添加-fno-ignore-asserts标志,然后添加stack build)实际上并没有生效。即使stack build --reconfigure --force-dirty也不起作用!我不得不删除.stack-work目录。 (这绝对看起来像一个错误,但请记住,stack-1.1.2 和 1.1.3 已经非常非常过时了)
标签: haskell haskell-stack