6

Возможно ли каким-то образом сконфигурировать проект cabal для использования другого компилятора, чем GHC? Можно ли это контролировать некоторыми флагами?Заменить компилятор при создании проекта Haskell с помощью Cabal

Я хочу скомпилировать свой проект с помощью GHC или Haste (на JavaScript) на основе некоторых флагов компиляции.

Было бы идеально, если бы я мог установить мою конфигурацию Cabal или мой собственный сценарий, чтобы сделать что-то вроде:

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

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

ответ

5

Чтобы построить проект Cabal либо GHC или Ускорения, используйте 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 

Теоретически, для условных установок в Кабал файле что-то вроде этого должно работать:

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 подано.

+0

Спасибо! Могу ли я использовать разные опции «project.cabal»? В коде я могу использовать '# ifdef', и я хочу, например, чтобы JS-версия не имела' build-depends' 'graphviz'? –

+0

дополнительный - does '{- # LANGUAGE CPP # -}' как-то связан с 'ghc cpp backend'? Я хочу использовать бэкэнд LLVM. –

+0

@ danilo2 Чтобы ответить на второй вопрос: прагма CPP не должна ничего делать с C++. Он позволяет использовать препроцессор [C] (http://en.wikipedia.org/wiki/C_preprocessor) - aka «cpp». Cpp выполняет только условную _preprocessing_ (включая или исключая части кода) с использованием '# if' и' # ifdef', но обычно (в случае Haskell) не влияет на компиляцию. – phg

0

Хотя в настоящее время невозможно использовать impl(haste) в ваших файлах, вы можете проверить наличие flag(haste-inst), чтобы узнать, строится ли ваш пакет с помощью haste-inst.