2017-10-07 27 views
0

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ファイルに含めて直接ビルドします。

ビルドにスタックを使用しており、必要に応じてそのファイルを含めることができます。

答えて

1

私はcabalフラグを使用します:trueに設定すると、ライブラリとテストスイートのローカルデバッグバージョンをコンパイルします。 falseに設定した場合、ライブラリのネットワーク化されたバージョンをコンパイルしますが、テストスイートは無効にします。

また、実行ファイルのメインファイルをライブラリとは別のディレクトリに置く必要があります。これは、ライブラリとリンクしないことに関する主な理由です。

関連する問題