LINUX.ORG.RU

Gentoo - как собирать пакеты поштучно?

 , ,


1

1

пакет, который надо собрать, буду далее упоминать/записывать как «application.ebuild»

По идее есть:

1) некий исходный toolchain, который собирает пакеты для текущей архитектуры $CBUILD с указанием что надо уметь генерировать код для целевой архитектуры ($CHOST).

Этот тулчейн можно взять готовый с какого-нибудь гентушного сервера для сборки бинарных пакетов:
PORTAGE_BINHOST {1}={http://}$PKGDIR {0} (например "http://tinderbox.dev.gentoo.org/default/linux/amd64/")
и компилировать его не надо.
Надо настроить этот тулчейн, чтобы он собирал пакеты с возможностью генерирования кода под другую архитектуру

в результате нужен первый проход компиляции, когда собираются все пакеты для архитектуры $CBUILD
насколько я понимаю, должны быть скомпилированы *ВСЕ* те пакеты,
которые указаны в DEPEND в пакете application.ebuild
однако, если использовать crossdev (Builds and installs slotted toolchains for arbitrary GCC-supported platforms)
то она собирает не все пакеты, а только очень малое их подмножество.
И я как-то пропустил, где указано как собирать остальные пакеты из DEPEND

Эти новые пакеты для второй фазы сборки
во-первых, собираются указанную директорию $ROOT {1}
а во-вторых в $PKGDIR {1}
(указанную в файле /etc/portage/make.conf или /etc/portage/make.conf/gentoo)
если указано, что надо сохранять .tbz2-файлы

пакеты можно собирать по одной штуке (чтобы сэкономить место).

2) Имея теперь директорию $PKGDIR {1} с кучей .tbz2 для пакетов в архитектуре $CBUILD
(некий toolchain с архитектурой $CBUILD, в который входят:
компилятор, питон, portage и прочие из DEPEND)
Мы можем устанавливать их бинарно по списку из конкретного application.ebuild без компиляции
в произвольных комбинациях для разных application1 и application2
Для бинарной установки этих пакетов надо прописать переменную PORTAGE_BINHOST {2}={http://} $PKGDIR {1} - в какой файл? ведь PORTAGE_BINHOST {1} уже указывает на thinderbox)

Так же где-то должен быть отдельный make.conf цепочки, чтобы указать там директорию $ROOT {2} и $PKGDIR {2} для результатов второго этапа.

3) На третьем этапе надо бинарно установить те пакеты, которые будут запакованы в stage3.iso, для этого установить третью $PORTAGE_BINHOST {3}={http://}$PKGDIR {2} (в каком файле?)
и бинарно промержить
@system
все пакеты из $RDEPEND
и бинарный пакет application.tbz2 (из $PKGDIR {2})

Я хочу добиться того, чтобы в каждый момент времени использовалось минимум временного пространства (пускай и за счет увеличения числа копирований). Для этого я хочу, чтобы все пакеты устанавливались бинарно, кроме текущего собираемого. Для того, чтобы производить сборку в RAM-диске (и после сборки каждого пакета сборку следующего начинать начисто).

Основной загадкой для меня является расположение конфигов на каждом этапе.
Насколько я понимаю, нужно выполнить два chroot
(для того, чтобы можно было указать три разных PORTAGE_BINHOST)
1) после окончания сборки всех пакетов из DEPEND в архитектуре $CHOST, для того, чтобы установить их бинарно
сборку для CTARGET выполнять так же уже внутри chroot ?
2) перед установкой пакетов в stage3, чтобы устанавливать их бинарно

Я правильно думаю?

Вообще, как я понял, есть два разных подхода:
1) мы компилируем все пакеты при помощи второй цепочки (при этом используется мощная машина), и финальные пакеты для архитектуры $CTARGET получаются сразу и навсегда. Деплоятся они в таком виде.
2) мы компилируем для $CTARGET только тулчейн
потом запускаем систему виртуализации и всё равно на мощной машине, но под виртуализацией собираем все остальные пакеты на враждебной архитектуре.

Правильно?

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Pinkbyte

во-первых, твоя ссылка устарела:
This guide is outdated by the Embedded Handbook. Please use that from now on:
http://www.gentoo.org/proj/en/base/embedded/handbook/

во-вторых, уже читал (твоя ссылка есть в исходном топике). Мои вопросы, которые мне непонятны после прочтения, тоже есть в исходном топике.

На всякий случай, прочитал ещё раз.

