6

Czy można w jakiś sposób skonfigurować projekt kabalowy do używania innego kompilatora niż GHC? Dodatkowe jest to możliwe do kontrolowania tego przez niektóre flagi?Zastąp kompilator podczas budowania projektu Haskell za pomocą Cabala

Chcę skompilować mój projekt z GHC lub Haste (do JavaScript) na podstawie niektórych flag kompilacji.

Byłoby idealnie, gdyby mógł mogę ustawić konfigurację Cabal lub mój własny skrypt, aby zrobić coś takiego:

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

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

Odpowiedz

5

Aby zbudować projekt Cabal albo GHC lub pośpiechu, użyj cabal binarny dla tych pierwszych, i haste-inst (przychodzi z pośpiechem) dla tego ostatniego.

Aby mieć kod warunkowy w swoich modułach, dodaj {-# LANGUAGE CPP #-} i użyj #ifdef __HASTE__, który będzie zdefiniowany tylko przez haste, ale nie przez GHC. Zauważ, że __GLASGOW_HASKELL__ jest zdefiniowany w obu przypadkach (co ma sens, ponieważ haste opiera się na GHC dla dużych części kompilacji). Więc można go używać jak

{-# LANGUAGE CPP #-} 

module Module where 

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

Teoretycznie ustawień warunkowych w pliku Cabal coś jak to powinno działać:

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

ale wydaje się, że nawet z haste-inst, impl(ghc) jest prawdą; bug report jest wypełniony.

+0

Dziękujemy! Czy mogę również użyć różnych opcji 'project.cabal'? W kodzie mogę użyć '# ifdef' i chcę na przykład wersji JS nie mieć' build-depends' of 'graphviz'? –

+0

dodatkowe - czy '{- # LANGUAGE CPP # -}' jest w jakiś sposób połączone z 'backendem' ghc cpp'? Chcę użyć backendu 'LLVM'. –

+0

@ danilo2 Aby odpowiedzieć na drugie pytanie: pragma CPP nie musi nic robić z C++. Pozwala na użycie procesora [C preprocesora] (http://en.wikipedia.org/wiki/C_preprocessor) - aka "cpp". Cpp wykonuje tylko warunkowe _procesowanie_procesowe_ (włączając lub wyłączając części kodu) używając '# if' i' # ifdef', ale normalnie (w przypadku Haskella) nie ma wpływu na samą kompilację. – phg

0

Chociaż obecnie nie można używać impl(haste) w plikach cabal, można teraz sprawdzić, czy dla flag(haste-inst) pakiet jest tworzony przy użyciu haste-inst.

Powiązane problemy