Ac100 gentoo cross compile firefox
Сборка firefox под gentoo для ac100 при помощи crossdev
В этой статье фактически описывается инструкция по настройке сборочного окружения, в конце статьи есть небольшой траблшутинг. На AMD x6 1100T сам процесс компиляции исходников firefox занимает меньше 15 минут, но подготовка окружения для компиляции может занять много долгих часов. Эта статья поможет сократить время подготовки тулчейна тем, кто решится использовать собственную сборку любимого браузера.
Для гуру: не поленитесь дать советы по упрощению процесса подготовки тулчейна или поделитесь рабочим ебилдом для сборки фф кросскомпиляцией
Подготовка toolchain
Установите crossdev. Окружение для сборки собирается обычным способом (я использую те же версии, что установлены в нетбуке, кроме binutils ).
~# crossdev --b 2.22-r1 --g 4.7.1 --l 2.15-r1 --target armv7a-hardfloat-linux-gnueabi
На время работы crossdev отключите репы layman, закоментарив в /etc/make.conf строку source /var/lib/layman/make.conf
Измените CFLAGS в /usr/armv7a-hardfloat-linux-gnueabi/etc/portage/make.conf
CFLAGS="-O2 -pipe -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard -fomit-frame-pointer"
и, возможно
MAKEOPTS="-j7"
Также нужно создать симлинк на исходники ядра:
~# mkdir -p /usr/armv7a-hardfloat-linux-gnueabi/usr/src ~# ln -s /path/to/ac100-kernel-source /usr/armv7a-hardfloat-linux-gnueabi/usr/src/linux
Устанавливать пакеты придется в 3 этапа:
1) Для указанного ниже .mozconfig требуется установить следующие пакеты со всеми зависимостями (кроме dev-lang/python и app-admin/python-updater):
~# armv7a-hardfloat-linux-gnueabi-emerge media-libs/fontconfig ~# armv7a-hardfloat-linux-gnueabi-emerge media-libs/alsa-lib ~# armv7a-hardfloat-linux-gnueabi-emerge media-libs/libpng ~# armv7a-hardfloat-linux-gnueabi-emerge virtual/jpeg ~# armv7a-hardfloat-linux-gnueabi-emerge x11-proto/xcb-proto # требует dev-lang/python, собираем все зависимости до dev-lang/python, после отвала по ошибке запускаем с ключом -O ~# armv7a-hardfloat-linux-gnueabi-emerge -O x11-proto/xcb-proto ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libX11 ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXext ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXt
~ # armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXi ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXrender ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXrandr
~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXcomposite ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/libXcursor
~# armv7a-hardfloat-linux-gnueabi-emerge media-libs/mesa # не соберется но установит все зависимости, игнорируем ошибку и ставим следующие пакеты
2) С развернутой на нетбуке системы потребуются пакеты (x11-libs/gtk+:2 dev-libs/glib x11-libs/cairo x11-libs/pango media-libs/mesa x11-libs/gdk-pixbuf dev-libs/atk dev-libs/dbus-glib dev-libs/nss):
~# armv7a-hardfloat-linux-gnueabi-emerge -GO dev-libs/glib ~# armv7a-hardfloat-linux-gnueabi-emerge -GO x11-libs/gtk+:2 ~# armv7a-hardfloat-linux-gnueabi-emerge -GO x11-libs/cairo ~# armv7a-hardfloat-linux-gnueabi-emerge -GO x11-libs/pango ~# armv7a-hardfloat-linux-gnueabi-emerge -GO media-libs/mesa ~# armv7a-hardfloat-linux-gnueabi-emerge -GO x11-libs/gdk-pixbuf ~# armv7a-hardfloat-linux-gnueabi-emerge -GO dev-libs/atk ~# armv7a-hardfloat-linux-gnueabi-emerge -GO dev-libs/dbus-glib ~ # armv7a-hardfloat-linux-gnueabi-emerge -GO dev-libs/nss
3) Некоторые пакеты можно собрать только, если установлены зависимости пункта 2 (sys-apps/dbus x11-libs/pixman) ~# armv7a-hardfloat-linux-gnueabi-emerge sys-apps/dbus ~# armv7a-hardfloat-linux-gnueabi-emerge x11-libs/pixman
Теперь нужно скопировать /usr из ventana_nv-tegra_base_R15.1.0_armhf.tbz2 в /usr/armv7a-hardfloat-linux-gnueabi, файлы объявлений и библиотеки потребуются позже для нормальной линковки с EGL.
Загрузка копии исходных кодов firefox
Основной источник информации https://developer.mozilla.org/En/Developer_Guide/Source_Code/Mercurial#Bundles
Проверим свободное место на диске (здесь описывается работа с исходниками в директории /tmp), требуется около 4Гб, 1,7Гб - исходники с мозиллы, их размер удвоится после запуска конфигуратора, плюс продукты компиляции:
~# df |grep tmp none 12582912 72 12582840 1% /tmp
Установка aurora ветки:
~# cd /tmp /tmp # hg clone http://hg.mozilla.org/releases/mozilla-aurora/ mozilla-aurora /tmp # cd /tmp/mozilla-aurora
Конфигурация
Основные моменты описаны здесь и здесь. Многие пакеты (perl, python, а также те, для которых нет возможности отключить тесты кода для целевой системы) нельзя собрать в тулчейне без хардкора, поэтому их можно взять с уже развернутой на нетбуке генты (командой quickpkg). tbz архивы находятся в /usr/portage/packages. Содержимое /usr/portage/packages с нетбука скопировать в тулчейн /usr/armv7a-hardfloat-linux-gnueabi/packages сохранив иерархию директорий. А затем установить в тулчейн командой
~# armv7a-hardfloat-linux-gnueabi-emerge -GO имя_пакета
Ключ -O заставит emerge ставить пакет не глядя на зависимости. Для сборки firefox по-сути нужны только файлы хедеров и либы.
Подготовьте файл .mozconfig со следующим содержимым: CROSS_COMPILE=1 mk_add_options MOZ_MAKE_FLAGS="-j8" ac_add_options --enable-optimize --disable-debug ac_add_options --disable-tests ac_add_options --disable-updater ac_add_options --target=armv7a-hardfloat-linux-gnueabi ac_add_options --host=x86_64-pc-linux-gnu ac_add_options --build=x86_64-pc-linux-gnu ac_add_options --disable-necko-wifi ac_add_options --disable-webrtc ac_add_options --disable-pedantic ac_add_options --disable-glibtest ac_add_options --disable-elf-hack ac_add_options --disable-glibtest ac_add_options --disable-gconf ac_add_options --enable-application=browser ac_add_options --disable-accessibility ac_add_options --disable-libnotify ac_add_options --with-system-zlib ac_add_options --with-system-jpeg ac_add_options --with-system-png ac_add_options --with-system-nss
ac_add_options --with-thumb=yes ac_add_options --with-arch=armv7-a ac_add_options --with-fpu=vfpv3-d16 ac_add_options --with-float=hard ac_add_options --prefix=/usr/armv7a-hardfloat-linux-gnueabi ac_add_options --x-libraries=/usr/armv7a-hardfloat-linux-gnueabi/usr/lib ac_add_options --with-glib-prefix=/usr/armv7a-hardfloat-linux-gnueabi/usr/lib ac_add_options --enable-webgl ac_add_options --disable-parental-controls ac_add_options --enable-default-toolkit=cairo-gtk2 export PKG_CONFIG_PATH=/usr/armv7a-hardfloat-linux-gnueabi/usr/lib/pkgconfig
Задайте путь к .mozconfig через переменную окружения MOZCONFIG и запустите подготовку конфигов /tmp/mozilla-aurora # export MOZCONFIG=/mnt/sda4/ac100/cross/.mozconfig /tmp/mozilla-aurora # make -f client.mk configure
Теперь ключевой момент:
создаваемый конфигуратором obj-x86_64-unknown-linux-gnu/config/autoconf.mk указывает пути хост-системы там, где должны быть пути целевой.
Следующий скрипт исправляет ситуацию:
#!/bin/bash targetfs=/usr/armv7a-hardfloat-linux-gnueabi FILE=/tmp/mozilla-aurora/obj-x86_64-unknown-linux-gnu/config/autoconf.mk echo "Relocating $FILE to use $targetfs..." sed -i "s#\(-I/usr/lib\)#-I$targetfs/usr/lib#g" $FILE sed -i "s#\(-I/usr/include\)#-I$targetfs/usr/include#g" $FILE sed -i "s#\(-R/usr/lib\)#-R$targetfs/usr/lib#g" $FILE sed -i "s#\(-L/usr/lib\)#-L$targetfs/usr/lib#g" $FILE echo "done"
После конфигуратора запускаем скрипт правки путей:
/tmp/mozilla-aurora # /mnt/sda4/ac100/cross/fix_autoconf_firefox.sh
Сборка
Запускаем сборку:
/tmp/mozilla-aurora # make -f client.mk build
Если все прошло удачно, то запускаем сборку пакета:
/tmp/mozilla-aurora # make -f client.mk package
Пакет tar.bz2 будет в /tmp/mozilla-aurora/obj-x86_64-unknown-linux-gnu/dist
Если что-то пошло не так и хотите удалить уже откомпилированное, то выполните:
/tmp/mozilla-aurora # make -f client.mk clean
Резюме
Директория с исходниками - /tmp/mozilla-aurora Файл с конфигом - /mnt/sda4/ac100/cross/.mozconfig
# export MOZCONFIG=/mnt/sda4/ac100/cross/.mozconfig # указываем конфиг # cd /tmp/mozilla-aurora # make -f client.mk configure &>/tmp/firefox.log # запускаем конфигуратор # make -f client.mk clean &>/tmp/firefox.log # чистим остатки предыдущей сборки, если необходимо # /mnt/sda4/ac100/cross/fix_autoconf_firefox.sh # правим пути # time make -f client.mk build &>/tmp/firefox.log # сборка # make -f client.mk package &>/tmp/firefox.log # финальный аккорд
Пакет tar.bz2 будет в /tmp/mozilla-aurora/obj-x86_64-unknown-linux-gnu/dist
Проблемы
Не находит файлы на этапе компиляции Установить пакеты с нужными файлами из target-системы Например: /tmp/mozilla-aurora/xpcom/base/nsSystemInfo.cpp:16:21: фатальная ошибка: gtk/gtk.h: Нет такого файла или каталога Запускаем в хост системе ~# qfile -v gtk.h x11-libs/gtk+-2.24.10-r1 (/usr/include/gtk-2.0/gtk/gtk.h) x11-libs/gtk+-3.4.3 (/usr/include/gtk-3.0/gtk/gtk.h) Устанавливаем x11-libs/gtk+:2 (в .mozconfig явно задано использование gtk+ версии 2):
~# armv7a-hardfloat-linux-gnueabi-emerge -GO x11-libs/gtk+:2
Linker “ld: cannot find /lib/libpthread.so.0?
решение с http://xc0ffee.wordpress.com/2011/04/28/linker-%E2%80%9Cld-cannot-find-liblibpthread-so-0%E2%80%B3/
Проблема связана с тем, что в /usr/armv7a-hardfloat-linux-gnueabi/usr/lib/libpthread.so указаны абсолютные пути, а нам надо чтоб пути брались из окружения. Т.е. необходимо исправить
GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )
на
GROUP ( libpthread.so.0 libpthread_nonshared.a )
Проблемы с BFD Установить последний binutils ~# crossdev --b 9999 ...