Там есть фраза: «All proper Gentoo systems have a toolchain installed as part of the base system. This toolchain is configured to build binaries native to its host platform.»

Если делать моим способом №1, то на целевой системе тулчейн не нужен, что будет экономить место. Пакетный менеджер в принципе тоже не нужен, можно воспользоваться пакетным менеджером из второго этапа (для установки в указанную ROOT {3})

Там говорится про переменную PORTAGE_CONFIGROOT, которую надо указывать для работы cross toolchain, но не говорится, в каком файле её надо указывать.

Вот этот кусок тоже непонятный:
«Cross-compiling a system generally involves two directory trees. The first is where all development files are normally installed. This is your sysroot. The other tree is where only your runtime files are installed. You emerge all of your fun packages into your sysroot (without trimming down any files), and then either install via binary packages or copying files by hand all the stuff you need in your runtime tree.»
это же очевидно неверно. Если есть три архитектуры, то двумя директориями не обойтись.

Мне непонятно, зачем используются файлы-с-длинными-именами-например-emerge. Почему бы вместо этого не собрать ещё bash и не сделать chroot?

Перечитав не нашел ответов на свои вопросы:
Q1) Основной загадкой для меня является расположение конфигов на каждом этапе (и даже их количество).
Q2) Существует ли свой make.conf внутри sysroot (=ROOT{1}) ?
Q3) реально ли собрать stage3 без тулчейна и менеджера пакетов (чтобы он при этом работал после распаковки)?

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

Поскольку я буквально исполнял инструкцию «This guide is outdated by the Embedded Handbook. Please use that from now on»

то пропустил много интересного про xbuild и что второй make.conf всё-таки есть.

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

Перечитав не нашел ответов на свои вопросы:
Q1) Основной загадкой для меня является расположение конфигов на каждом этапе (и даже их количество).

Всё описано там. Что не описано есть в выхлопе crossdev-а.

Q2) Существует ли свой make.conf внутри sysroot (=ROOT{1}) ?

Есть в выхлопе crossdev-а

Q3) реально ли собрать stage3 без тулчейна и менеджера пакетов (чтобы он при этом работал после распаковки)?

Да. Об этом также описано там - тулчейн собирается в другой prefix, нежели сам stage

Такие вопросы может задавать человек который: а) не внимательно читает документацию;
б) не пробовал сделать то что хочет, опираясь на эту самую документацию и читая выхлоп соответствующий утилит

С crossdev бесспорно ЕСТЬ много неочевидных моментов. Но заданные тобой вопросы к ним не относятся, если ты его хотя бы раз использовал.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

не пробовал сделать то что хочет

Сначала нужно добиться понимания, чего хочет, и только потом делать?

невнимательно читает

извини, но убиваться не стану, как бы тебе этого не хотелось. А внимательность увеличить не могу по аппаратным причинам (тупой). На стековерфлоу на вопросы просто отвечают или не отвечают. Обожаю джедаев.

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Pinkbyte

Мне непонятно, зачем вообще нужно два шага компиляции (сначала ставить пакет из базовой системы в sysroot при помощи emerge, а потом из sysroot компилировать в target system при помощи xemerge), и как это помогает. Почему бы сразу не создавать бинарники для целевой платформы в один шаг?

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

После прочтения википедии:
http://en.wikipedia.org/wiki/Cross_compiler
у меня сложилось впечатление, что компилятор GCC конфигурируется только при помощи перекомпиляции (а не в рантайме).
т.е. зря в руководстве упомянули про canadian cross, для него нужно три шага компиляции, а сразу это не очевидно и кажется, что двух достаточно

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Pinkbyte

Правильно ли я понимаю, что код, генерируемый компилятором в основной системе ничем не отличается от кода уже установленных в основной системе пакетов (за исключением тех, которые устанавливаются при помощи crossdev),
и можно сразу просто установить из бинарных пакетов с tinderbox в sysroot ?

Indaril_Shpritz
() автор топика
Последнее исправление: Indaril_Shpritz (всего исправлений: 1)
Ответ на: комментарий от Indaril_Shpritz

Или ещё проще - делаю chroot, разворачиваю туда stage3, устанавливаю crosstoolchain (с затиранием исходного toolchain), бинарно мержу все остальные пакеты

и потом всё что я соберу в отдельный каталог сможет выполняться на целевой архитектуре...

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

Правильно ли я понимаю, что код, генерируемый компилятором в основной системе ничем не отличается от кода уже установленных в основной системе пакетов

Курим что такое CHOST, CBUILD и CTARGET. А также чему они равны на хостовой системе и при кросскомпиляции.

