Bug 47117

Summary: GHC: непростой FTBFS
Product: Sisyphus Reporter: Anton Zhukharev <ancieg>
Component: ghc8.6.4Assignee: Anton Zhukharev <ancieg>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P5 CC: ancieg, lav
Version: unstable   
Hardware: aarch64   
OS: Linux   

Description Anton Zhukharev 2023-08-04 09:58:38 MSK
GHC сейчас находится в состоянии FTBFS, которое вызвано обновлением autoconf до 2.71. Я это дело, вроде бы, починил: https://git.altlinux.org/tasks/326169/.


Но при сборке обнаружилась проблема, которая заключается в том, что на ARM'е GHC использует LLVM для компиляции. Причём LLVM он хочет версии 6.0... (как для сборки себя, так и для сборки своих пакетов - т.е. в Requires и BuildRequires).

В целом, можно попробовать втупую подменить версию LLVM с 6.0, например, на 15.0, но, мне кажется, что просто так не сработает и понадобится долгая отладка.


Эта проблема, по всей видимости, была скрыта от глаз из-за того, что ночная пересборка пакетов происходит только на x86_64 и i586.


Теперь необходимо починить текущую версию GHC в Сизифе, заставив работать с последним LLVM, для того, чтобы потом его (GHC) обновить до более новой версии.

Чинить необходимо текущую версию, поскольку современный GHC собирается только с помощью GHC. Когда сборка текущей версии (8.6.4) будет исправлена на всех поддерживаемых архитектурах, тогда можно будет обновить его до последней версии, иначе мы рискуем остаться вообще без Haskell на ARM'овых платформах навсегда.
Использование внешних бинарных сборок хочется максимально избежать.


Берусь за попытку исправить и отладить сборку GHC на aarch64 и armh, поскольку сейчас у пакета нет мейнтейнера:

ghc8.6.4	@nobody
Comment 1 Anton Zhukharev 2023-08-15 23:16:42 MSK
Успешно удалось собрать для ARM на следующих версиях LLVM: 11.1, 12.0:
https://packages.altlinux.org/en/tasks/326169/

Отладочную сборку провожу локально на Orange Pi 5 8GB.

С более новыми версиями GHC не собирается из-за какой-то ошибки связанной с оптимизатором (если его отключить, то собирается).

На ARM'ах GHC выглядит очень поломанным. Вот пример сборки простейшей программы:
================================================================================
ghc Main.hs -package ghc -O0 -o llvmver
[1 of 1] Compiling Main             ( Main.hs, Main.o )

<no location info>: error:
    Warning: Couldn't figure out LLVM version!
             Make sure you have installed LLVM 6.0
Linking llvmver ...
/usr/bin/ld.gold: error: cannot find -ltinfo
/usr/lib64/ghc-8.6.4/ghc-8.6.4/libHSghc-8.6.4.a(Terminal.o):ghc_3.ll:c5K9_info$def: error: undefined reference to 'set_curterm'
/usr/lib64/ghc-8.6.4/ghc-8.6.4/libHSghc-8.6.4.a(Terminal.o):ghc_3.ll:c5Kh_info$def: error: undefined reference to 'set_curterm'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:caww_info$def: error: undefined reference to 'tigetnum'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_4.c:terminfozm0zi4zi1zi2_SystemziConsoleziTerminfoziBase_tigetnum_info: error: undefined reference to 'tigetnum'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:s9Kp_info$def: error: undefined reference to 'set_curterm'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:s9Kp_info$def: error: undefined reference to 'setupterm'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:ccoy_info$def: error: undefined reference to 'set_curterm'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:ccoG_info$def: error: undefined reference to 'setupterm'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:ccp3_info$def: error: undefined reference to 'del_curterm'
/usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.ll:ccp3_info$def: error: undefined reference to 'del_curterm'
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)
================================================================================


Сообщение
================================================================================
no location info>: error:
    Warning: Couldn't figure out LLVM version!
             Make sure you have installed LLVM 6.0
