LINUX.ORG.RU

Gentoo, оверлей для crossdev

 


1

2

Я всё не могу понять логику, по которой crossdev выбирает в какой оверлей класть свои ebuild'ы. Вроде пишут, что он выбирает первый оверлей в списке PORTDIR_OVERLAY. Но опытным путём было выяснено, что он выбирает последний. Окей. Поместил локальный оверлей последним в списке. Всё стало хорошо работать. Затем добавил с помощью layman ещё один оверлей - и crossdev начал писать в него, хотя в списке последний по-прежнему локальный оверлей.

$ cat /etc/portage/make.conf/0-base 
#------------------------------------------------------------------------------                                                                                 
# Modified Calculate-core 3.2.3.1                                                                                                                               
# Processed template files:                                                                                                                                     
# /var/lib/layman/calculate/profiles/templates/3.1/2_ac_install_merge/sys-apps/portage/make.conf.base                                                           
# For modify this file, create /etc/portage/make.conf/0-base.clt template.                                                                                      
#------------------------------------------------------------------------------                                                                                 
# Подключение оверлеев в layman. Вы не должны изменять этот параметр, т.к.
# это может нарушить работу пакетного менеджера.
source /var/lib/layman/make.conf
$ grep PORTDIR_OVERLAY /etc/portage/make.conf/custom 
PORTDIR_OVERLAY="$PORTDIR_OVERLAY /usr/local/portage"
$ portageq repositories_configuration "/"
[DEFAULT]
main-repo = gentoo

[calculate]
location = /var/lib/layman/calculate
masters = gentoo
priority = 1

[distros]
location = /var/lib/layman/distros
masters = calculate gentoo
priority = 0

[gentoo]
location = /usr/portage
masters = 
priority = -1000
sync-type = git
sync-uri = git://git.calculate.ru/calculate/portage.git

[tox-overlay]
location = /var/lib/layman/tox-overlay
masters = gentoo
priority = 2

[zzz_crossdev-overlay]
location = /usr/local/portage
masters = gentoo
priority = 3

Добавил «zzz» к имени локального оверлея, чтобы убедиться что crossdev не выбирает их по порядку (просто tox-overlay, в который начал писать crossdev оказался последним по списку).

Как можно заметить, сейчас tox-overlay не находится ни первым, ни последним ни по списку, ни по приоритету, но crossdev почему-то пытается писать туда.

Почему так происходит? Как обуздать crossdev? Он ведёт себя совершенно непредсказуемо при каждом изменении списка оверлеев. Уже хочется открыть его исходники и захардкодить своё имя оверлея, если не будет найдено решение.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

Ответ на: комментарий от pS

Переименовал локальный оверлей в gentoo-crossdev-overlay - он стал в списке сразу после gentoo, однако crossdev всё равно пишет в tox-overlay.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от pS

Вот фрагмент crossdev, который отвечает за поиск оверлея, насколько я понимаю (могу ошибаться):

parse_repo_config() {
        # Ugh, ini parser here we come.
        # [DEFAULT]
        # main-repo = gentoo
        # [crossdev]
        # location = /usr/local/portage
        # masters = gentoo
        # priority = 0
        local repo_config=$(portageq repositories_configuration "${ROOT}")
        local flat_config=$(echo "${repo_config}" | gawk '
                {
                        if ($1 == "main-repo") {
                                main_repo = $NF
                        } else if ($1 ~ /^\[/) {
                                if (repo_name && loc)
                                        repos[prio] = repo_name ":" loc
                                repo_name = gensub(/\[([^\]]*)\]/, "\\1", "", $1)
                                loc = prio = ""
                        } else if ($1 == "priority") {
                                prio = $3
                        } else if ($1 == "location") {
                                loc = $3
                        }
                }
                END {
                        repos[prio] = repo_name ":" loc

                        print(main_repo)
                        asorti(repos, prios)
                        for (prio in prios)
                                print(repos[prios[prio]])
                }
        ')

        MAIN_REPO_NAME=$(echo "${flat_config}" | head -1)
        REPO_CONFIG=$(echo "${flat_config}" | sed 1d)
        MAIN_REPO_PATH=$(echo "${REPO_CONFIG}" | sed -n "/^${MAIN_REPO_NAME}:/s,^[^:]*:,,p")
        if [[ -z ${SEARCH_OVERLAYS} ]] ; then
                # see if user gave us an overlay search list, otherwise
                # default to whatever is configured in portage
                SEARCH_OVERLAYS=$(echo "${REPO_CONFIG}" | sed -e "/^${MAIN_REPO_NAME}:/d" -e 's,^[^:]*:,,')
        fi
}
KivApple ★★★★★
() автор топика
Ответ на: комментарий от pS

Как ни странно это помогло, но я так и не смог понять это по коду. Быть может дефолтное название оверлея задаётся в другом месте скрипта...

KivApple ★★★★★
() автор топика
10 июля 2015 г.
Ответ на: комментарий от KivApple

Сейчас наткнулся снова на эту тему. Оказывается, crossdev гадит в репозиторий с максимальным приоритетом, см. https://wiki.gentoo.org/wiki/Overlay/Local_overlay. Имя репы, кстати, не важно в случае отказа от PORTDIR и PORTDIR_OVERLAY (новый способ). Иначе имя должно быть crossdev.

pS
()
Последнее исправление: pS (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.