Flatpak Meson 没有从 Gnome Builder 中找到 Vala 库

Asy*_*abs 5 vala genie meson-build flatpak gnome-builder

在 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
Run Code Online (Sandbox Code Playgroud)

从上面看没有错误。我尝试使用 gee 和 gxml 设置 meson.build 作为依赖项,或者作为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
Run Code Online (Sandbox Code Playgroud)

也许我做错了什么。这是本地 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
)
Run Code Online (Sandbox Code Playgroud)

与顶级介子.build:

project(
  'example',
  ['c', 'vala'],
  version: '0.1.0',
  meson_version: '>= 0.40.0',
)

subdir('src')
Run Code Online (Sandbox Code Playgroud)

错误是:

uses Gee

error: The namespace name 'Gee' could not be found
Run Code Online (Sandbox Code Playgroud)

我从 Gnome-Builder 中调用构建。有人可以帮助我了解发生了什么吗?我试图在文档中查找 valac 成功而 meson 失败的原因,但找不到解决方案。

AlT*_*mas 5

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'),
  ]
Run Code Online (Sandbox Code Playgroud)

通常你不需要超出这个范围。这使得--pkg选项变得vala_flags不必要。介子会为你做到这一点。Meson 的工作方式是用来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 编译器的错误,我本以为编译器能够使用vala_args您尝试过的方法找到 VAPI 文件。也许您从源代码构建了 Gee,但没有在系统范围内安装?

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

add_project_arguments(['--vapidir',
                       join_paths(meson.current_source_dir(), 'vapi')
                      ],
                      language: 'vala'
                     )
Run Code Online (Sandbox Code Playgroud)

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

Meson 0.42 版本中添加了 Genie 支持。meson_version:应该如此>= 0.42.0

如果仍然存在问题,那么这里是使用 Genie、Gee 和 Meson的 MCVE。这应该从命令行编译。将以下 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 )
Run Code Online (Sandbox Code Playgroud)

然后将以下 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
           )
Run Code Online (Sandbox Code Playgroud)

从命令行使用 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 运行时。GNOME Flatpak 运行时似乎不包含 libgee。

Update2:编写 Flatpak 构建器清单时,如果依赖项不在 Flatpak 运行时/SDK 中,则将该依赖项添加为 Flatpak 构建器清单中的另一个模块。这允许 GNOME Builder 使用 Flatpak 通过 Flatpak 运行时构建软件。AsymLabs 答案中给出了示例清单。