2017-10-07 50 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选项:-DDEBUG集。

但是,联网服务器和本地服务器已正确编译并调用相应的函数。

我以前的方法只有一个为网络或本地编译的可执行文件,但是我读到它不是编写测试套件的正确方法,因为我没有链接aginst它,而是直接通过将其源代码目录包含在.cabal文件中来构建它。

我使用堆栈来构建,如果需要,可以包含该文件。

回答

1

我会使用cabal标志:当设置为true时,编译库和测试套件的本地调试版本;当设置为false时,编译联网版本的库,但禁用测试套件。

您还应该将可执行文件的主要文件放在与库不同的目录中,这是您提到的关于不与库链接的问题背后的主要原因。