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

时间:2018-02-20 08:38:54

标签: 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

以上没有错误。我尝试使用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

也许我做错了什么。这是本地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 个答案:

答案 0 :(得分: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为你做到了。 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 page的详细信息。

Genie支持被添加到Meson版本0.42。因此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文件保存为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中失败了,那么我唯一的另一个想法就是使用Flatpak安装了GNOME Builder。 Flatpak的沙盒环境可能会影响对依赖项的访问。

更新:在评论中讨论之后,GNOME Builder使用的运行时就出现了问题。 Builder具有很强的功能,可以选择用于构建软件的Flatpak运行时。如果您正在关注传统的'通过在工作站上安装库和头文件进行开发,然后确保选择主机操作系统而不是Flatpak运行时。看来GNOME Flatpak运行时不包含libgee。

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

答案 1 :(得分:1)

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

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

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

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

4)通过 Yast2 。这与Zypper相同。

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

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

默认配置的缺点是导出捆绑是不可能的,但本地版本可以使用系统范围的功能。

那么什么是 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"
        }
      ]
    }
  ]
}

向正在开发此软件包的人们提供帮助。结合 Flatpak Meson Gtk3 / 4/5 /.. Vala Genie (很快 Vulkan 3D 图形引擎)和一个轻量级开发平台中精美简约的UI指南/标准是神奇的,类似于现代炼金术。

顺便说一下,我尝试使用Gtk3和许多语言,包括C / C ++,D,Haskell和Python,但这些替代品都不能产生像Vala一样紧凑,高效和有趣的独立二进制文件和精灵。这些是被大大低估的语言。

总结,任何在尝试理解这些技术时需要良好起点以及 Gnome-Builder 如何将它们组合在一起的人都可以阅读AlThomas&#39;发布上面和这一个,以及评论。它可以节省很多时间。