Кросскомпиляция Gentoo для Windows

Собственно сабж. Хочу сделать stage1, в который смогу chroot`нуться цигвином и собрать полную генту. Не спрашивайте, зачем оно мне, считайте, что я извращенец. Как мне это сделать?
Уже смог собрать тулцейн с помощью crossdev -t i386-pc-mingw32. В /etc/make.conf сделал ROOT="/win"; CHOST="i386-pc-mingw32", CBUILD="i686-pc-linux-gnu". Делаю emerge -av system. Сборка прерывается на bzip2, пишет:

Цитата:
bzip2.c:1: предупреждение: ключ -fPIC проигнорирован для целевой машины (весь код позиционно-независимый)
bzip2.c:132:25: error: sys\stat.h: Нет такого файла или каталога
bzip2.c: В функции ‘cleanUpAndFail’:
bzip2.c:749: ошибка: размер ‘statBuf’ в памяти неизвестен
bzip2.c:760: предупреждение: неявная декларация функции ‘_stat’
bzip2.c:749: предупреждение: неиспользуемая переменная ‘statBuf’
bzip2.c: В функции ‘notAStandardFile’:
bzip2.c:1043: ошибка: размер ‘statBuf’ в памяти неизвестен
bzip2.c:1047: ошибка: ‘_S_IFREG’ не описан (первое использование в этой функции)
bzip2.c:1047: ошибка: (Сообщение о неописанном идентификаторе выдается один раз
bzip2.c:1047: ошибка: для каждой функции, в которой он используется.)
bzip2.c:1043: предупреждение: неиспользуемая переменная ‘statBuf’
bzip2.c: В функции ‘countHardLinks’:
bzip2.c:1060: ошибка: размер ‘statBuf’ в памяти неизвестен
bzip2.c:1060: предупреждение: неиспользуемая переменная ‘statBuf’
bzip2.c: В функции ‘compress’:
bzip2.c:1197: ошибка: размер ‘statBuf’ в памяти неизвестен
bzip2.c:1245: ошибка: ‘_S_IFDIR’ не описан (первое использование в этой функции)
bzip2.c:1197: предупреждение: неиспользуемая переменная ‘statBuf’
bzip2.c: В функции ‘uncompress’:
bzip2.c:1380: ошибка: размер ‘statBuf’ в памяти неизвестен
bzip2.c:1424: ошибка: ‘_S_IFDIR’ не описан (первое использование в этой функции)
bzip2.c:1380: предупреждение: неиспользуемая переменная ‘statBuf’
bzip2.c: В функции ‘testf’:
bzip2.c:1575: ошибка: размер ‘statBuf’ в памяти неизвестен
bzip2.c:1604: ошибка: ‘_S_IFDIR’ не описан (первое использование в этой функции)
bzip2.c:1575: предупреждение: неиспользуемая переменная ‘statBuf’
make: *** [all] Ошибка 1

Может я что-то делаю не так? Как правильно сделать стейдж1? /usr/portage/scripts/bootstrap.sh останавливается на ncurses:

Цитата:
configure: error: Shared libraries are not supported in this version

может быть man

может быть man prefiks-portage поможет ?

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Нет такого мана. А также

Нет такого мана. А также prefix-portage и prefics-portage. А что я должен там интересного прочитать?

http://www.gentoo.org/proj/en

http://www.gentoo.org/proj/en/gentoo-alt/prefix/

Не оно ?

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

блин, как всегда. Хочешь

блин, как всегда. Хочешь сделать что-то новое, а оно уже есть. На досуге поковыряю prefix.
А может всё-таки можно как-нибудь самомц собрать stage1 для cygwin?

Подскажите, пожалуйста, я

Подскажите, пожалуйста, я могу с помощью префиксов поставить самую свежую сборку Дженту внутри РедХатЕнтерпрайз 5.0 с пользовательскими правами? Эти префиксы это именно то, что я подумал?

Да на оба вопроса

Да на оба вопроса

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Ещё у cygwin/mingw есть милые

Ещё у cygwin/mingw есть милые такие ошибки "error 0: cygwin heap error", если собирать под виндой (кросс мингв работает более правильно).

Типа такой хрени получилось,

Типа такой хрени получилось, когда я пытался собрать подл цигвином питон 2.6 для запуска emerge. Тогда я расковырял stage3, посмотрел, какие там пакеты и поставил цигвин с этими пакетами. Затем выдернул все файлы пакета portage, положил в цигвин и попытался запустить. Но т.к. там был питон 2.5, то emerge не запустился. После этого я забил на идею сборки этого под виндой.

мануал по Gentoo prefix alt:

мануал по Gentoo prefix alt: http://mirror2.corbina.ru/gentoo-distfiles/experimental/prefix/x86-interix/20091013/gpx-installation-20091013.pdf

там же где-то рядом лежал и iso. В процессе установки ставится interix/SUA, то есть потом собирается через MSVC и gcc-подобный враппер в составе SUA.

Можно попробовать повозиться с cygwin по аналогии с ним.

ну emerge из состава kde4 под

ну emerge из состава kde4 под виндой работает. Питон вот ХЗ, как собирается cygwin-ом, раз, и ХЗ, насколько он POSIX-зависимый, два.
Кстати, у пакетов есть неявные зависимости "по умолчанию" в профиле : gcc, glibc, linux-headers/freebsd-ubin, и т.п. Если бы даже 1) python заработал 2) emerge заработал 3) то с зависимостями от glibc/linux-headers, ты под виндой скорее всего обломался бы.

Поэтому, нужно нормально портировать профиль, например как в alt prefix.

>bzip2.c:132:25: error:

>bzip2.c:132:25: error: sys\stat.h: Нет такого файла или каталога

во-первых, не cygwin-ом, а mingw-ом (у него зависимостей меньше).
Во-вторых, ты себе хорошо представляешь, что происходит при сборке crossdev-ом stage1, и как собирается stage1 при установке Генту?
Например, где ищется этот sys\stat.h, каким компилятором и с каким ядром\тулчейном он собирается?

Если ты полезешь собирать mingw-ом stage1 от Генту, как mingw должен собирать ядро и libc?

В процессе отработки crossdev -t i686-pc-mingw32 происходит:
1. сборка целевых кросс (запускается под linux, генерит код под windows) binutils
2. сборка кросстулчейна gcc (запускается под линукс, генерит код под windows), используя собранные binutils из этапа 1
3. сборка c runtime library, настройка headers, libs -- целевых, для windows
4. создание оверлея /usr/local/crossdev/cross-i686-pc-mingw32. Собственно, binutils, gcc и crt собираются как ссылки вида cross-i686-pc-mingw32/{binutils,gcc,w32api} в /usr/portage/sys-devel/gcc из этого оверлея, обычным emerge (из базовой системы в целевую).
5. создание и настройка SYSROOT каталога: /usr/i686-pc-mingw32 который представляет собой chroot целевой системы. Естественно, прямо chroot туда сделать ты не сможешь, ибо там лежат PE Win32 бинарники, а не линуксовые ELF.
6. создание и настройка врапперов и ссылок: i686-pc-mingw32-gcc, i686-pc-mingw32-emerge, emerge-i686-pc-mingw32. После этого можешь собирать целевым кросскомпилятором или делать emerge через обёртку (соберётся целевым кросскомпилятором, установится в SYSROOT).

Сформулируй чётче конечный результат, который ты хочешь получить.
а) mingw-ом (из под линукс, кросскомпилятор или wine/virtualbox) собрать линукс ядро stage1 из gentoo
б) собрать кросстулчейн mingw и собирать пакеты под windows этим кросстулчейном

Ясно, что б) гораздо проще чем а), и а) в общем случае невыполнимо -- потому что stage1 линукс ядро POSIX, а mingw c c runtime library и w32api хедерами -- не совсем.

Хотя mingw и притворяется что он POSIX (pthreads, и т.п.), но по идее чтобы софт собрался в целевой мингв SYSROOT нужно софт нормально портировать. Это включает в себя настройку профиля в SYSROOT, патчи и исправленные ебилды в оверлее cross-i686-pc-ming32.

Если посмотреть в profile сгенерированного sysroot (bashrc, make.conf, make.profile) -- видно, что он просто игнорирует все BUILD time зависимости по пакетам и пытается собирать базовым кросс/тулчейном в целевую систему.

В общем случае, всё зависит от конкретного пакета.
Например, мы хотим собрать под винду app-misc/hello. Зависимостей минимум, поэтому i686-pc-mingw32-emerge app-misc/hello нормально соберёт и установит в SYSROOT hello.exe. (При настройках по умолчанию ещё и бинарный .tbz2 пакет сделает)

Сложнее будет, если захотим собрать например, qutim (кросскомпилятором в целевую windows). Из runtime зависимостей потребуется qt (x11-libs/qt), но эта qt должна быть собрана под win32, GDI/DirectX а не под x11/win32/Xmingw. То есть, в общем случае, надо бы портировать x11-libs/qt и подпакеты, добавить USE флаг win32 в кросс оверлей, поправить ебилды в кросс оверлее, чтобы собиралось так же, как собиралось ручками при кросскомпиляции. Потом поправить профиль в кросс SYSROOT, чтобы USE win32 включался для профиля по умолчанию. То есть надо бы портировать x11-libs/qt и все остальные runtime зависимости на mingw/win32.

Или, забить на portage и собирать кросс компилятором через paludis. В paludis есть importare, которая может сделать пакет из просто собранного ручками.

Сложности с оверлеем меня не

Сложности с оверлеем меня не пугают. Изначально идея родилась так. Мне нужно собрать под винду, скажем, Rhythmbox. У него куча зависимостей, типа gstreamer, gtk и подобное. Всё это работает на винде. А сам римбокс не портирован. Я бы хотел, чтобы портейдж собрал все зависимости и саму программу с моим минимальным участием. Грубо говоря, я бы хотел прикрутить portage к MinGW/MSYS, чтобы легко устанавливать нужные программы. Я собираю я это всё в чруте в stage3 на ubuntu на моём нетбуке.

> Я бы хотел, чтобы портейдж

> Я бы хотел, чтобы портейдж собрал все зависимости и саму программу с моим минимальным участием. Грубо говоря, я бы хотел прикрутить portage к MinGW/MSYS, чтобы легко устанавливать нужные программы.

я тоже пытаюсь осилить аналогичное -- чтобы из гентушного emerge или paludis собирать пакеты под винду или под Haiku. Получается, более-менее.
Вот что я сделал:
1. ставим crossdev, ставим crossdev-ом mingw: crossdev -t i686-pc-mingw32
2. Смотрим в сгенерированный профиль: /usr/i686-pc-mingw32/etc/{make.conf,bashrc}
3. ставим пакеты сгенерированным враппером: i686-pc-mingw32-emerge XXX/YYY
что-то с минимумом зависимостей ставится без проблем; что-то нужно портировать.
4. портируем отдельный софт

Проблемой emerge, на мой взгляд, является то, что невозможно задать из какого конкретного оверлея брать пакет. Он берёт из gentoo tree, враппером запускает emerge с нужными CHOST/SYSROOT и т.п. и пытается его собрать. По идее, все системно-зависимые настройки должны идти в профиль -- аналогично тому, как собирается FreeBSD/Gentoo: см. use-флаги elibc_gnulibc, elibc_FreeBSD. То есть, кроссемёрдж должен брать старый ебилд, запускать его с нужным окружением и с прописаным в профиле use=mingw32 , например, по умолчанию; потом проверять, есть ли в профиле патч под нужный пакет, и накладывать его если надо.

То есть, максимально повторно использовать оригинальные ебилды, а все настройки целевой системы запихнуть в профиль.
На практике, не особо получается обойтись без исправления ебилдов. Paludis пользоваться удобнее для этой цели: просто ложим в оверлей и собираем из конкретного оверлея, задав атом пакета вида =категория/пакет:слот::наш_кроссоверлей. Плюс, тулчейн проще ставить через importare и installed-unpackaged (хотя для мингва всё равно, собирается vanilla gcc, в Хайку свой патченный gcc 4.3.4 , свои binutils и свой ELF формат -- а хотелось бы поэкспериментировать с разным тулчейном, с clang/gcc/gcc4.5, и т.п.)
Ещё, в блоге ciaranm или в planet paludis что-то было про его специфический distrubuted workflow в exherbo: синкаем палудисом "глобальные" репозитории (оверлеи), синкаем локальные из глобальных, компиляем/тестируем/патчим ебилды в локальных репо, потом, когда всё уже готово, пушим в глобальные из локальных, выкладываем "наружу".
То есть, workflow, аналогичный staged trees или subsystem maintainers в Linux ядре -- патч проходит через несколько репозиториев, каждый по-своему стабильный/нестабильный/протестированный.

На http://en.gentoo-wiki.com/wiki/Paludis/Cross-compiling есть информация, как настроить paludis для кросссборки. В общем-то, аналогично скрипту crossdev и cross-emerge, только делается это всё не в скрипте отдельном, а в /etc/paludis/bashrc, и там проверяется, какой stage из этапов crossdev мы собираем, задаются ключи и окружение руками, чтобы paludis потом собрал то, что нужно.
Аналога cross-emerge я не нашел -- но можно написать самому. В paludis можно задать профиль отдельно, и указывать его через -E , paludis --environment=/usr/i686-pc-mingw32/etc/paludis , указывать, что пакеты брать нужно из конкретного оверлея (аналогичного crossdev, который создаётся скриптом crossdev)

правда, непонятно, как запустить сборку по отдельным фазам, аналог ebuild.sh unpack configure compile install qmerge clean. ЕМНИП, есть в paludis ключ "остановиться после такой-то фазы".

В целом, сборка из базовой генты в целевую винду/хайку -- это вполне себе реальность. Только софт надо портировать по-нормальному, -- поэтому, отдельный оверлей/репозиторий, патчи, тестирование, свой профиль в пакетный менеджер.

> В /etc/make.conf сделал

> В /etc/make.conf сделал ROOT="/win"; CHOST="i386-pc-mingw32", CBUILD="i686-pc-linux-gnu"

в /etc/make.conf базовой системы (тогда это неправильно) или в SYSROOT целевой (тогда всё правильно, но обертка над cross-emerge вида emerge-i386-pc-mingw32 это и так сделает автоматически) ?

Ещё, если ты хочешь собирать

Ещё, если ты хочешь собирать mingw'ом/cygwin'ом из-под винды (не советую, mingw как кросскомпилятор работает стабильнее), может пригодиться coLinux (usermode linux, запускающийся из-под винды). Ставишь в винду coLinux, ставишь в coLinux gentoo, потом настраиваешь сборку целевой win системы из этой генту в винду, собираешь избранные пакеты, тестируешь. Костылей куча, но протестировать порты под винду очень просто: или пакет запускается в "нативной" винде, или в coLinux gentoo.

> Хочу сделать stage1, в

> Хочу сделать stage1, в который смогу chroot`нуться цигвином и собрать полную генту. Не спрашивайте, зачем оно мне, считайте, что я извращенец. Как мне это сделать?
Уже смог собрать тулцейн с помощью crossdev -t i386-pc-mingw32. В /etc/make.conf сделал ROOT="/win"; CHOST="i386-pc-mingw32", CBUILD="i686-pc-linux-gnu".

Уточню вопрос: то есть, ты хочешь собрать а) целевую линукс генту из базовой родной винды/cygwin/mingw? б) целевую виндоус генту из базовой родной линукс генту?

Если а), это какой-то костыль, но можно провозиться с кросскомпилятором. Если б), то ты непременно уткнёшься в неполную POSIX поддержку винды, то есть софт надо будет под винду портировать (ложить ебилды в кросс оверлей, писать патчи, добавлять патчи в ебилды, поправить профиль кросс емёрджа, чтобы он собирал с нужными патчами по умолчанию).
Это возможно сделать, но надо будет повозиться с портированием и кросс профилем. Радует, что crossdev -t ...-mingw32 сделал половину работы с оверлеем и профилем, и остаётся только прописать правильный целевой SYSROOT=/usr/i686-pc-mingw32 в ~/.bashrc, и собирать кросс емёрджем i686-pc-mingw32-emerge blablabla.

Alt prefix win написан под Interix, то есть, MS версию gcc и обёртку над cl вида gcc. Там наверно портировали большинство софта, вопрос только как именно, как x11 через Xmingw или как полноценный Win32 порт.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".