如何在package.yaml中为外部依赖指定Cabal编译选项?
在package.yaml中指定Hackage依赖包的编译标志
我来帮你搞定这个问题!你之前用ghc-options和extra-deps尝试肯定行不通——ghc-options是给你自己的项目设置GHC编译参数的,比如-Wall或者-O2,根本不是用来给依赖包开编译标志的;而extra-deps只是用来指定额外依赖的版本或者非Hackage包,和编译标志完全不搭边,这也难怪你会遇到那个expected String, encountered Object的错误,因为ghc-options只接受字符串,你塞了对象进去肯定解析失败。
正确的做法是在package.yaml里用flags字段,专门给指定的依赖包开启编译标志,写法如下:
# 先确保你的依赖已经在dependencies里声明了 dependencies: - your-target-package # 替换成你要使用的那个Hackage包的准确名称 # 在这里给依赖包设置编译标志 flags: your-target-package: server: true c-runtime: true
解释一下:
your-target-package必须和Hackage上那个包的名称完全一致,大小写也要对应- 下面的
server和c-runtime就是你之前用-fserver和fc-runtime指定的标志,设置为true就等价于开启了这些编译选项
如果你的目标包是通过extra-deps添加的(比如指定了特定版本或者是自定义的包),这个写法同样适用,只要包名对应上就没问题。
这样配置之后,Cabal在构建依赖的时候就会自动用这些标志编译那个外部包,和你手动执行cabal install -fserver -fc-runtime的效果完全一样。
内容的提问来源于stack exchange,提问作者Gleb Lobanov
相关产品推荐
相关产品推荐