Как выкуришь - ответ на вопрос уже у тебя будет

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

Курим что такое CHOST, CBUILD и CTARGET. А также чему они равны на хостовой системе и при кросскомпиляции.

Как выкуришь - ответ на вопрос уже у тебя будет

Неа, не будет.

Когда выполняется emerge - это у нас случай «Building Cross-Toolchain»

Value For Building Cross-Toolchain
CBUILD x86_64-pc-linux-gnu
CHOST x86_64-pc-linux-gnu
CTARGET arm-unknown-linux-gnu

А когда просто устанавливаются пакеты с tinderbox, у них

Value For «пакеты с tinderbox»
CBUILD undefined
CHOST undefined
CTARGET undefined

разница мне не ясна, и в руководстве не разъясняется.

--target is not relevant to any project which is not itself a compiler

Indaril_Shpritz
() автор топика
Последнее исправление: Indaril_Shpritz (всего исправлений: 3)
Ответ на: комментарий от Indaril_Shpritz

For consistency with the backward compatibility scheme..., when --host is specified but --build isn't, the build system is assumed to be the same as --host

CHOST=«x86_64-pc-linux-gnu»

Т.е. разницы всё-таки никакой. И можно делать так.

Но ты почему-то против.

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

CBUILD undefined
CHOST undefined
CTARGET undefined

Неправильно, кури дальше. Это не переменные, они не обязаны быть объявлены явно.

Pinkbyte ★★★★★
()
Ответ на: комментарий от Indaril_Shpritz

Т.е. разницы всё-таки никакой.

Нет. Кури дальше

Но ты почему-то против.

Упаси господь. Делай что угодно, только потом когда яйца себе отстрелишь, не обижайся на моё «я предупреждал»

И можно делать так.

Можно делать что угодно, но ты либо не достигнешь того, о чём писал, либо ты хочешь одного, а описываешь - совершенно другое.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte

Неправильно, кури дальше.

я ниже поправился.

CHOST=«x86_64-pc-linux-gnu»
устанавливается в файле make.conf

потом это всё передается в ./configure
там build делается равным host, т.е. тоже x86_64-pc-linux-gnu

А других компиляторов, которые бы не были заранее собраны при помощи crossdev я не знаю.

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Pinkbyte

либо ты хочешь одного, а описываешь - совершенно другое.

я хочу избежать компилирования там, где можно обойтись использованием уже скомпилированных пакетов с tinderbox.

Ну, может быть mono, java и python надо будет всё-таки собрать отдельно, если у них там есть JIT (и то насчет питона я сомневаюсь). Зато кучу других пакетов можно взять готовыми

И потом, JIT - это не повод (указывать CTARGET), потому что она работает в рантайме

Indaril_Shpritz
() автор топика
Последнее исправление: Indaril_Shpritz (всего исправлений: 2)

Давно было. Но через crosstool в gentoo любой пакет собирается через тот же emerge. Ничего указывать/прописывать не надо. Забыл порядок комманд, точно помню, что делается там все чуть ли не в 1 строчку.

--

Update

Припоминиаю, что комманде emerge надо лишь указать, что мы собираем пакет для целевой системы. А дальше emerge сам запускает уже собранный кросс-компилятор и собирает пакет в sysroot тулчейна. Меня тогда это сильно удивило, что сделали все так просто для людей.

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte

Т.е. разницы всё-таки никакой.

Нет. Кури дальше
Ты ... не достигнешь того, о чём писал

Почему? Что именно не получится?

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

Что именно не получится?

Что ты знаешь о переменных ROOT и EROOT и их использовании в ебилдах? Чему равно ROOT при сборке через crossdev? Чему равно ROOT в пакетах с tinderbox? Что будет если в систему ROOT=/ установить пакет с ROOT=/foo, проигнорировав данную переменную?

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

http://devmanual.gentoo.org/ebuild-writing/variables/
http://www.funtoo.org/Portage_Variables
http://www.gentoo.org/proj/en/gentoo-alt/prefix/techdocs.xml#doc_chap2

ROOT When not using ${D}, always prepend ${ROOT} to the path. If not defined, Portage will set ROOT to / by the time your ebuild executes. ROOT is used by stage1 builds to install to a sub-directory.

EROOT ${EROOT} is ${ROOT}${EPREFIX}

EPREFIX This variable is typically set in /etc/make.conf or make.globals. Prefix-aware ebuilds can use it.

В общем, EROOT и EPREFIX - глубоко вторичные штуки, поэтому сосредоточимся на рассмотрении ROOT.

