【问题标题】:Turning on assertions while compiling with Haskell's stack build system在使用 Haskell 的堆栈构建系统编译时打开断言
【发布时间】: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.0ghc 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


【解决方案1】:

尝试传入 --fast 标志,这将禁用优化(通过--ghc-options -O0)并允许运行断言。

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2014-07-21
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多