Flatpak Meson 无法从 Gnome Builder 中找到 Vala 库
Flatpak Meson Not Finding Vala Libraries From 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 设置为 dependency 或者 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 失败但找不到解决方案。
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 构建文档的 Vala page 中有更多详细信息。
Meson 版本 0.42 中添加了 Genie 支持。所以 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.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 有一个很棒的功能,就是能够 select 用于构建软件的 Flatpak 运行时。如果您通过在工作站上安装库和头文件来遵循 'traditional' 开发方式,请确保 主机操作系统 是 selected 而不是 Flatpak 运行时. GNOME Flatpak 运行时似乎不包含 libgee。
Update2: 当编写 Flatpak 构建器清单并且依赖项不在 Flatpak 中时 runtime/SDK 然后将依赖项作为另一个模块添加到 Flatpak 构建器清单中。这允许 GNOME Builder 使用 Flatpak 来构建带有 Flatpak 运行时的软件。 AsymLabs 回答中给出了示例清单。
经过一番探索和 AlThomas 的上述建议,我发现了以下内容。 OpenSUSE Tumbleweed 提供了四种(或更多)安装方式Gnome-Builder。它们是:
1) 通过 Gnome 软件中心。这会使用 Flatpak.
在沙盒环境中安装 org.gnome.Builder/stable
2) 通过 Flathub.org 从命令行使用 Flatpak。这会在 sand-boxed 环境中安装 org.gnome.Builder/master(每晚)。
3) 通过包管理器 zypper 和命令行。这将安装一个稳定的 Gnome-Builder 和相关的库 system-wide.
4) 通过 Yast2。这提供了与 Zypper 相同的功能。
所有三个安装(相同版本 3.26.4 - 不同 branches/tags - 稳定版、主版、夜间版 - 两个 sand-boxed 和一个系统范围)可以并排安装并根据需要使用。在初始设置和测试期间,所有变体都产生了相同的结果——当使用 Gee 和 GXml 时,只有 Default 构建可以工作(Flatpak Manifest 不会build) 但这已经解决了(现在看来这 纯粹是一个 Flatpak 问题 )。
Default 构建启用 Host 运行时系统。要设置 Default 构建环境,在 Gnome-Builder 中打开项目后,从左上角的弹出菜单中选择 Build Preferences,然后 select 默认.
默认配置的缺点是无法导出包,但本地构建可以利用system-wide 特征。
那么什么是 Flatpak Manifest,为什么它如此重要?它是包含项目信息的顶级 JSON 文件。 Flatpak Manifest,在本例中为 org.gnome.Example.json,汇集了项目的所有功能,因此它可以打包分发。这包括运行时、sdk、与 X11、IPC、Wayland、DBus 等的系统连接、构建系统(默认为 Meson)、清理指令、配置和构建选项、子模块详细信息(依赖项)和许多其他功能。一个 Flatpak 软件包几乎可以安装在任何 Linux 发行版中,例如 Debian、Ubuntu、Red Hat、OpenSuse 或其衍生产品,并且是 sand-boxed 出于安全性和可移植性目的。将来会完全 cross-platform.
对于指导和测试,有 Flatpak Manifest examples to illustrate how they work. There are ways to alter the sand-box permissions using build finish directives. Flatpak documentation 非常好。
首次创建项目时,在 Gnome Builder 中,选择 Vala + Gnome Application,然后将安装有效的 Flatpak Manifest。默认情况下,这适用于 GUI 而不是命令行应用程序; none尽管它会生成一个默认的 Flatpak Manifest,可以用作模板(Gnome Builder 将允许多个清单 - 只需 select 所需的构建)。以下是改进后的 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 guidlines/standards一个轻量级开发平台是一种神奇的东西,类似于现代炼金术。
顺便说一句,我尝试将 Gtk3 与多种语言一起使用,包括 C/C++、D、Haskell 和 Python,但 none 这些替代方案可以生成 stand-alone 个像 Vala 和 Genie 一样紧凑、高效且编写起来有趣的二进制文件。这些是被大大低估的语言。
最后,任何在尝试理解这些技术以及 Gnome-Builder 如何将它们结合在一起时需要良好起点的人都可以阅读 AlThomas 的 post上面和这个,连同评论。它可能会节省很多时间。
从 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 设置为 dependency 或者 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 失败但找不到解决方案。
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 构建文档的 Vala page 中有更多详细信息。
Meson 版本 0.42 中添加了 Genie 支持。所以 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.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 有一个很棒的功能,就是能够 select 用于构建软件的 Flatpak 运行时。如果您通过在工作站上安装库和头文件来遵循 'traditional' 开发方式,请确保 主机操作系统 是 selected 而不是 Flatpak 运行时. GNOME Flatpak 运行时似乎不包含 libgee。
Update2: 当编写 Flatpak 构建器清单并且依赖项不在 Flatpak 中时 runtime/SDK 然后将依赖项作为另一个模块添加到 Flatpak 构建器清单中。这允许 GNOME Builder 使用 Flatpak 来构建带有 Flatpak 运行时的软件。 AsymLabs 回答中给出了示例清单。
经过一番探索和 AlThomas 的上述建议,我发现了以下内容。 OpenSUSE Tumbleweed 提供了四种(或更多)安装方式Gnome-Builder。它们是:
1) 通过 Gnome 软件中心。这会使用 Flatpak.
在沙盒环境中安装 org.gnome.Builder/stable2) 通过 Flathub.org 从命令行使用 Flatpak。这会在 sand-boxed 环境中安装 org.gnome.Builder/master(每晚)。
3) 通过包管理器 zypper 和命令行。这将安装一个稳定的 Gnome-Builder 和相关的库 system-wide.
4) 通过 Yast2。这提供了与 Zypper 相同的功能。
所有三个安装(相同版本 3.26.4 - 不同 branches/tags - 稳定版、主版、夜间版 - 两个 sand-boxed 和一个系统范围)可以并排安装并根据需要使用。在初始设置和测试期间,所有变体都产生了相同的结果——当使用 Gee 和 GXml 时,只有 Default 构建可以工作(Flatpak Manifest 不会build) 但这已经解决了(现在看来这 纯粹是一个 Flatpak 问题
Default 构建启用 Host 运行时系统。要设置 Default 构建环境,在 Gnome-Builder 中打开项目后,从左上角的弹出菜单中选择 Build Preferences,然后 select 默认.
默认配置的缺点是无法导出包,但本地构建可以利用system-wide 特征。
那么什么是 Flatpak Manifest,为什么它如此重要?它是包含项目信息的顶级 JSON 文件。 Flatpak Manifest,在本例中为 org.gnome.Example.json,汇集了项目的所有功能,因此它可以打包分发。这包括运行时、sdk、与 X11、IPC、Wayland、DBus 等的系统连接、构建系统(默认为 Meson)、清理指令、配置和构建选项、子模块详细信息(依赖项)和许多其他功能。一个 Flatpak 软件包几乎可以安装在任何 Linux 发行版中,例如 Debian、Ubuntu、Red Hat、OpenSuse 或其衍生产品,并且是 sand-boxed 出于安全性和可移植性目的。将来会完全 cross-platform.
对于指导和测试,有 Flatpak Manifest examples to illustrate how they work. There are ways to alter the sand-box permissions using build finish directives. Flatpak documentation 非常好。
首次创建项目时,在 Gnome Builder 中,选择 Vala + Gnome Application,然后将安装有效的 Flatpak Manifest。默认情况下,这适用于 GUI 而不是命令行应用程序; none尽管它会生成一个默认的 Flatpak Manifest,可以用作模板(Gnome Builder 将允许多个清单 - 只需 select 所需的构建)。以下是改进后的 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 guidlines/standards一个轻量级开发平台是一种神奇的东西,类似于现代炼金术。
顺便说一句,我尝试将 Gtk3 与多种语言一起使用,包括 C/C++、D、Haskell 和 Python,但 none 这些替代方案可以生成 stand-alone 个像 Vala 和 Genie 一样紧凑、高效且编写起来有趣的二进制文件。这些是被大大低估的语言。
最后,任何在尝试理解这些技术以及 Gnome-Builder 如何将它们结合在一起时需要良好起点的人都可以阅读 AlThomas 的 post上面和这个,连同评论。它可能会节省很多时间。