Чему равно ROOT при сборке через crossdev?

там написано, что при сборке самого toolchain ROOT «not set — defaults to /»

так как конкретно пакеты тулчейна вызываются из основной системы, у них ROOT=/ а EPREFIX=sysroot (про EPREFIX - это я предполагаю)

Чему равно ROOT в пакетах с tinderbox?

/

Что будет если в систему ROOT=/ установить пакет с ROOT=/foo

он установится в корень, это же не EPREFIX.
Думаю, что в пакете вообще не указывается, какой был ROOT при сборке.
но я не вижу такую ситуацию
дальше собирать пакеты для target system мы-то уже будем в chroot-е, так что мне кажется, что с путями всё нормально.

Вот наоборот есть засада - пакеты тулчейна прийдется пересобрать с ROOT=sysroot и EPREFIX=/
для того, чтобы они правильно работали внутри chroot

то так как пакетов тулчейна мало, а всех пакетов много, то наверное будет экономия на времени сборки

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

так как конкретно пакеты тулчейна вызываются из основной системы, у них ROOT=/ а EPREFIX=sysroot (про EPREFIX - это я предполагаю)

Правильный ответ - ROOT=/, ERPEFIX - пустой

Вот наоборот есть засада - пакеты тулчейна прийдется пересобрать с ROOT=sysroot и EPREFIX=/для того, чтобы они правильно работали внутри chroot

Не надо ничего пересобирать. Собираешь crossdev-ом нужный тебе софт в /usr/CHOST, где CHOST - известно что. Собираешь с FEATURES=«buildpkg»

А потом делаешь так ROOT=«/your/shiny/chroot» CHOST-emerge -K софт_который_тебе_нужен. И в /your/shiny/chroot получаешь чистый чрут без зависимостей времени сборки.

Вот видишь - почитал маны и кое-что уже понял, по крайней мере часть вопросов у тебя отпала.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 3)
Ответ на: комментарий от Pinkbyte

Вот видишь - почитал маны и кое-что уже понял

я рад, что у тебя понимание повысилось, а знания освежились

по крайней мере часть вопросов у тебя отпала

1) был вопрос - надо ли пересобирать все пакеты (отличные от crosstoolchain) в папку sysroot (=/usr/CHOST)
(особенно учитывая, что они ничем не отличаются от пакетов, которые лежат на tinderbox)
почему бы их просто туда не установить бинарно?

на этот вопрос ответа нет. Я сказал, что кжется можно, ты сказал, что нельзя, я попросил обяъснить, ты задал вопросы, я ответил на вопросы и неясность повисла в воздухе на твоей стороне.

Не надо ничего пересобирать.

это высказывание, как я понял, относится только к тулчейну.

2) будет ли работать crosstoolchain в chroot по этому сценарию, как будто бы он обыкновенный тулчейн?

Я думаю, что нет, но ты говоришь, что всё ок. Не верится.

А на самом деле ты предлагаешь собирать не в chroot, а как прописано в руководстве, используя команды эпического вида
CHOST-emerge

Твой вариант бесспорно будет работать, но для его использования прийдется сначала собирать все пакеты в /usr/CHOST (так написано в руководстве, да и ты сам пишешь «Собираешь crossdev-ом нужный тебе софт в /usr/CHOST». У меня весь @world - нужный) и тратить на это кучу времени, вместо того, чтобы скачать готовые .tbz2 с thunderbox

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

Я думаю, что нет, но ты говоришь, что всё ок

Я такого не говорил. Читай внимательно - я говорил о тулчейне внутри /usr/CHOST. Куски которого у тебя всё равно потянутся чем-либо.

надо ли пересобирать все пакеты (отличные от crosstoolchain) в папку sysroot (=/usr/CHOST)

Что значит надо ли пересобирать? Ты их УЖЕ туда собирать будешь.

Твой вариант бесспорно будет работать, но для его использования прийдется сначала собирать все пакеты в /usr/CHOST (так написано в руководстве, да и ты сам пишешь «Собираешь crossdev-ом нужный тебе софт в /usr/CHOST». У меня весь @world - нужный) и тратить на это кучу времени, вместо того, чтобы скачать готовые .tbz2 с thunderbox

Ээээ... Ничего не понял. Что мешает подключить tinderbox в конфиг crossdev-а, при условии что набор USE-флагов будет идентичный?

Похоже я поторопился - понимания о том, как работает crossdev и чем он отличается от простого emerge(хинт - практически ничем) у тебя не прибавилось.

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

