ghc 7.2 hits overlay!

July 23, 2011

Пару дней назад MrFenix спросил как бы это ему написать новый ебилд для ghc. Я ему что-то начал невнятно объяснять и решил, что проще добавить ебилд самому и по горячим следам писануть микродок. Собственно результат.

Но обычно при обновлении мажорной версии ghc проблемы приносит не сам компилятор, а либы которые он с собой тянет. В нашем случае обновились Cabal до 1.12, integer-gmp до 0.3 и base до 4.4. Остальное - мелочи. И теперь пакеты haskell98 и base мешать нельзя.

Как бы там ни было, приличное число пакеров разваливается и надо их понемногу фиксить. В этом нам помогает ebuild. Он нам помогает разбить установку пакета в систему на фазы и редактировать пакет на ходу.

Рассмотрим пример исправления такого пакета: data-inttrie.

[1 of 1] Compiling Main             ( /tmp/portage/dev-haskell/data-inttrie-0.0.4/work/data-inttrie-0.0.4/Setup.hs, /tmp/portage/dev-haskell/data-inttrie-0.0.4/work/data-inttrie-0.0.4/Setup.o )
Linking setup ...
Configuring data-inttrie-0.0.4...
setup: At least the following dependencies are missing:
base >=3 && <=4.4

Заходим в каталог с ебилдом и запускаем ebuild data-inttrie-0.0.4.ebuild clean prepare. Эта команда удаляет старый мусор, распаковывает исходник и накладывает патчи (если есть).

Теперь мы можем создать внутри репозиторий git, чтобы не париться созданием патчей позже. Для этого у меня есть суперскипт gitify:

# cat ~/bin/gitify
#!/bin/sh -e
git init
git add .
git commit -a -s -m "initial $(pwd)"

переходим в …work/data-inttrie-0.0.4/ и запускаем gitify. Теперь запускаем ebuild path/to/data-inttrie-0.0.4.ebuild compile и ловим ошибку сборки:

[st@st] ~/portage/gentoo-haskell/dev-haskell/data-inttrie:ebuild ~/portage/gentoo-haskell/dev-haskell/data-inttrie/data-inttrie-0.0.4.ebuild compile
>>> Existing ${T}/environment for 'data-inttrie-0.0.4' will be sourced.
>>> Run 'clean' to start with a fresh environment.
...
>>> It appears that 'data-inttrie-0.0.4' is already setup; skipping.
>>> Remove '/tmp/portage/dev-haskell/data-inttrie-0.0.4/.setuped' to force setup.
>>> Checking data-inttrie-0.0.4.tar.gz's mtime...
>>> WORKDIR is up-to-date, keeping...
>>> It appears that 'data-inttrie-0.0.4' is already prepared; skipping.
>>> Remove '/tmp/portage/dev-haskell/data-inttrie-0.0.4/.prepared' to force prepare.
>>> Configuring source in /tmp/portage/dev-haskell/data-inttrie-0.0.4/work/data-inttrie-0.0.4 ...
 * Using cabal-1.11.1.20110721.
 [1 of 1] Compiling Main             ( /tmp/portage/dev-haskell/data-inttrie-0.0.4/work/data-inttrie-0.0.4/Setup.hs, /tmp/portage/dev-haskell/data-inttrie-0.0.4/work/data-inttrie-0.0.4/Setup.o )
 Linking setup ...
 Configuring data-inttrie-0.0.4...
 setup: At least the following dependencies are missing:
 base >=3 && <=4.4

Видно, что исходник не перераспаковывался заново. Можно фиксить и прбовать собирать и тестировать всё прямо на месте. Когда результат будет готов, git diff выдаст нам готовый патч.

Чтобы каждый раз не париться созданием git репозитория вкатим такую штуку в /etc/portage/bashrc. Ради нее я пост и начал писать:

# cat /etc/portage/bashrc
post_src_prepare() {
    pushd "${S}"
    if [ ! -d .git ]; then
            git init .
            git config user.name "Sergei Trofimovich"
            git config user.email "slyfox@gentoo.org"
            git add .
            git commit -s -m "inital $(pwd)"
    fi
    popd
}

post_src_prepare вызывается emerge сразу после фазы src_prepare (в этой фазе обычно завершается работа с самим исходником: всё патчится и автогенерится).

Теперь вернемся к data-inttrie: base >=3 && <=4.4 исправляем base >=3 && <4.5 (отношение <= практически всегда неправильное).

Запускаем ebuild path/to/data-inttrie-0.0.4.ebuild compile test и убеждаемся, что пакет собирается и его тесты работают (если есть).

Готово! :]