• 作成:

Gentoo LinuxやArch LinuxなどでStackage LTS 12が使用できないのはncurses 5をインストールしていないからでした

問題

私の管理するパッケージに最新のstackageだとビルドができないというissueが届きました.

yesod-form-bootstrap4-1.0.0 build failure with yesod-*-1.6.2 · Issue #2 · ncaq/yesod-form-bootstrap4

それならばとりあえず最新のstackageを試すべきだなと思って, stack config set resolver ltsしてstack setupします.

すると以下のエラーが発生しました.

% stack setup
Writing implicit global project config file to: /home/ncaq/.stack/global-project/stack.yaml
Note: You can change the snapshot via the resolver field there.
Using latest snapshot resolver: lts-12.0
Downloaded lts-12.0 build plan.
No setup information found for ghc-8.4.3 on your platform.
This probably means a GHC bindist has not yet been added for OS key 'linux64-ncurses6', 'linux64-tinfo6'.
Supported versions: ghc-7.8.4, ghc-7.10.2, ghc-7.10.3, ghc-8.0.1, ghc-8.0.2, ghc-8.2.1, ghc-8.2.2, ghc-8.4.1, ghc-8.4.2

なるほど私のプラットフォームはlinux64-ncurses6もしくはlinux64-tinfo6で, このプラットフォームにはghc-8.4.3は対応していないということですね.

調査

実際対応リスト stack-setup-2.yaml を見るとghc-8.4.3はlinux64にしか載っていないですね.

調べてみると, GentooだけではなくArch Linuxでも同じ症状は起きているようです.

しかし, 何故私のGentoo環境は対応しているlinux64ではなくlinux64-tinfo6と判別されるのでしょうか? それを確かめるために私はソースコードに飛びました.

色々見てみたら, stack/Setup.hsのこの場所で標準かそうでないかを区別していることがわかりました. stack/Setup.hs at 735240f5b99c343e5d86fa57db0893a3fd05f32a · commercialhaskell/stack

hastinfo5 <- checkLib $(mkRelFile "libtinfo.so.5")
hastinfo6 <- checkLib $(mkRelFile "libtinfo.so.6")
hasncurses6 <- checkLib $(mkRelFile "libncursesw.so.6")
hasgmp5 <- checkLib $(mkRelFile "libgmp.so.10")
hasgmp4 <- checkLib $(mkRelFile "libgmp.so.3")
let libComponents = concat
        [ [["tinfo6"] | hastinfo6 && hasgmp5]
        , [[] | hastinfo5 && hasgmp5]
        , [["ncurses6"] | hasncurses6 && hasgmp5 ]
        , [["gmp4"] | hasgmp4 ]
        ]
useBuilds $ map
    (\c -> case c of
        [] -> CompilerBuildStandard
        _ -> CompilerBuildSpecialized (intercalate "-" c))
    libComponents

tinfoのバージョン5がインストールされていると標準判定を貰えるようですね.

解決

ではsys-libs/ncurses-5.9-r101:5をインストールして試してみましょう.

sys-libs/ncurses tinfopackage.useに書いてtinfoもインストールしないとおそらくダメです. 私は元々書いていたので問題はありませんが.

% sudo emerge ncurses:5

すると

% stack setup
Preparing to install GHC to an isolated location.
This will not interfere with any system-level installation.
Downloaded ghc-8.4.3.
Installed GHC.
stack will use a sandboxed GHC it installed
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside of a project, consider using:
stack ghc, stack ghci, stack runghc, or stack exec

問題なくstack setupが通りました.

報告

とりあえずこの問題はStackのissueに報告しました.

No setup information found for ghc-8.4.3 when not installed ncurses version 5 · Issue #4144 · commercialhaskell/stack

後はStackの責任者たちがncurses 6向けにもビルドを提供するとか, 適切なエラー表示を出すとか, 方針を決めてくれるでしょう. 明確に正しい挙動が決まっているバグならともかく, 今回のはどう修正すれば良いのか即座にわからないですし, ビルド提供するのはGitHubのリリースに介入する権限が無いとダメなので, こちらでPull Requestを作ってしまうのは難しいですね.

結局グローバルでは戻しました

LTS 12にしたらxmonadのビルドも通らなくなってしまったのでグローバルでは11に戻しました. これも報告しないといけませんね.

どちらにせよローカルプロジェクト環境ではnightlyのGHC 8.4.3を試さないといけないので, workaroundが見つかって良かったです.