CPP拡張機能を使用して異なるモジュールを条件付きでインポートするhaskellプロジェクト用のテストスイートを正しくコンパイルしようとしています。 1つのモジュールはデバッグのために出力をネットワークに送信し、もう1つは端末に送信します。テストスイートを使用したライブラリの条件付きコンパイル
これはうまくいきますが、テストスイートを設定しようとすると、.cabalファイルに設定されているcpp-optionsを尊重していないように見え、代わりに常にネットワーク化されたバージョンが作成されます。
カバルファイル:
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が設定されています。
ただし、ネットワークサーバーとローカルサーバーは正しくコンパイルされ、適切な機能が呼び出されます。
私の以前の方法では、ネットワークまたはローカルのフラグが働くようにコンパイルされた実行可能ファイルを1つだけ持っていましたが、テストスイートを書くのは正しい方法ではありません。そのソースディレクトリを.cabalファイルに含めて直接ビルドします。
ビルドにスタックを使用しており、必要に応じてそのファイルを含めることができます。