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