================================================================================
в GHC из задания 326169 уже не появляется (там версия LLVM определяется нормальным способом).



А программка, которую я компилировал выше нужна для определения версии LLVM с которой собран GHC.
Это нужно по причине того, что при установке llvm12.0 подтягивается также llvm15.0, который сразу становится по-умолчанию, а с ним GHC работать отказывается...
Comment 2 Anton Zhukharev 2023-08-16 21:12:29 MSK
(In reply to Anton Zhukharev from comment #1)
> ghc Main.hs -package ghc -O0 -o llvmver
> [1 of 1] Compiling Main             ( Main.hs, Main.o )
> 
> <no location info>: error:
>     Warning: Couldn't figure out LLVM version!
>              Make sure you have installed LLVM 6.0
> Linking llvmver ...
> /usr/bin/ld.gold: error: cannot find -ltinfo
> /usr/lib64/ghc-8.6.4/ghc-8.6.4/libHSghc-8.6.4.a(Terminal.o):ghc_3.ll:
> c5K9_info$def: error: undefined reference to 'set_curterm'
> /usr/lib64/ghc-8.6.4/ghc-8.6.4/libHSghc-8.6.4.a(Terminal.o):ghc_3.ll:
> c5Kh_info$def: error: undefined reference to 'set_curterm'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:caww_info$def: error: undefined reference to 'tigetnum'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_4.
> c:terminfozm0zi4zi1zi2_SystemziConsoleziTerminfoziBase_tigetnum_info: error:
> undefined reference to 'tigetnum'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:s9Kp_info$def: error: undefined reference to 'set_curterm'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:s9Kp_info$def: error: undefined reference to 'setupterm'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:ccoy_info$def: error: undefined reference to 'set_curterm'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:ccoG_info$def: error: undefined reference to 'setupterm'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:ccp3_info$def: error: undefined reference to 'del_curterm'
> /usr/lib64/ghc-8.6.4/terminfo-0.4.1.2/libHSterminfo-0.4.1.2.a(Base.o):ghc_3.
> ll:ccp3_info$def: error: undefined reference to 'del_curterm'
> collect2: error: ld returned 1 exit status
> `gcc' failed in phase `Linker'. (Exit code: 1)
> =============================================================================
> ===

Проблема в том, что GHC линкуется с libtinfo.so (который предоставляется devel-пакетом).

> Сообщение
> =============================================================================
> ===
> no location info>: error:
>     Warning: Couldn't figure out LLVM version!
>              Make sure you have installed LLVM 6.0
> =============================================================================
> ===
> в GHC из задания 326169 уже не появляется (там версия LLVM определяется
> нормальным способом).

Это была плохая идея.

> А программка, которую я компилировал выше нужна для определения версии LLVM
> с которой собран GHC.
> Это нужно по причине того, что при установке llvm12.0 подтягивается также
> llvm15.0, который сразу становится по-умолчанию, а с ним GHC работать
> отказывается...

Правится установкой переменной:

    export ALTWRAP_LLVM_VERSION="12.0"
Comment 3 Anton Zhukharev 2023-08-16 21:27:21 MSK
(In reply to Anton Zhukharev from comment #2)
> Проблема в том, что GHC линкуется с libtinfo.so (который предоставляется
> devel-пакетом).

Это поспешный вывод, но проблема есть.


Воспроизведение:

==================================================
module Main where

import LlvmCodeGen.Base(supportedLlvmVersion)

main :: IO ()
main = let (maj,min) = supportedLlvmVersion
        in putStrLn $ show maj ++ "." ++ show min
==================================================

$ ghc Main.hs -O0 -package ghc -o llvmver
Comment 4 Anton Zhukharev 2023-08-28 19:51:41 MSK
ghc8.6.4 исправлен в Сизифе (думаю, что над версией 8.6.4 работа завершена).
Сейчас sin@ работает над обновлением GHC до более новых версий.