使用 Cabal 构建 Haskell 项目时替换编译器

问题描述 投票:0回答:2

是否有可能以某种方式配置 cabal 项目以使用与 GHC 不同的编译器?另外是否可以通过一些标志来控制它?

我想根据一些编译标志使用 GHC 或 Haste(到 JavaScript)编译我的项目。

如果我可以设置我的 cabal 配置或自定义脚本来执行以下操作,那就太理想了:

-- target JS
cabal configure --target=js
cabal build

-- target Native
cabal configure --target=native
cabal build
haskell compilation cross-platform cabal
2个回答
5
投票

要使用 GHC 或 Haste 构建 Cabal 项目,请为前者使用

cabal
二进制文件,为后者使用
haste-inst
(带有 Haste)。

要在模块中包含条件代码,请添加

{-# LANGUAGE CPP #-}
并使用
#ifdef __HASTE__
,这只能由 haste 定义,而不能由 GHC 定义。请注意,
__GLASGOW_HASKELL__
在两种情况下都有定义(这是有道理的,因为大部分编译都建立在 GHC 之上)。所以你会这样使用它

{-# LANGUAGE CPP #-}

module Module where

compiler :: String
#ifdef __HASTE__
compiler = "haste"
#else
compiler = "GHC"
#endif

理论上,对于 Cabal 文件中的条件设置,类似这样的内容应该有效:

library
  exposed-modules:
        Module
  if impl(ghc)
        exposed-modules:
                Module.GHC
  if impl(haste)
        exposed-modules:
                Module.GHC
  build-depends:       base ==4.6.*

但似乎即使有

haste-inst
impl(ghc)
也是正确的; 错误报告已归档。


0
投票

虽然目前无法在 cabal 文件中使用

impl(haste)
,但您现在可以检查
flag(haste-inst)
以查看您的软件包是否正在使用
haste-inst
构建。

© www.soinside.com 2019 - 2024. All rights reserved.