# Збірка Firefox з початкового коду в Linux / Fedora 43

Нарешті, знайшов час підстригти лисиці хвоста. Зокрема тому, що віднедавна відкрив для себе збірку i2pdbrowser: на базі консервативного і мабуть, останнього адекватного релізу ESR 115 - без "соціалізації" та заокруглення Мозілою колись цікавого (в першу чергу для гіків) браузеру:

=> my-personal-i2pdbrowser-fork-for-privacy-oriented-web.gmi Мій форк i2pdbrowser для приватно-орієнтованого Веб

По суті, білд вище - просто задає свою політику для готових офіційних бінарників цієї версії. В ній нормально відображається сучасний Веб; це не якийсь там Dillo чи NetSurf а повноцінний браузер.

Чому мене не влаштували архівні бінарники?

* Я користуюсь багатьма браузерами одночасно для різних мереж (Інтернет, Yggdrasil, Mycelium, Tor, I2P, тощо) і через слабке залізо не користуюсь Flatpak - мені треба якось змінити системний ідентифікатор програми для ізоляції профілів, не використовуючи контейнери;
* В мене давно крались плани покопирсатись у вихідному коді FF і точково адаптувати його під себе. Раніше, такими нюансами була не можливість вимкнення сповіщень про оновлення, які я випиляв тільки даунгрейдом з підтримкою потрібної опції в about:config;
* Також, моїй параної буде спокійніше, враховуючи що я бачу на поточному 149.0 купу заблокованих (завдяки самопалу psocks) спроб телеметрії на домени Mozilla. Хочу бути впевненим, що браузер відповідає задекларованим комітам і не намагається "дбайливо" тягнути мою історію переглядів на свої сервери, під виглядом "синхронізації профілю" чи "Mozilla VPN".

## Збірка

Офіційна інструкція:

=> https://firefox-source-docs.mozilla.org/setup/linux_build.html Building Firefox On Linux

Розмір репозиторію складає ~5 GB, також на (Fedora 43) довстановив:

``` bash
sudo dnf install perl clang-devel llvm-devel
```
* ймовірно, скрипт інсталяції ту команду запропонує автоматично
* `clang-devel llvm-devel` не потрібні, якщо ви збиратиметесь з артефактів

Вся "офіційна" процедура нового встановлення зводиться до чотирьох команд:

``` bash
curl -LO https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/main/python/mozboot/bin/bootstrap.py
python3 bootstrap.py
./mach build
./mach run
```
* при наступних збірках, команда `python3 bootstrap.py` замінюється на `./mach bootstrap`
* також, перед повторними білдами, варто підтягнути оновлення з `git pull`
* збірка з артефактами "Firefox for Desktop Artifact Mode [default]" триває швидко - через підвантаження бінарних наборів

### ESR 115

> Зауважу, що на Fedora 43 мені так і не вдалося розв'язати всі застарілі залежності. Можливо, тут варто спробувати статичний білд на віртуалці або з використанням контейнерів. Планую доповнити згодом, а поки - лишаю нотатки для ESR 115 як є.

В гілці master буде відповідно остання версія Nightly з усіма навісами. Тому я буду збирати собі ESR 115 за образом і подобою i2pdbrowser, бо точно не знаю з якої точно версії Firefox зкурвився.

Офіційний гайд я тут ігнорую і збираюсь так:

``` bash
git clone https://github.com/mozilla-firefox/firefox.git
cd firefox
```
* `git clone` - можливо потребує `--recursive` (не перевіряв, бо просто перехожу в клонований раніше репозиторій)

Тепер потрібно перемкнутись на тег або гілку:

=> build-firefox-from-source-on-fedora-linux/FIREFOX_ESR_115-tags.png Вибір тега на GitHub (скріншот)

``` bash
git checkout ВАШ_ВИБІР
```
* особисто вирішив спробувати тег FIREFOX_115_34_0esr_RELEASE, бо (на момент допису) він оновився лише два тижні тому - можливо наявні критичні виправлення безпеки і я не бачу для себе очевидних причин фрізитись саме на FIREFOX_115_20_0esr_RELEASE; думаю, що ESR 115.20 в i2pdbrowser використовується лише тому, що розробники просто зробили для неї ініціальний пресет і втратили інтерес до супроводу.

Після перемикання гілки (це займе деякий час) я створив файл `mozconfig` наступного вмісту:

``` mozconfig
ac_add_options --with-libclang-path=/usr/lib64
ac_add_options --without-wasm-sandboxed-libraries
```

Зробив даунгрейд Rust:

``` bash
rustup install 1.70.0
rustup default 1.70.0
rustc --version
```
* можливо й новіші працюють, не перевіряв
* переключитись назад можна командою `rustup default stable`
=> install-latest-rust-version-on-linux.gmi Встановлення останньої версії Rust в Linux

Також, збірка буде вимагати ~ Python 3.11:

``` bash
sudo dnf install python3.11-devel
```

і додаткові аргументи середовища:

``` bash
python3.11 ./mach bootstrap --no-system-changes
LDFLAGS="-Wl,--allow-shlib-undefined" HOST_LDFLAGS="-Wl,--allow-shlib-undefined" python3.11 ./mach build
python3.11 ./mach run
```
* на етапі `bootstrap` я обираю "Firefox for Desktop"
* аргумент `--no-system-changes` потрібен, щоб не ставити watchman

У разі зміни конфігурації і перед повторним білдом, варто почистити кеш:

``` bash
rm -rf ~/.mozbuild
rm -rf obj-*
```

Все інше, якщо збірка вдалась - вже підганяємо під своє середовище робочого столу або збираємо пакет rmp/deb.

## Дивіться також

=> run-same-firefox-version-using-custom-profile.gmi Окремі профілі Firefox на базі спільного релізу
=> left-oriented-close-tab-button-in-firefox.gmi Ліво-стороння орієнтація кнопки "закрити вкладку" в Firefox
=> goodbye-flatpak.gmi Видаляю Flatpak зі свого комп'ютера