Как я устанавливал 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

Популярные сообщения из этого блога

Интернационализация (локализация) приложения на Lazarus

Как я устанавливал Firebird 3 на Debian 8

Как я ставил транковый fpc и lazarus на Debian 7.6 x32