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

Woj*_*ilo 6 compiler-construction haskell cross-platform compilation cabal

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

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

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

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

-- target Native
cabal configure --target=native
cabal build
Run Code Online (Sandbox Code Playgroud)

Joa*_*ner 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
Run Code Online (Sandbox Code Playgroud)

从理论上讲,对于Cabal文件中的条件设置,这样的事情应该有效:

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

但似乎即使有haste-inst,impl(ghc)也是如此; 错误报告已提交.