6

是否有可能以某种方式将cabal项目配置为使用与GHC不同的编译器?另外有可能通过一些标志来控制这个吗?用Cabal构建Haskell项目时替换编译器

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

这将是理想的,如果我可以把我的阴谋配置或我的自定义脚本做这样的事情:

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

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

回答

5

要使用两种GHC或急速建立一个惊天动地的项目,使用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 

理论上,对于有条件的设置在惊天动地的文件这样的事情应该工作:

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已提交。

+0

谢谢!我可以使用不同的'project.cabal'选项吗?在代码中,我可以使用'#ifdef',并且我想要例如JS版本不具有'graphviz'的'build-depends'? –

+0

额外 - '{ - #LANGUAGE CPP# - }'与'ghc cpp后端'有什么关系?我想使用'LLVM'后端。 –

+0

@ danilo2要回答第二个问题:CPP杂注不必对C++做任何事情。它允许使用[C预处理程序](http://en.wikipedia.org/wiki/C_preprocessor) - 又名“cpp”。 cpp只使用#if和#ifdef做有条件的_preprocessing_(包括或排除部分代码),但通常(在Haskell中)不会影响编译本身。 – phg

0

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