Ошибка "Failed to build ..." зависимости при сборке Haskell-проекта: возможное решение через ограничения сборки

16.02.2025

Илья Замарацких

Haskell

Решения проблем

TL;DR

Что вы можете попробовать сделать:

  1. Попробуйте собрать более старые версии библиотеки, которая создает проблемы при помощи cabal install, например, cabal install sorted-list-0.2.2.0

  2. Если проблема не воспроизводится на более старых версиях библиотеки, попробуйте собрать проект с более старой версией библиотеки через ручное ограничение версии зависимости сборки. Для GHCup это выглядит так: ghcup compile hls --version 2.9.0.0 --ghc 9.4.7 --cabal-update -j 8 -- --constraint="sorted-list == 0.2.2.0". Для cabal требуется только передать флаг --constraint

При сборке Haskell Language Server (2.9.0.0) из исходников под нужную мне версию GHC я столкнулся со следующей ошибкой:

[ Info  ] Building HLS 2.9.0.0 for GHC version 9.4.7
[ cabal ]     |
[ cabal ] 375 | traverse f = foldrM (\x xs -> liftA2 insert (f x) $ pure xs) mempty
[ cabal ]     |                               ^^^^^^
[ cabal ] Error: [Cabal-7125]
[ cabal ] Failed to build sorted-list-0.2.3.0 (which is required by exe:haskell-language-server-wrapper from haskell-language-server-2.9...
[ cabal ]
[ Error ] [GHCup-08841] BuildFailed failed in dir /home/ilya/.ghcup/tmp/ghcup-82b3afde9bf5bd5b/haskell-language-server-2.9.0.0: Process "cabal" with arguments...

HLS настойчиво отказывался собираться при любых версиях HLS и GHC, причем все связано с одной библиотекой. При попытке ручной сборки оказалось, что библиотеке не хватает функций:

> cabal install sorted-list-0.2.3.0
Data/SortedList.hs:375:31: error:
    Variable not in scope:
      liftA2
        :: (a0 -> SortedList a0 -> SortedList a0)
           -> m b -> f0 (SortedList b) -> m (SortedList b)
    |
375 | traverse f = foldrM (\x xs -> liftA2 insert (f x) $ pure xs) mempty
    |                               ^^^^^^
Error: [Cabal-7125]
Failed to build sorted-list-0.2.3.0. See the build log above for details.

Возможно, это связано с какими-то особенностями целевой системы (сборка велась под Gentoo), или просто версия библиотеки была нерабочей, но при этом попадала в ограничения версий HLS. В любом случае, при откате библиотеки на версию назад, оказалось что проблема сборки библиотеки не воспроизводится. Итоговое решение - собрать HLS с более старым sorted-list.

ghcup compile hls --version 2.9.0.0 --ghc 9.4.7 --cabal-update -j 8 -- --constraint="sorted-list == 0.2.2.0"

На данный момент ничего не сломалось, надеюсь вам поможет мой опыт.