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
のものです.
これは完全に動作をオーバーライドしているので,
ConfigFlags
のconfigTests
を見て分岐すれば以前から出来なくて悩んでいた「テスト時にテストフラグを自動で有効化する」
ということも可能でしょう.
今日はもうやりませんが…
自動でテストフラグ追加は出来ませんでした
CPPフラグはビルド前に決まるのかconfigTests
を見てフラグを上書きしてもうまく動きませんでした.
ちゃんとやる方法はわかりません.