LINUX.ORG.RU

Собираем Portable Firefox

 ,


0

2

Привет! Я научился собирать портабельную версию Firefox, но у меня ещё остались вопросы.

Итак, официальная сборка компилируется в билд-ферме на базе CentOS 6. Я же использую билд-ферму на базе CentOS 5, и вот моя сборка. Для этого дистра доступен волшебный GCC 4.8, с которым, что бы ты ни скомпилировал, оно потом требует C++ Runtime от GCC 4.1. Понятия не имею как это работает.

Всезнающие гуру! Подскажите как сделать мою сборку ещё лучше!

1). Через что работает HTML5 Video? Через Gstreamer, или что?

2). В официальной сборке Firefox это 75 файлов, в моей - 13 тысяч файлов. Это охренеть. Я обнаружил в официальной сборке - файл removed-files со следующим содержимым:

distribution/extensions/testpilot@labs.mozilla.com.xpi
chrome/
#ifndef XP_MACOSX
chrome/icons/
chrome/icons/default/
#endif
chrome/overlayinfo/
components/
defaults/autoconfig/
defaults/profile/
defaults/profile/chrome/
defaults/profile/US/*
defaults/profile/extensions/
defaults/profile/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/*
distribution/
distribution/extensions/
extensions/
extensions/inspector@mozilla.org/*
extensions/reporter@mozilla.org/*
extensions/talkback@mozilla.org/*
extensions/testpilot@labs.mozilla.com/*
extensions/{641d8d09-7dda-4850-8228-ac0ab65e2ac9}/*
extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/*
greprefs/
jssubloader/
modules/
searchplugins/*
webapprt/components/

Удалил эти файлы в своей сборке (именно в директории chrome были эти десятки тысяч файлов). Иии... сборка просто не стартует.

3). Как сделать чтобы моя сборка сама обновлялась? Куда в исходнике вписать мою URL-ку с новыми сборками Firefox? Как расположить файлы на хостинге?

4). Директории какие-то непонятные появляются:

gmp-fakeopenh264
gmp-clearkey
gmp-fake

Но я сравнивал параметры сборок - официальной и моей - что именно собрало мне это - я не понимаю. Пробовал --disable-tests - не помогло.

Как же сделать мою сборку максимально идентичной? Может поможете найти ту самую билд-ферму и её конфиги? Поиск моих вопросов в Google нашёл лишь общую информацию (1, 2).

Содержимое about:buildconfig будут в комментах.

★★★★★

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

Официальная сборка

about:buildconfig
Source

Built from https://hg.mozilla.org/releases/mozilla-esr45/rev/e5083d8a855a12f5f35e8245737...
Build platform
target
x86_64-unknown-linux-gnu
Build tools
Compiler Version Compiler flags
/builds/slave/m-esr45-l64-000000000000000000/build/src/gcc/bin/gcc 4.7.3 -Wall -Wempty-body -Wpointer-to-int-cast -Wsign-compare -Wtype-limits -Werror=char-subscripts -Werror=comment -Werror=endif-labels -Werror=enum-compare -Werror=ignored-qualifiers -Werror=int-to-pointer-cast -Werror=multichar -Werror=nonnull -Werror=pointer-arith -Werror=pointer-sign -Werror=return-type -Werror=sequence-point -Werror=trigraphs -Werror=uninitialized -Werror=unknown-pragmas -Wno-unused -Wcast-align -Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=coverage-mismatch -Wno-error=free-nonheap-object -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -pipe /builds/slave/m-esr45-l64-000000000000000000/build/src/gcc
/bin/g++ 4.7.3 -Wall -Wempty-body -Woverloaded-virtual -Wsign-compare -Wwrite-strings -Werror=endif-labels -Werror=int-to-pointer-cast -Werror=missing-braces -Werror=parentheses -Werror=pointer-arith -Werror=return-type -Werror=sequence-point -Werror=switch -Werror=trigraphs -Werror=type-limits -Werror=uninitialized -Werror=unused-label -Wno-invalid-offsetof -Wcast-align -Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=coverage-mismatch -Wno-error=free-nonheap-object -fno-exceptions -fno-strict-aliasing -fno-rtti -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -std=gnu++0x -pthread -D_GLIBCXX_USE_CXX11_ABI=0 -pipe -DNDEBUG -DTRIMMED -g -fprofile-use -fprofile-correction -Wcoverage-mismatch -O3 -fomit-frame-pointer -Werror
Configure arguments

--enable-update-channel=esr --enable-update-packaging --with-google-api-keyfile=/builds/gapi.data --with-google-oauth-api-keyfile=/builds/google-oauth-api.key --with-mozilla-api-keyfile=/builds/mozilla-desktop-geoloc-api.key --enable-crashreporter --enable-release --enable-elf-hack --enable-stdcxx-compat --enable-default-toolkit=cairo-gtk2 --enable-warnings-as-errors --enable-official-branding --enable-verify-mar --enable-rust

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

Моя сборка

about:buildconfig
Build platform
target
x86_64-unknown-linux-gnu
Build tools
Compiler Version Compiler flags
gcc 4.8.2 -Wall -Wempty-body -Wpointer-to-int-cast -Wsign-compare -Wtype-limits -Wno-unused -Wcast-align -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -pipe
c++ 4.8.2 -Wall -Wempty-body -Woverloaded-virtual -Wsign-compare -Wwrite-strings -Wno-invalid-offsetof -Wcast-align -fno-exceptions -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -std=gnu++0x -pthread -pipe -DNDEBUG -DTRIMMED -g -Os -march=x86-64 -fomit-frame-pointer
Configure arguments

--enable-application=browser --disable-tests --disable-mochitest --disable-installer --enable-official-branding --disable-gio --disable-gconf --disable-pulseaudio --disable-gstreamer --disable-updater --disable-libjpeg-turbo --enable-skia '--enable-optimize=-Os -march=x86-64' --with-system-zlib --with-system-bz2 --with-pthreads --enable-strip --disable-debug --disable-xinerama --disable-xprint --enable-pango --enable-svg --enable-canvas --disable-javaxpcom --disable-safe-browsing --without-system-nspr --without-system-nss --disable-system-hunspell --disable-libnotify --disable-startup-notification --enable-jemalloc --disable-dbus --enable-release --disable-cpp-exceptions --disable-exact-rooting --enable-cpp-rtti --disable-necko-wifi --disable-crashreporter --with-mozilla-api-keyfile=/build/mozilla-api-key

ZenitharChampion ★★★★★
() автор топика
/opt/firefox-dev $ find . -type f | wc -l
67
vvn_black ★★★★★
()

В официальной сборке Firefox это 75 файлов, в моей - 13 тысяч файлов.

Это ты всё содержимое /obj-* туда затянул, что ли?

./mach package упаковывает нужные файлы в tar.gz.

i-rinat ★★★★★
()

Я научился собирать портабельную версию Firefox
13 тысяч файлов

А ты оптимист!

mandala ★★★★★
()

Делай лайв дистрибутивы для каждой программы.

fornlr ★★★★★
()

портабельную версию Firefox,

DLL Hijack — Firefox Portable ©
Ловите «хакира» ЦРУ'шника! :)

quickquest ★★★★★
()
9 июня 2017 г.
Ответ на: комментарий от i-rinat

Только скомпилировалось видать, не у всех есть топовые компы!

mandala ★★★★★
()

Кстати подскажите кто в теме, если я правильно понял в libstdc++ есть разные опции сборки которые влияют на ABI, соответственно собранная на старом centos программа может не запуститься на других дистрах. Это так?

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

в libstdc++ есть разные опции сборки которые влияют на ABI

В новых GCC добавили ещё теги к манглингу имён. Новые символы маркируются тегом cxx11.

Сама libstdc++ экспортирует символы с тегами и без, поэтому если старое приложение было завязано только на libstdc++, оно запустится и заработает. Проблема возникает, когда есть ещё другие библиотеки, показывающие наружу кишки C++, например Boost. Если хотя бы одна такая библиотека есть, и она выпускает наружу std::string или что-нибудь другое, будут проблемы с запуском.

Теоретически, можно все библиотеки собирать с несколькими версиями ABI, но этим никто не занимается. Слишком много мороки.

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

Спасибо за ответ. Предположим я сам собираю и статически линкую boost и всё остальное. Динамически линкуются libc, libgcc, libstd++. Возможно ли при таком раскладе собрать универсальный бинарь под разные линуксы?

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

Раньше я брал Debian (на тот момент Squeeze) и компилировал в нём - самый последний GCC. В юзерспейс. Затем я делал:

export PATH=/build/gcc/bin
export LD_LIBRARY_PATH=/build/gcc/lib

После чего, gcc --version выдавал новую версию.

Скомпилированная таким образом программа а). Не требовала слишком дофига нового Glibc, как если бы я скомпилировал её в новом дистрибутиве Linux, в котором новый GCC есть «из коробки» б). Требовала новый C++ Runtime в виде файла «libstdc++.so.6». Хорошо что можно положить этот файл вместе с программой - в отличие от Glibc.

А потом я открыл для себя CentOS. Сначала нужно подключить репозиторий Devtoolset (гугл в помощь). Затем надо добавить цифровой ключ этого репозитория, но я так и не разобрался, где его взять. Поэтому сделал gpgcheck=0 для этого репозитория. Затем открыть yumex и установить devtoolset-2.0-*. Там вроде не всё надо, поэтому через yumex и мышкой, а не с помощью yum по запросу выше.

Затем открыть терминал, выполнить в нём:

scl enable devtoolset-2.0

И ура: новый GCC работает! И что интересно, этот самый GCC из репозитория devtoolset вообще не имеет libstdc++.so.6 - используется системный. Как они это сделали? Я собираю в GCC 4.9, а запускаю в системе, где выше GCC 4.1 ничего нет.

Что касается Firefox. Версия 45.9 собирается без проблем. В SRPM-пакете для el5 есть патчи «build-el5-*.patch». Версия 52.1 не собирается. Патчи прекрасно накладываются и не требут правки. Но теперь Firefox избавлен от зависимости X11-SHM в пользу XCB-SHM, потому что Firefox переходит на мультиядерность, а X11-SHM в ней нестабильна (так написано на странице фич-риквеста). Даже не знаю, пытаться ли собирать Firefox в CentOS 5 дальше, или всё-таки перейти на CentOS 6.

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

Посмотри как сделали в игре World of Goo (скачай tar.gz «на посмотреть»). Там каталоги lib32 и lib64, а также файл «run_game.sh» со следующим содержимым (я его немного изменил):

#!/bin/sh

# Change to game directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

if [ ! -e res ] || [ ! -e SE ]
then
	echo "Missing res/ and SE/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./lib64
	BIN=./SyobonAction.x86_64
else
	LIBS=./lib32
	BIN=./SyobonAction.x86
fi

# Run the game:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

exit $e

Очень простой скрипт из трёх частей. Первая меняет текущую директорию на директорию игры. Необходимо для KDE, который запускает исполняемые файлы из /, а GNOME так не делает. Почему именно CANONPATH я не знаю - я вписывал любые символы, и всё работало. Наверное, автор скрипта брал его из драйвера CANON.

Вторая часть определяет разрядность и выбирает директорию с библиотеками. Третья запускает игру.

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

Раньше я брал Debian (на тот момент Squeeze) и компилировал в нём - самый последний GCC

Хотелось бы такие решения оставить на крайний случай.

Требовала новый C++ Runtime в виде файла «libstdc++.so.6». Хорошо что можно положить этот файл вместе с программой - в отличие от Glibc

У libstdc++ мутная лицензия, в интернетах считают, что распространять её надо статически либо на условиях GPLv3 https://lwn.net/Articles/549573/. Оба варианта мне не очень нравятся.

А потом я открыл для себя CentOS. Сначала нужно подключить репозиторий Devtoolset (гугл в помощь).

Про devtoolset я в курсе, но мне нужно знать будет ли собранная им программа работать везде без таскания libstdc++ с собой.

Посмотри как сделали в игре World of Goo (скачай tar.gz «на посмотреть»). Там каталоги lib32 и lib64, а также файл «run_game.sh» со следующим содержимым (я его немного изменил)

У меня нет такой проблемы, потому что все библиотеки, которые я использую, либо слинкованы статически, либо берутся из системы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.