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 выше и этот, вместе с комментариями. Это может сэкономить много времени.

Другие вопросы по тегам