6

GHC와 다른 컴파일러를 사용하도록 Cabal 프로젝트를 구성 할 수 있습니까? 추가로 일부 플래그로이를 제어 할 수 있습니까?Haskell 프로젝트를 Cabal로 빌드 할 때 컴파일러 바꾸기

일부 컴파일 플래그에 따라 GHC 또는 Haste (JavaScript)으로 프로젝트를 컴파일하고 싶습니다. 내 음모 구성 또는 그런 짓을하는 내 사용자 지정 스크립트를 설정할 수 있다면

그것은 이상적 일 것이다 :

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

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

답변

5

는 이전의 cabal 바이너리를 사용, GHC 또는 가속 중 하나와 음모 프로젝트를 빌드하려면, 후자의 경우에는 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 버전에'graphviz '의'build-depends'가 없으면 좋겠습니까? –

+0

추가 -'{- # LANGUAGE CPP # -}'는 어떻게 든'ghc cpp backend'와 연결되어 있습니까? 나는'LLVM' 백엔드를 사용하고 싶다. –

+0

@ danilo2 두 번째 질문에 답하기 위해 CPP pragma는 C++에서 아무 것도 할 필요가 없습니다. 그것은 [C 전처리 기] (http://en.wikipedia.org/wiki/C_preprocessor) - 일명 "cpp"를 사용할 수 있도록합니다. cpp는'# if'와'# ifdef '를 사용하여 조건부 _preprocessing_ (코드 부분 포함 또는 제외)을 수행하지만, 일반적으로 (Haskell의 경우) 컴파일 자체에는 영향을 미치지 않습니다. – phg

0

현재 카불 파일에 impl(haste)을 사용할 수 없지만 flag(haste-inst)을 확인하여 haste-inst을 사용하여 패키지가 빌드되고 있는지 확인할 수 있습니다.

관련 문제