haskell-jp / questions #107 at 2026-03-02 08:42:01 +0900

cabalファイルなどで、依存ライブラリに対してフラグを指定する方法はあるでしょうか?

具体的には、耐量子暗号ライブラリのmlkemが、デフォルトでcryptoniteを使おうとします。use_crypton フラグを渡すと crypton を使うようになります。

やりたいのは、tlsライブラリを use_crypton フラグを指定したmlkemライブラリに依存させることです。

この CI をパスさせたい。。。

https://github.com/haskell-tls/hs-tls/actions/runs/22532143188/job/65273083761?pr=517
Hiromi ISHII / mr_konn
cabal.project ファイルに個別の(依存先含めた)パッケージごとの設定を書くことができて、そこで個別にフラグも指定できます
https://cabal.readthedocs.io/en/stable/cabal-project-description-file.html
昨日、tls のトップディレクトリに以下のファイルを置いて試したのですが、うまくいかないのです。何か間違ってますか?

package mlkem
  flags: +use_crypton
Hiromi ISHII / mr_konn
ああ、すでにお試しでしたか。文面から読み取れず失礼しました:bow: 構文はあってそうですね。となるとフラグが足りないとか、バージョンが想定と違うとか、違う要因で落ちてるとかですかね。細かい事情はわからないですが……
cabal.project は、1個のパッケージ内に置いてもうまく行きますか?
複数のパッケージを束ねるものだと理解しているので。。。
Hiromi ISHII / mr_konn
うまくいきますし、普通に一つのパッケージしかなくてもビルド設定や外部レポジトリの依存関係を引き入れたりするのに使う必要があるので、むしろ想定の用途ですね
そうですか。
では、信じていろいろ試してみます。
Hiromi ISHII / mr_konn
freezeファイルで依存バージョンを固定したりにも使えるので
Hiromi ISHII / mr_konn
たとえば、手前味噌ですがこれなんかはまさに単一パッケージのレポジトリでcabal.projectでフラグなどを制御している例です、ご参考までに(言ってる本人の例じゃ信じきれないかもですが……
https://github.com/konn/tamagoh/blob/main/cabal.project
もしかして、cabal.project は v2 のコマンドでしか有効になりませんか?
僕は、v1 コマンドを使っています。
Hiromi ISHII / mr_konn
あーーーそれはそうですね
Hiromi ISHII / mr_konn
最新の cabal だと何も prefix をつけなければ v2-build になりますが、わざわざ v1-build を呼んでいる?
なるほど、CI 側は v2 なので、push してみます。
v2 はよく理解できず、気持ち悪いので、v1 を使い続けています。
(cab というラッパーを使っています。)
Hiromi ISHII / mr_konn
しょうじき v1 はもうメンテされないですし、reproducible build もできず、大して使い勝手もかわらないので v1 を使いつづける理由は今日は全くないと思いますね……
昔 v2 を使ったときに、ライブラリがどのディレクトリにインストールされるのかも分からなかったので、諦めました。
ちょっと、勉強し直します。
Hiromi ISHII / mr_konn
• 基本的に設定が同じものは使い回される
• Hackageからの依存関係は ~/.cabal/store (ないし XDG の設定によってはキャッシュディレクトリ)に置かれる
• ローカルのパッケージや source-repository-package の依存関係のビルド結果は dist-newstyle におかれる
こんな感じだけ押さえておけば大丈夫かと!
いろいろ教えていただいて、ありがとうござました。
cabal.project に書くべきは、package ではなく、constraints でした。
ようやく解決しました。