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 파일에 소스 디렉토리를 포함시켜 직접 빌드하십시오.
빌드 할 때 스택을 사용하고 있으며 필요한 경우 해당 파일을 포함 할 수 있습니다.