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

时间:2013-07-12 16:41:55

标签: haskell compiler-construction compilation cross-platform cabal

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

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

如果我可以将我的cabal配置或我的自定义脚本设置为执行以下操作,那将是理想的:

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

-- target Native
cabal configure --target=native
cabal build

2 个答案:

答案 0 :(得分:5)

要使用GHC或Haste构建Cabal项目,请为前者使用cabal二进制文件,为后者使用haste-inst(快速加入)。

要在模块中加入条件代码,请添加{-# 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-instimpl(ghc)也是如此; bug report已提交。

答案 1 :(得分:0)

虽然目前无法在您的cabal文件中使用impl(haste),但您现在可以检查flag(haste-inst)以查看您的软件包是否正在使用haste-inst构建。