Flatpak Meson не находит библиотеки Vala от Gnome Builder
В Linux я использую Meson (0.44.0) в Gnome Builder (3.26.4) для консольной программы, которая будет использовать Gee и GXml. Мое намерение - написать это в Genie.
Когда я использую Meson в Gnome Builder, он терпит неудачу, но тот же самый успех при вызове из командной строки с использованием valac (0.38.8) следующим образом:
valac --pkg=gtk+-3.0 --pkg=gee-0.8 --pkg=gxml-0.16 main.gs
Там нет ошибки из вышеперечисленного. Я попытался настроить meson.build с помощью gee и gxml в качестве зависимости и, альтернативно, как vala_args. Та же ошибка
Проверяя pkg-config, я получаю следующее:
$ pkg-config --libs gxml-0.16
-L/usr/local/lib64 -lgxml-0.16 -lgio-2.0 -lxml2 -lgee-0.8 -lgobject-2.0 -lglib-2.0
$ pkg-config --libs gee-0.8
-lgee-0.8 -lgobject-2.0 -lglib-2.0
$ pkg-config --libs gee-1.0
-lgee -lgobject-2.0 -lglib-2.0
Возможно, я делаю что-то не так. Вот локальный файл meson.build, за которым следует meson.build верхнего уровня и ошибка:
example_sources = [
'main.gs'
]
example_deps = [
dependency('gio-2.0', version: '>= 2.50'),
dependency('gtk+-3.0', version: '>= 3.22'),
dependency('glib-2.0', version: '>= 2.50')
]
gnome = import('gnome')
example_sources += gnome.compile_resources(
'example-resources',
'example.gresource.xml',
c_name: 'example'
)
executable(
'example',
example_sources,
vala_args: '--target-glib=2.50 --pkg=gee-0.8 --pkg=gxml-0.16',
dependencies: example_deps,
install: true
)
с верхнего уровня meson.build:
project(
'example',
['c', 'vala'],
version: '0.1.0',
meson_version: '>= 0.40.0',
)
subdir('src')
И ошибка:
uses Gee
error: The namespace name 'Gee' could not be found
Я вызываю сборку из Gnome-Builder. Может ли кто-нибудь помочь мне понять, что происходит? Я попытался выяснить, почему valac преуспевает, а meson терпит неудачу в документации, но не может найти решение.
2 ответа
Gee и GXml должны быть зависимостями, как GIO, GLib и GTK+. Итак, вы должны попробовать:
example_deps = [
dependency('gio-2.0', version: '>= 2.50'),
dependency('gtk+-3.0', version: '>= 3.22'),
dependency('glib-2.0', version: '>= 2.50'),
dependency('gobject-2.0'),
dependency('gee-0.8'),
dependency('gxml-0.16'),
]
Обычно вам не нужно выходить за рамки этого. Это делает --pkg
варианты в vala_flags
ненужным. Мезон делает это для тебя. Мезон работает так, как он использует valac
чтобы создать код на C, на отдельном этапе для компиляции двоичного кода используется компилятор C. Используя --pkg
ты только говоришь valac
какой файл VAPI использовать, но не уведомлять компилятор C, который pkg-config
пакет для использования в библиотеке C.
Также обратите внимание, что я добавил gobject-2.0
как зависимость. Если я правильно помню, GNOME Builder пропускает это, и это влияет на сборку.
Сообщение об ошибке, error: The namespace name 'Gee' could not be found
Тревожит. Это ошибка компилятора Vala, и я бы подумал, что компилятор сможет найти файл VAPI, используя vala_args
метод, который вы пробовали Может быть, у вас есть Gee, созданный из исходного кода, а не установленный по всей системе?
Meson позволяет добавлять другой каталог поиска VAPI:
add_project_arguments(['--vapidir',
join_paths(meson.current_source_dir(), 'vapi')
],
language: 'vala'
)
Более подробную информацию можно найти на странице Vala документации Meson Build.
Поддержка Genie была добавлена в Meson версии 0.42. Так meson_version:
должно быть >= 0.42.0
,
Если проблемы все еще существуют, то MCVE использует Genie, Gee и Meson. Это должно быть скомпилировано из командной строки. Сохраните следующую программу Genie как genie-gee.gs
:
[indent=2]
uses Gee
init
var my_list = new ArrayList of string()
my_list.add( "one" )
my_list.add( "two" )
for item in my_list
print( item )
Затем сохраните следующий файл Meson как meson.build
:
project('minimal-genie-gee-example',
'vala', 'c'
)
genie_gee_deps = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
dependency('gee-0.8'),
]
executable('genie-gee',
'genie-gee.gs',
dependencies: genie_gee_deps
)
Из командной строки используйте Meson для настройки каталога сборки:
meson setup builddir
Это должно показать, что зависимости были найдены, например:
Native dependency gee-0.8 found: YES 0.18.0
Затем используйте Ninja build для сборки проекта:
ninja -C builddir
Для тех, кто использует Fedora ninja
является ninja-build
,
Любые проблемы с установкой директории сборки в Meson builddir/meson-logs/meson-log.txt
,
Если это работает, но в GNOME Builder происходит сбой, то моя единственная мысль заключается в том, что GNOME Builder был установлен с помощью Flatpak. Изолированная среда Flatpak может влиять на доступ к зависимостям.
Обновление: после обсуждения в комментариях кажется, что среда выполнения, используемая GNOME Builder, была проблемой. У Builder есть замечательная возможность выбора среды выполнения Flatpak, используемой для сборки вашего программного обеспечения. Если вы придерживаетесь "традиционного" способа разработки, устанавливая библиотеки и заголовочные файлы на свою рабочую станцию, убедитесь, что вместо среды выполнения Flatpak выбрана Host Operating System. Казалось бы, среда выполнения GNOME Flatpak не включает libgee.
Обновление 2: Когда вы пишете манифест компоновщика Flatpak, а зависимость отсутствует в среде исполнения Flatpak /SDK, добавьте эту зависимость в качестве другого модуля в манифест компоновщика Flatpak. Это позволяет GNOME Builder использовать Flatpak для сборки программного обеспечения с помощью среды выполнения Flatpak. Пример манифеста приведен в ответе AsymLabs.
Хорошо после некоторого исследования и совета AlThomas выше, вот что я обнаружил. OpenSUSE Tumbleweed предоставляет четыре (или более) способа установки Gnome-Builder. Это:
1) Через Центр программного обеспечения Gnome. Это устанавливает org.gnome.Builder/stable в изолированную среду с песком, используя Flatpak.
2) Через Flathub.org с помощью Flatpak из командной строки. Это устанавливает org.gnome.Builder/master (по ночам) в изолированной среде.
3) Через менеджер пакетов zypper и командную строку. Это установит стабильный Gnome-Builder и связанные библиотеки для всей системы.
4) Через Яст2. Это обеспечивает то же самое, что и Zypper.
Все три установки (одна и та же версия 3.26.4 - разные ветви / метки - стабильная, главная, ночная - две песочницы и одна система в целом) могут устанавливаться бок о бок и использоваться по мере необходимости. Во время первоначальной настройки и тестирования все варианты дали один и тот же результат - при использовании Gee и GXml работала бы только сборка по умолчанию (Манифест Flatpak не собирался), но это было решено (теперь кажется, что это чисто проблема Flatpak. конфликт между Флатпаком и Предохранителем).
Сборка по умолчанию включает систему времени выполнения Host. Чтобы установить среду сборки по умолчанию, после открытия проекта в Gnome-Builder выберите " Настройки сборки" в верхнем левом всплывающем меню и выберите " По умолчанию".
Недостатком конфигурации по умолчанию является невозможность экспорта пакета, но локальные сборки могут использовать общесистемные функции.
Так что же такое Манифест Флэтпак и почему он так важен? Это файл JSON верхнего уровня, который содержит информацию о проекте. Манифест Flatpak, в данном случае org.gnome.Example.json, объединяет все функции проекта, чтобы его можно было упаковать для распространения. Это включает в себя среду выполнения, SDK, возможность подключения системы к X11, IPC, Wayland, DBus и т. Д., Систему сборки (по умолчанию Meson), директивы очистки, параметры конфигурации и сборки, детали субмодуля (зависимости) и многие другие функции. Один пакет Flatpak может быть установлен практически в любом дистрибутиве Linux, например, в Debian, Ubuntu, Red Hat, OpenSuse или их производных, и помещен в "песочницу" для обеспечения безопасности и переносимости. В будущем он будет полностью кроссплатформенным.
Для инструкций и тестирования есть примеры Flatpak Manifest, иллюстрирующие их работу. Существуют способы изменить разрешения песочницы, используя директивы окончания сборки. Документация Flatpak отличная.
В Gnome Builder при первом создании проекта выберите Vala + Gnome Application, и будет установлен действительный Манифест Flatpak. По умолчанию это предназначено для GUI, а не приложения командной строки; тем не менее, он генерирует Манифест Flatpak по умолчанию, который можно использовать в качестве шаблона (Gnome Builder допускает несколько манифестов - просто выберите необходимую сборку). Ниже приведен улучшенный манифест Flatpak, который будет создавать подмодули для Gee и GXml (это было протестировано в Gnome Builder и работает):
{
"app-id": "org.gnome.Example",
"runtime": "org.gnome.Platform",
"runtime-version": "master",
"sdk": "org.gnome.Sdk",
"command": "example",
"finish-args": [
"--share=network",
"--share=ipc",
"--socket=x11",
"--socket=wayland",
"--filesystem=xdg-run/dconf",
"--filesystem=~/.config/dconf:ro",
"--talk-name=ca.desrt.dconf",
"--env=DCONF_USER_CONFIG_DIR=.config/dconf"
],
"build-options": {
"cflags": "-O2 -g",
"cxxflags": "-O2 -g",
"env": {
"V": "1"
}
},
"cleanup": [
"/bin",
"/include",
"/lib",
"/lib/pkgconfig",
"/share",
"/share/vala",
"*.la",
"*.a"
],
"modules": [
{
"name": "libgee",
"buildsystem": "meson",
"config-opts": [
"--libdir=lib"
],
"builddir": true,
"sources": [
{
"type": "git",
"tag": "meson",
"url": "https://github.com/GNOME/libgee.git"
}
]
},
{
"name": "libgxml",
"buildsystem": "meson",
"config-opts": [
"--libdir=lib"
],
"builddir": true,
"sources": [
{
"type": "git",
"branch": "master",
"url": "https://gitlab.gnome.org/GNOME/gxml.git"
}
]
},
{
"name": "example",
"buildsystem": "meson",
"config-opts": [
"--libdir=lib"
],
"builddir": true,
"sources": [
{
"type": "git",
"url": "file:///home/<user>/Projects/example"
}
]
}
]
}
Снимаю шляпу перед людьми, которые разрабатывают этот пакет. Сочетание Flatpak, Meson, Gtk3 / 4/5 /.., Vala, Genie (а вскоре и 3D- движка Vulkan) и красивых минималистичных руководств / стандартов UI в одной легкой платформе разработки - это нечто волшебное, сродни современной алхимии.
Кроме того, я пытался использовать Gtk3 с несколькими языками, включая C/C++, D, Haskell и Python, но ни одна из этих альтернатив не могла создать автономные двоичные файлы, которые были бы такими же компактными, эффективными и увлекательными для написания, как Vala и Genie. Это очень недооцененные языки.
В заключение, любой, кому нужна хорошая отправная точка при попытке понять эти технологии и как Gnome-Builder объединяет их, может прочитать пост AlThomas выше и этот, вместе с комментариями. Это может сэкономить много времени.