Как я устанавливал fpc/lazarus trunk на Fedora Workstation gtk3/wayland
Когда я взялся за "освоение" линукса для написания кроссплатформенного софта, то в качестве "печки", от которой можно будет плясать дальше, я выбрал Дебиан и его клоны. Как оказалось потом, кроме разнообразия виджетсетов (gtk2/gtk3, qt5/qt6), разные дистры линукса по умолчанию могут использовать и разные оконные менеджеры (x11/wayland). И поддержка кроссплатформенных приложений (чтоб все корректно рисовалось/нажималось) становится весьма нетривиальной задачей.
Классический Дебиан (на момент написания текста это Debian 13.4 Trixie) на виджетах gtk2/gtk3 по умолчанию использует оконный менеджер x11 (а в его клоне Cinnamon LMDE 7 поддержка wayland заявлена, как "экспериментальная" и, по сути, не работоспособна). И я решил посмотреть работоспособность программ на линуксе, где связка gtk3/wayland ставится "искаропки". Такой "линукс" нашелся - Fedora Workstation (на мой взгляд, очень "юзерфрендли" среда, особенно тем, что автоматически предлагает установить недостающие пакеты в случае необходимости).
Казалось бы, ставь fpc/lazarus и пользуйся. Но... есть один нюанс, который и побудил меня описать свой опыт здесь. Если не вдаваться в подробности, то последние дистры Fedora 44 поставляются с binutils 2.46+ ld.bfd, где по умолчанию включён флаг -z text — он запрещает динамические релокации в read-only секциях .so-библиотек. Именно из-за этого падает сборка ibpas2jslib.so, ну и весь дальнейший процесс установки компилятора.
Будем считать, что система тюнингована (установлены все пакеты gtk3 и git). Итак, по шагам:
1. Разрешение зависимостей
sudo dnf install -y fpc fpc-src make binutils gcc gdb git
2. Структура папок
mkdir -p ~/lazarus/fpc
# ~/lazarus/fpcsrc — исходники fpc trunk (качаем отсюда https://gitlab.com/freepascal.org/fpc/source)
# ~/lazarus/lazarus — исходники lazarus trunk (качаем отсюда https://gitlab.com/freepascal.org/lazarus/lazarus)
# ~/lazarus/fpc — бинарники (сюда устанавливаем)
3. Правка Makefile (если bootstrap-компилятор 3.2.3)
sed -i 's/REQUIREDVERSION=3.2.2/REQUIREDVERSION=3.2.3/' ~/lazarus/fpcsrc/Makefile
4. Сборка FPC Trunk
cd ~/lazarus/fpcsrc
make clean
make all PP=/usr/bin/fpc INSTALL_PREFIX=$HOME/lazarus/fpc OPT="-k-z -knotext" NOGDB=1 2>&1 | tee ~/lazarus/build.log
5. Установка FPC Trunk
make install INSTALL_PREFIX=$HOME/lazarus/fpc NOGDB=1
6. Копируем ppcx64 вручную (make install его не копирует)
cp ~/lazarus/fpcsrc/compiler/ppcx64 ~/lazarus/fpc/bin/ppcx64
7. Прописываем PATH
echo 'export PATH="$HOME/lazarus/fpc/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
8. Создаем "правильный" fpc.cfg
~/lazarus/fpc/bin/fpcmkcfg -d basepath=$HOME/lazarus/fpc/lib/fpc/3.3.1 -d bindir=$HOME/lazarus/fpc/bin -o ~/lazarus/fpc/bin/fpc.cfg
# копируем fpc.cfg персонально в нашу сборку
cp ~/lazarus/fpc/bin/fpc.cfg ~/lazarus/fpc/lib/fpc/3.3.1/fpc.cfg
9. Проверка FPC перед сборкой Lazarus
fpc -iV
# → 3.3.1
fpc -vh 2>&1 | grep -i "config"
# → Hint: Start of reading config file /home/leyba/lazarus/fpc/lib/fpc/3.3.1/fpc.cfg
10. Сборка Lazarus Trunk
cd ~/lazarus/lazarus
# Используем переменную окружения `PPC_CONFIG_PATH` — именно её FPC проверяет при поиске `fpc.cfg`
PPC_CONFIG_PATH=$HOME/lazarus/fpc/lib/fpc/3.3.1 make bigide FPC="$HOME/lazarus/fpc/bin/fpc" LCL_PLATFORM=gtk3 2>&1 | tee ~/lazarus/lazarus-build.log
11. Создаем папку конфига и lazarus.cfg
mkdir -p ~/lazarus/config_lazarus
echo "--primary-config-path=$HOME/lazarus/lazarus_config" > ~/lazarus/lazarus/lazarus.cfg
Проверка:
cat ~/lazarus/lazarus/lazarus.cfg
# → --primary-config-path=/home/leyba/lazarus/config_lazarus
При запуске `~/lazarus/lazarus/lazarus` автоматически подхватит `lazarus.cfg` из той же папки и будет хранить все настройки в `~/lazarus/lazarus_config` — отдельно от системного `~/.lazarus`.
Итоговая структура после установки
~/lazarus/
fpcsrc/ ← исходники fpc trunk
lazarus/ ← исходники + бинарники lazarus
fpc/
bin/
fpc ← обёртка
ppcx64 ← компилятор (скопирован вручную)
fpc.cfg ← конфиг
...утилиты...
lib/fpc/3.3.1/
fpc.cfg ← копия конфига
ppcx64
units/x86_64-linux/ ← RTL и пакеты
build.log
lazarus-build.log
12. Первый запуск lazarus
По умолчанию в качестве компилятора использует fpc bootstrap `/usr/bin/fpc`. Выставленный вручную `ppcx64` вызывается Lazarus'ом напрямую и не читает `fpc.cfg`, минуя `PPC_CONFIG_PATH`.
Решение — создать wrapper-скрипт как это делает fpcupdeluxe:
# запускаем скрипт
cat > ~/lazarus/fpc/bin/fpc.sh << 'EOF'
#!/bin/bash
export PPC_CONFIG_PATH=/home/leyba/lazarus/fpc/lib/fpc/3.3.1
exec /home/leyba/lazarus/fpc/bin/ppcx64 "$@"
EOF
chmod +x ~/lazarus/fpc/bin/fpc.sh
Проверяем:
~/lazarus/fpc/bin/fpc.sh -iV
# → 3.3.1
~/lazarus/fpc/bin/fpc.sh -vh 2>&1 | grep -i config
# → Hint: Start of reading config file /home/leyba/lazarus/fpc/lib/fpc/3.3.1/fpc.cfg
# → Hint: End of reading config file /home/leyba/lazarus/fpc/lib/fpc/3.3.1/fpc.cfg
Затем в окне Configure Lazarus IDE → Compiler меняем путь с:
/usr/bin/fpc
на:
/home/leyba/lazarus/fpc/bin/fpc.sh
И жмём Start IDE.
13. Создание ярлычка .desktop файл для GNOME
cat > ~/.local/share/applications/lazarus-trunk.desktop << EOF
[Desktop Entry]
Version=1.0
Type=Application
Name=Lazarus Trunk
Comment=Lazarus IDE 4.99 (FPC trunk)
Exec=/home/leyba/lazarus/lazarus/startlazarus --primary-config-path=/home/leyba/lazarus/lazarus_config
Icon=/home/leyba/lazarus/lazarus/images/icons/lazarus48x48.png
Terminal=false
Categories=Development;IDE;
StartupNotify=true
EOF
Обновляем базу ярлыков:
update-desktop-database ~/.local/share/applications/
Закрепляем на dashboard:
# Добавляем в dock GNOME программно
gsettings set org.gnome.shell favorite-apps "$(gsettings get org.gnome.shell favorite-apps | sed "s/]$/, 'lazarus-trunk.desktop']/")"
При написании заметки использовался могучий опыт ИИ (Claude) :)
Если есть замечания/предложения, меня можно найти в телеге @https://t.me/Leybasoft