понимания о том, как работает crossdev ... у тебя не прибавилось.

Это потому что видно, что ты не умеешь качественно писать документацию. Если бы умел, ты бы не использовал заместительные местоимения, которые снижают понимаемость.

Что значит надо ли пересобирать? Ты их УЖЕ туда собирать будешь.

Пример: Что значит УЖЕ?

Что мешает подключить tinderbox в конфиг crossdev-а

например то, что ты не ответил на вопрос - сколько вообще всего конфигов используется - два или три.

Первый кофиг - исходный конфиг машины
Второй конфиг - конфиг для сборки crosstoolchain и дубликатов пакетов
Третий конфиг - конфиг для сборки пакетов для target system

мне кажется, что первый и второй конфиг - это один и тот же конфиг. И тут я узнаю, что есть четвертый конфиг, который ты называешь «конфиг crossdev-а»

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

Это потому что видно, что ты не умеешь качественно писать документацию.

Сюрприз - я не имею никакого отношения к этому документу. Но я прекрасно понимаю, о чём там пишется.

Второй конфиг - конфиг для сборки crosstoolchain и дубликатов пакетов

Это решается опциями командной строки при инициализации нового CHOST.

например то, что ты не ответил на вопрос - сколько вообще всего конфигов используется - два или три.

Ты вообще открывал /usr/${CHOST}? Если да, то должен быть увидеть /usr/${CHOST}/etc/portage

К чему он относится, как ты думаешь?

Кстати в тех доках по ссылке это описано, да

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

А можно ли не устанавливать /usr/$CHOST вообще? Взять и просто скомпилировать .tbz2-пакеты, входящие в cross-toolchain, а потом бинарно установить их в chroot (а всё остальное бинарно с tinderbox). А потом переместиться в chroot и оттуда выполнять кросскомпиляцию для target system

Это было бы более логично / привычно (по аналогии с установкой базовой системы)

Indaril_Shpritz
() автор топика
Последнее исправление: Indaril_Shpritz (всего исправлений: 3)
Ответ на: комментарий от Indaril_Shpritz

А можно ли не устанавливать /usr/$CHOST вообще?

Нет. Простейший пример почему:

0) ставишь FEATURES=«buildpkgonly», чтоб ничего не ставить, а только создавать бинарные пакеты при сборке;
1) тебе нужно приложение foo, которое линкуется с библиотекой bar;
2) CHOST-emerge foo зафэйлится, потому что он соберет bar и не установит, а только сделает бинарный пакет. И на этапе линковки билдсистема foo соснёт.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Indaril_Shpritz

Взять и просто скомпилировать .tbz2-пакеты, входящие в cross-toolchain, а потом бинарно установить их в chroot

Пакеты из cross-toolchain имеют другие настройки и другую категорию в portage - поставив их в чрут ты поставишь туда cross-toolchain, а не нативный.

Нативный тулчейн, пригодный для чрута можно собрать в /usr/CHOST через CHOST-emerge.

Возвращаемся к тезису toolchain canadian cross, о которым ты судя по всему не читал.

А потом переместиться в chroot и оттуда выполнять кросскомпиляцию для target system

Кстати ты уже решил как ты будешь чрутиться в систему с другой архитектурой? Например из amd64 в arm... Я то знаю что это возможно и знаю как это делается...

Это было бы более логично / привычно (по аналогии с установкой базовой системы)

Вот только кросс-компиляция этим и отличается от нативной. Что там не всё так просто. Гугли опять же упоротый canadian cross

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

пример не релевантен предлагаемому мной сетапу.
Ты просто даешь ответы, как будто говоришь про дефалтовый сетап.
Еще ты chroot-ом называешь target dir
а я предполагаю выполнить chroot в sysroot

Поэтому

как ты будешь чрутиться в систему с другой архитектурой?

не нужно мне это, потому что архитектура для базовой машины и sysroot совпадает.

поставив их в чрут ты поставишь туда cross-toolchain, а не нативный

именно этого я и хочу добиться.

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Pinkbyte

ты уже решил как ты будешь чрутиться в систему с другой архитектурой? Например из amd64 в arm... Я то знаю что это возможно и знаю как это делается

Я не знаю, как делается конкретно chroot, но ничто не мешает мне записать target dir на виртуальный диск и запустить в qemu

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

именно этого я и хочу добиться.

Ну тогда проблем нет. Я думал ты нативный тулчейн другой архитектуры хочешь получить, а не кросс-тулчейн

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