• 作成:
  • 更新:

Setup.hsでcabalのフラグを取得して動作を変える

yesodとwebpackを協調させてTypeScriptをビルドする方法 - ncaq に書いてあるように私はSetup.hsで事前にアセットをビルドしていました.

しかしこのpreBuildを使う方法ではどうやってもcabalのflagが取得できないようで悩んでいました.

flag取得して挙動を変える方法がわかったので書きます.

まずpackage.yaml

custom-setup:
  dependencies:
    - base
    - Cabal
    - process

と書きます.

そしてSetup.hs

import           Distribution.PackageDescription
import           Distribution.Simple
import           Distribution.Simple.LocalBuildInfo
import           Distribution.Simple.Setup
import           System.Process

main :: IO ()
main = defaultMainWithHooks simpleUserHooks
  { buildHook = buildHookCustom
  }

buildHookCustom :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO ()
buildHookCustom packageDescription localBuildInfo userHook buildflags = do
  case lookupFlagAssignment (mkFlagName "dev") (configConfigurationsFlags $ configFlags localBuildInfo) of
    Just True -> callProcess "yarn" ["run", "build-deve"]
    _         -> callProcess "yarn" ["run", "build-prod"]
  (buildHook simpleUserHooks) packageDescription localBuildInfo userHook buildflags

と書きます. 以上.

Cabalのバージョンによってflagの型が変わったりするので要注意. これは2.4.1.0のものです.

これは完全に動作をオーバーライドしているので, ConfigFlagsconfigTestsを見て分岐すれば 以前から出来なくて悩んでいた「テスト時にテストフラグを自動で有効化する」 ということも可能でしょう.

今日はもうやりませんが…

自動でテストフラグ追加は出来ませんでした

CPPフラグはビルド前に決まるのかconfigTestsを見てフラグを上書きしてもうまく動きませんでした. ちゃんとやる方法はわかりません.