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


Сначала установим ее

sudo apt install imagemagick-6.q16

Теперь запускаем генерацию иконок 


n=$(identify /home/leyba/lazarus/laz_gtk3/lazarus/images/icons/brown.ico | wc -l)
for i in $(seq 0 $((n-1))); do
  dims=$(identify /home/leyba/lazarus/laz_gtk3/lazarus/images/icons/brown.ico[$i] | grep -oP '\d+x\d+' | head -1)
  convert "/home/leyba/lazarus/laz_gtk3/lazarus/images/icons/brown.ico[$i]" \
          "/home/leyba/lazarus/laz_gtk3/lazarus/images/icons/brown${dims}.png"
done

Иконки должны существовать по указанным путям на момент конвертации!


Ну и, соответственно, в ниже приведенном скрипте меняете стандартную 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 ;)

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

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

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