あるパッケージのバージョンによって別のパッケージへの依存関係を変更する
具体的にはaesonのバージョンが新しい場合にのみscientificを依存関係に組み込みたいとする。
library build-depends: (aeson >= 0.3.2.5 && < 0.7.0) || (aeson >= 0.7.0 && scientific)
こんな感じにできないかなぁと思っていたが、これはparse errorになり動かない。同僚に聞いてみたところ、flagを使うのが定石らしい。
flag aeson070 default: False manual: False library if flag(aeson070) build-depends: aeson >= 0.7.0 , scientific else build-depends: aeson >= 0.3.2.5 && < 0.7.0
aeson070という名前は何でも良い。なぜならmanual: Falseの場合*1、Cabalはaeson070 == Falseでインストールを試み、失敗した場合は自動的にaeson070 == Trueにして再度インストールしようとする。要するにユーザが手で指定するフラグでは無いので何でも良い。
*1:Falseがデフォルト値