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

标签 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

最佳答案

要使用 GHC 或 Haste 构建 Cabal 项目,请使用 cabal前者为二进制,haste-inst (急速而来)为后者。

要在模块中添加条件代码,请添加 {-# LANGUAGE CPP #-}并使用 #ifdef __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)是真的; bug report已归档。

关于haskell - 使用 Cabal 构建 Haskell 项目时替换编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619827/

相关文章:

haskell - 检查 Haskell 中的空列表 : Is (length list == 0) or (list == []) more efficient?

使用 GCC -O2 选项编译生成不同的程序

java - 在线运行.JSP文件

c++ - 编译 C++ 源代码以获得最大的可移植性

java - 如何在命令提示符下运行 Java 程序

haskell - 如何从我的函数中计算总和?

debugging - Haskell:寻找不完整记录构建的来源

compilation - 汇编代码生成如何工作?

compiler-construction - 在编译的哪个步骤中删除注释?

performance - 泛化 monad 时,性能下降近 50%