2017-10-07 10 views
0

CPP 확장을 사용하여 다른 모듈을 조건부로 가져 오는 haskell 프로젝트에 대한 테스트 스위트를 올바르게 컴파일하려고합니다. 하나의 모듈은 디버깅을 위해 출력을 네트워크로 보내고 다른 하나는 터미널로 보냅니다.테스트 스위트를 사용하여 라이브러리의 조건부 컴파일

잘 작동하지만 테스트 스위트를 설정하려고 할 때 .cabal 파일에 설정된 cpp 옵션을 고려하지 않고 항상 네트워크로 연결된 버전을 빌드합니다.

음모 파일 :

name:   server 
version:  0.1.0.0 
build-type:  Simple 
cabal-version: >= 1.10 

library 
    hs-source-dirs: 
     src 
    build-depends: 
     base >=4.9 && <=4.11 
    , lens 
    , random 
    , transformers 
    , safe 
    , uuid-types 
    , QuickCheck 
    , network 
    , bytestring 
    , binary 
    exposed-modules: 
     Betting 
     Game 
     Input.Network.Input 
     Input.Terminal.Input 
     Lenses 
     Main 
     Output.Network.Output 
     Output.Terminal.InputMessages 
     Output.Terminal.Output 
     Output.Terminal.OutputMessages 
     RunLocal 
     RunNetwork 
     Showdown 
     Showdown.Best 
     Showdown.Ord 
     Showdown.Value 
     TestStates 
     Types 
     Utilities.Card 
     Utilities.Player 
     Utilities.Showdown 
     Utilities.Terminal.Output 
     Utilities.Types 
    other-modules: 
     Paths_server 
    default-language: Haskell2010 

executable local-server 
    main-is: Main.hs 
    hs-source-dirs: 
     src 
    cpp-options: -DDEBUG 
    build-depends: 
     base >=4.9 && <=4.11 
    , lens 
    , random 
    , transformers 
    , safe 
    , uuid-types 
    , QuickCheck 
    , server 
    other-modules: 
     Betting 
     Game 
     Input.Network.Input 
     Input.Terminal.Input 
     Lenses 
     Output.Network.Output 
     Output.Terminal.InputMessages 
     Output.Terminal.Output 
     Output.Terminal.OutputMessages 
     RunLocal 
     RunNetwork 
     Showdown 
     Showdown.Best 
     Showdown.Ord 
     Showdown.Value 
     TestStates 
     Types 
     Utilities.Card 
     Utilities.Player 
     Utilities.Showdown 
     Utilities.Terminal.Output 
     Utilities.Types 
    default-language: Haskell2010 

executable networked-server 
    main-is: Main.hs 
    hs-source-dirs: 
     src 
    build-depends: 
     base >=4.9 && <=4.11 
    , lens 
    , random 
    , transformers 
    , safe 
    , uuid-types 
    , QuickCheck 
    , server 
    , network 
    , bytestring 
    , binary 
    other-modules: 
     Betting 
     Game 
     Input.Network.Input 
     Input.Terminal.Input 
     Lenses 
     Output.Network.Output 
     Output.Terminal.InputMessages 
     Output.Terminal.Output 
     Output.Terminal.OutputMessages 
     RunLocal 
     RunNetwork 
     Showdown 
     Showdown.Best 
     Showdown.Ord 
     Showdown.Value 
     TestStates 
     Types 
     Utilities.Card 
     Utilities.Player 
     Utilities.Showdown 
     Utilities.Terminal.Output 
     Utilities.Types 
    default-language: Haskell2010 

test-suite test-server 
    type: exitcode-stdio-1.0 
    main-is: Tests.hs 
    hs-source-dirs: 
     tests 
    cpp-options: -DDEBUG 
    build-depends: 
     base >=4.9 && <=4.11 
    , lens 
    , random 
    , transformers 
    , safe 
    , uuid-types 
    , QuickCheck 
    , server 
    , poker-eval 
    other-modules: 
     BettingTests 
     CardTests 
     PlayerTests 
     ShowdownTests 
    default-language: Haskell2010 

조건부 컴파일되는 모듈 중 하나의 예 : 내 테스트 스위트에서

{-# LANGUAGE CPP #-} 

module Utilities.Card where 

#ifdef DEBUG 
import Output.Terminal.Output (outputPlayerCards) 
#else 
import Output.Network.Output (outputPlayerCards) 
#endif 

dealCards :: GameStateT() 
dealCards = do 
    updateCards =<< numPlayersT 
    outputPlayerCards 

이 outputPlayerCards의 네트워크 버전은 항상에있는에도 불구하고, 호출되는 cpp-options : -DDEBUG 세트.

그러나 네트워크 서버와 로컬 서버가 올바르게 컴파일되어 적절한 기능을 호출합니다.

이전에 네트워크 나 로컬 용으로 컴파일 된 하나의 실행 파일이있는 방법은 테스트 스위트를 작성하는 올바른 방법이 아니라는 것을 알았습니다. .cabal 파일에 소스 디렉토리를 포함시켜 직접 빌드하십시오.

빌드 할 때 스택을 사용하고 있으며 필요한 경우 해당 파일을 포함 할 수 있습니다.

답변

1

cabal 플래그를 사용합니다. true로 설정하면 라이브러리 및 테스트 슈트의 로컬 디버그 버전을 컴파일합니다. false로 설정하면 라이브러리의 네트워크 버전을 컴파일하지만 테스트 스위트는 사용하지 않도록 설정합니다.

실행 파일의 기본 파일을 라이브러리의 별도 디렉토리에 두어야합니다. 이는 라이브러리에 연결하지 않는 문제에 대한 주된 이유입니다.