【问题标题】:Conditional compilation of library using test suite使用测试套件条件编译库
【发布时间】:2017-10-07 14:38:01
【问题描述】:

我正在尝试为使用 CPP 扩展有条件地导入不同模块的 haskell 项目正确编译我的测试套件。一个模块将输出发送到网络,另一个发送到终端进行调试。

这很好用,但是当我尝试设置我的测试套件时,它似乎不尊重 .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 中设置了。

但是,networked-server 和 local-server 已正确编译,并调用了相应的函数。

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

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

【问题讨论】:

    标签: haskell cabal haskell-stack


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多