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構建。