Как я устанавливал 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 Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/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
Если вы хотите вместо стандартной иконки (которая поставляется в формате png) использовать другую (например, brown.ico), то сначала надо сгенерить недостающие brownххххх.png картинки. Для генереации из терминала это проще сделать при помощи утилиты imagemagick.
Сначала установим ее
Теперь запускаем генерацию иконок
Иконки должны существовать по указанным путям на момент конвертации!
Ну и, соответственно, в ниже приведенном скрипте меняете стандартную lazarus48x48.png на brown48x48.png
Обратите внимание на название .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 ;)