6

È possibile configurare in qualche modo un progetto di cabal per utilizzare un compilatore diverso da GHC? Inoltre è possibile controllarlo con alcune bandiere?Sostituire il compilatore quando si crea un progetto Haskell con Cabal

Desidero compilare il mio progetto con GHC o Haste (su JavaScript) basato su alcuni flag di compilazione.

Sarebbe ideale se ho potuto impostare la mia configurazione cabala o il mio script personalizzato per fare qualcosa di simile:

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

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

risposta

5

per costruire un progetto di Cabal sia con GHC o Haste, utilizzare il cabal binario per il primo, e haste-inst (fornito con rapidità) per quest'ultimo.

Per inserire il codice condizionale nei moduli, aggiungere {-# LANGUAGE CPP #-} e utilizzare #ifdef __HASTE__, che verrà definito solo dalla rapidità, ma non da GHC. Notare che __GLASGOW_HASKELL__ è definito in entrambi i casi (il che ha senso, poiché la rapidità si genera su GHC per grandi parti della compilazione). Quindi, si dovrebbe utilizzare come

{-# LANGUAGE CPP #-} 

module Module where 

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

Teoricamente, per le impostazioni condizionali nel file Cabal qualcosa come questo dovrebbe funzionare:

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

ma sembra che anche con haste-inst, impl(ghc) è vero; bug report è archiviato.

+0

Grazie! Posso usare anche diverse opzioni 'project.cabal'? Nel codice posso usare '# ifdef' e voglio ad esempio la versione JS di non avere' build-depends' di 'graphviz'? –

+0

aggiuntivo - fa '{- # LANGUAGE CPP # -}' è in qualche modo connesso con il 'ghc cpp backend'? Voglio usare il backend 'LLVM'. –

+0

@ danilo2 Per rispondere alla seconda domanda: il prplma CPP non deve fare nulla con C++. Permette di usare il [C preprocessore] (http://en.wikipedia.org/wiki/C_preprocessore) - alias "cpp". Il cpp esegue solo _preprocessing_ condizionale (includendo o escludendo parti di codice) usando '# if' e' # ifdef', ma normalmente (nel caso di Haskell) non influenza la compilazione stessa. – phg

0

Anche se non è attualmente possibile utilizzare impl(haste) nei file Cabal, è ora possibile verificare la presenza di flag(haste-inst) per vedere se il vostro pacchetto è stato costruito utilizzando haste-inst.

Problemi correlati