Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace compiler when building Haskell project with Cabal

Is it possible somehow to configure cabal project to use different compiler than GHC? Additional is it possible to control this by some flags?

I want to compile my project with GHC or Haste (to JavaScript) based on some compilation flags.

It would be ideal if I could set my cabal configuration or my custom script to do something like:

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

-- target Native
cabal configure --target=native
cabal build
like image 268
Wojciech Danilo Avatar asked Jul 12 '13 16:07

Wojciech Danilo


1 Answers

To build a Cabal project with either GHC or Haste, use the cabal binary for the former, and haste-inst (comes with haste) for the latter.

To have conditional code in in your modules, add {-# LANGUAGE CPP #-} and use #ifdef __HASTE__, which will only be defined by haste, but not by GHC. Note that __GLASGOW_HASKELL__ is defined in both cases (which makes sense, as haste builds on GHC for large parts of the compilation). So you would use it like

{-# LANGUAGE CPP #-}

module Module where

compiler :: String
#ifdef __HASTE__
compiler = "haste"
#else
compiler = "GHC"
#endif

Theoretically, for conditional settings in the Cabal file something like this should work:

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

but it seems that even with haste-inst, impl(ghc) is true; bug report is filed.

like image 181
Joachim Breitner Avatar answered Nov 19 '22 10:11

Joachim Breitner