【问题标题】:Flatpak Meson Not Finding Vala Libraries From Gnome BuilderFlatpak Meson 没有从 Gnome Builder 中找到 Vala 库
【发布时间】:2018-07-30 13:24:55
【问题描述】:

在 Linux 中,我在 Gnome Builder (3.26.4) 中使用 Meson (0.44.0) 作为控制台程序,该程序将使用 Gee 和 GXml。我的意图是在 Genie 中写这个。

当我在 Gnome Builder 中使用 Meson 时,它会失败,但使用 valac (0.38.8) 从命令行调用时同样成功,如下所示:

valac --pkg=gtk+-3.0 --pkg=gee-0.8 --pkg=gxml-0.16 main.gs

上面没有错误。我尝试使用 gee 和 gxml 将 meson.build 设置为 dependencyvala_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 失败但找不到解决方案的原因。

【问题讨论】:

    标签: vala genie meson-build flatpak gnome-builder


    【解决方案1】:

    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'),
      ]
    

    通常您不需要超出此范围。这使得vala_flags 中的--pkg 选项变得不必要。介子为您做到这一点。 Meson 的工作方式是使用 valac 生成 C 代码,然后在单独的阶段使用 C 编译器生成二进制文件。通过使用--pkg,您只是告诉valac 要使用哪个VAPI 文件,而不是通知C 编译器要为C 库使用哪个pkg-config 包。

    还请注意,我已将 gobject-2.0 添加为依赖项。如果我没记错的话,GNOME Builder 会忽略这一点,它确实会影响构建。

    错误消息error: The namespace name 'Gee' could not be found 令人不安。这是来自 Vala 编译器的错误,我原以为编译器能够使用您尝试过的 vala_args 方法找到 VAPI 文件。也许您是从源代码构建的 Gee 并没有在系统范围内安装?

    Meson 确实允许添加另一个 VAPI 搜索目录:

    add_project_arguments(['--vapidir',
                           join_paths(meson.current_source_dir(), 'vapi')
                          ],
                          language: 'vala'
                         )
    

    Meson Build 文档的Vala page 上有更多详细信息。

    在 0.42 版中添加了对 Meson 的 Genie 支持。所以meson_version: 应该是>= 0.42.0

    如果仍有问题,那么这里是使用 Genie、Gee 和 Meson 的MCVE。这应该从命令行编译。将以下精灵程序另存为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.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 的人来说,ninjaninja-build

    Meson 设置构建目录的任何问题都会记录到builddir/meson-logs/meson-log.txt

    如果这可行,但在 GNOME Builder 中失败,那么我唯一的另一个想法是 GNOME Builder 已使用 Flatpak 安装。 Flatpak 的沙盒环境可能会影响对依赖项的访问。

    更新:根据 cmets 中的讨论,似乎 GNOME Builder 使用的运行时是问题所在。 Builder 有一个很棒的功能,可以选择用于构建软件的 Flatpak 运行时。如果您通过在工作站上安装库和头文件来遵循“传统”开发方式,请确保选择 Host Operating System 而不是 Flatpak 运行时。看起来 GNOME Flatpak 运行时不包含 libgee。

    更新 2: 当编写 Flatpak 构建器清单并且依赖项不在 Flatpak 运行时/SDK 中时,请将该依赖项作为另一个模块添加到 Flatpak 构建器清单中。这允许 GNOME Builder 使用 Flatpak 来构建带有 Flatpak 运行时的软件。 AsymLabs 的答案中给出了一个示例清单。

    【讨论】:

    • 我会寻找替代的 vapi 位置,我也在 example_deps 中尝试了meson.get_compiler('vala').find_library('gee-0.8'),但这也没有奏效。同样,它被发现为valac --pkg=gee-0.8
    • 嗯,我的理解是 Flatpak 是一个使用 OSTree 的沙盒环境。对于系统范围的安装,files are under /var/lib/flatpak 和 acessed through a filesystem namespace 例如,命名空间中的 /usr 是绑定安装的。 GNOME Builder 3.26.4 现在似乎已为许多发行版打包。看起来 Ubuntu 在 Bionic Beaver 中有那个版本。可能值得尝试使用您的发行版而不是 Flatpak 进行安装。
    • 按照您的建议尝试了许多不同的解决方案,假设 flatpak 已沙盒化 Gnome-Builder,并且我还从 repo 安装了 Gnome-Builder。问题似乎出在 Gnome-Builder 的 Build Preferences 上。当从项目首选项 org.gnome.example.json 更改为 default 时,它每次都会正确构建,这对于 Gnome 的 repo 和 flatpak 版本都是如此-生成器。默认设置包含配置选项 --libdir=lib 和运行时 主机操作系统。我的 json 文件可能是罪魁祸首。
    • 我已将此作为 GNOME Builder 的可用性问题提出:Issue 415 为了更好地理解运行时,插件文档很有用:RuntimesSubprocesses
    • Flatpak(和 Gnome Builder)开发人员可能应该使用不同的名称或文件扩展名来识别 Flatpack Manifest,以便 Gnome Builder 用户可以更容易地区分它的用途和来源。称它为 JSON 文件太笼统了。例如,meson.build 是明确的,还有 .vala 和 .gs。但是 .json 不识别任何上下文。当然,任何用户都可以这样做,但如果开发人员建立一个约定会更好。
    【解决方案2】:

    经过一些探索和上面 AlThomas 的建议,这就是我的发现。 OpenSUSE Tumbleweed 提供了四种(或更多)方式来安装 Gnome-Builder。它们是:

    1) 通过 Gnome 软件中心。这会使用 Flatpak 在沙盒环境中安装 org.gnome.Builder/stable

    2) 通过 Flathub.org 在命令行中使用 Flatpak。这会在沙盒环境中安装 org.gnome.Builder/master(每晚)

    3) 通过包管理器zypper 和命令行。这会在系统范围内安装一个稳定的 Gnome-Builder 和相关库。

    4) 通过 Yast2。这提供了与 Zypper 相同的功能。

    所有三个安装(相同版本 3.26.4 - 不同的分支/标签 - stable、master、nightly - 两个沙盒和一个系统范围)可以并排安装并根据需要使用。在初始设置和测试期间,所有变体都产生了相同的结果 - 当使用 Gee 和 GXml 时,只有 Default 构建可以工作(Flatpak Manifest 不会构建),但这已经已解决(现在看来,这个纯粹是一个 Flatpak 问题was a conflict between Flatpak and Fuse)。

    Default 构建启用 Host 运行时系统。要设置 Default 构建环境,在 Gnome-Builder 中打开一个项目后,从左上方的弹出菜单中选择 Build Preferences 并选择 Default

    Default 配置的缺点是无法导出 Bundle,但本地构建可以利用系统范围的功能。

    那么什么是Flatpak Manifest,为什么它如此重要?它是包含项目信息的顶级 JSON 文件。 Flatpak Manifest,在本例中为 org.gnome.Example.json,将项目的所有功能整合在一起,以便打包以进行分发。这包括运行时、sdk、与 X11、IPC、Wayland、DBus 等的系统连接、构建系统(默认为 Meson)、清理指令、配置和构建选项、子模块详细信息(依赖项)和许多其他功能。一个 Flatpak 软件包可以安装在几乎任何 Linux 发行版中,例如,无论是 Debian、Ubuntu、Red Hat、OpenSuse 还是它们的衍生产品,并且出于安全性和可移植性目的而被沙盒化。将来,它将完全跨平台。

    对于指导和测试,有Flatpak Manifest examples 来说明它们是如何工作的。有一些方法可以使用build finish directives 更改沙盒权限。 Flatpak documentation 非常棒。

    当您首次创建项目时,在 Gnome Builder 中选择 Vala + Gnome 应用程序,一个有效的 Flatpak Manifest 将被安装。默认情况下,这适用于 GUI 而不是命令行应用程序;尽管如此,它会生成一个默认的Flatpak Manifest,可以用作模板(Gnome Builder 将允许多个清单 - 只需选择所需的构建)。以下是改进后的 Flatpak Manifest,它将为 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"
            }
          ]
        }
      ]
    }
    

    向开发此软件包的人们致敬。结合 FlatpakMesonGtk3/4/5/..ValaGenie em>(以及很快的 Vulkan 3D 图形引擎)和一个轻量级开发平台中精美的简约 UI 指南/标准是一种神奇的东西,类似于现代炼金术。

    顺便说一句,我尝试将 Gtk3 与多种语言一起使用,包括 C/C++、D、Haskell 和 Python,但这些替代方案都不能生成像 Vala 那样紧凑、高效和有趣的独立二进制文件和精灵。这些是被严重低估的语言。

    最后,任何在尝试了解这些技术以及 Gnome-Builder 如何将它们结合在一起时需要一个良好起点的人都可以阅读 AlThomas 的上述文章和这篇文章以及 cmets。它可能会节省很多时间。

    【讨论】:

    • 我猜你希望 libgee 在 Flatpak 清单中成为 module。然后使用flatpak-builder 将其作为构建的一部分构建
    • 是的!我希望 ;) git repo 是 gitlab.gnome.org/GNOME/gxml.git,然后你选择一个 tag,比如 0.16.2,但这可能是另一个 StackOverflow 问题。
    • 我建议在 StackOverflow 上打开另一个问题,即“无法在 GNOME Builder 中为 Flatpak 构建依赖项”,并使用您的应用程序及其 Flatpak 清单的简化版本。也许有人会有答案。对于这个 SO 问题,我认为答案是使用主机运行时。从issue #316 看来,“运行时”:“主机”可能是有效的。
    猜你喜欢
    • 2022-01-18
    • 2019-04-23
    • 2019-12-29
    • 2020-07-03
    • 2018-02-04
    • 1970-01-01
    • 2019-05-23
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多