4

在 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

上面没有错误。我尝试将 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 在文档中失败但找不到解决方案。

4

2 回答 2

4

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不必要。介子为您做到这一点。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'
                     )

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

在 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的人ninja来说,ninja-build.

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

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

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

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

于 2018-02-20T11:43:36.667 回答
1

经过上述一些探索和 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 - 不同的分支/标签 - 稳定、主、夜间 - 两个沙盒和一个系统范围)可以并排安装并根据需要使用。在初始设置和测试期间,所有变体都产生了相同的结果 - 当使用 Gee 和 GXml 时,只有默认构建可以工作(Flatpak Manifest不会构建)但这已经解决(现在看来这纯粹是一个 Flatpak 问题 是Flatpak 和 Fuse 之间的冲突)。

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

默认配置的缺点是无法导出捆绑包,但本地构建可以利用系统范围的功能。

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

对于指导和测试,有Flatpak Manifest 示例来说明它们是如何工作的。有一些方法可以使用构建完成指令来更改沙盒权限。 Flatpak 文档非常好。

当您第一次创建项目时,在 Gnome Builder 中选择Vala + Gnome Application,一个有效的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(以及很快的Vulkan 3D图形引擎)和精美简约的 UI 指南/标准是一种神奇的东西,类似于现代炼金术。

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

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

于 2018-02-22T15:41:20.107 回答