3

我正在尝试用 flatpak 构建一个 Vala 程序。我需要连接到一个 mysql 服务器,这就是为什么我需要libmysqlclient与我的 flatpak 捆绑在一起。

这就是我添加mysql_config到 meson.build 文件中的原因。

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

i18n = import('i18n')

mysql_config = find_program('mysql_config')
mysql_vapi = meson.get_compiler('vala').find_library('mysql')
mysql_dep = declare_dependency(c_args: run_command([mysql_config, '--cflags']).stdout().split(),
                               link_args: run_command([mysql_config, '--libs']).stdout().split(),
dependencies: [mysql_vapi])

subdir('data')
subdir('src')
subdir('po')

meson.add_install_script('build-aux/meson/postinstall.py')

现在的问题是 mysql_config 在 flatpak 运行时中不可用。所以我需要将它与我的 flatpak 捆绑在一起。

然而,Flatpak 文档对我来说并不是很有帮助。

Flatpak 文档

模块

模块列表指定要作为构建过程的一部分构建的每个模块。其中一个模块是应用程序本身,其他模块是捆绑为 Flatpak 一部分的依赖项和库。虽然简单的应用程序可能只指定一个或两个模块,因此模块部分很短,但一些应用程序可以捆绑大量模块,因此模块部分很长。

GNOME Dictionary 的模块部分很短,因为它只包含应用程序本身,看起来像:

"modules": [   {
    "name": "gnome-dictionary",
    "sources": [
      {
        "type": "archive",
        "url": "https://download.gnome.org/sources/gnome-dictionary/3.26/gnome-dictionary-3.26.0.tar.xz",
        "sha256": "387ff8fbb8091448453fd26dcf0b10053601c662e59581097bc0b54ced52e9ef"
      }
    ]   } ]

可以看出,每个列出的模块都有一个名称(可以自由分配)和一个源列表。每个来源都有一个类型,可用的类型包括:

    archive - .tar or .zip archive files
    git - Git repositories
    bzr - Bazaar repositories
    file - local file (these are copied into the source directory)
    dir - local directory (these are copied into the source directory)
    script - an array of shell commands (these are put in a shellscript file)
    shell - an array of shell commands that are run during source extraction
    patch - a patch (are applied to the source directory)
    extra-data - data that can be downloaded at install time; this can include archive or package files

每种源类型都有不同的属性,这些属性在 Flatpak Builder 命令参考中列出。

有人可以告诉我如何添加libmysqlclient到我的 flatpak 以及如何使用mysql_config为我的 flatpak 设置正确的编译器标志。

这是我的清单(gnome-builder 默认):

{
    "app-id" : "org.gnome.Zeiterfassunggtk",
    "runtime" : "org.gnome.Platform",
    "runtime-version" : "3.28",
    "sdk" : "org.gnome.Sdk",
    "command" : "zeiterfassunggtk",
    "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" : [
        "/include",
        "/lib/pkgconfig",
        "/man",
        "/share/doc",
        "/share/gtk-doc",
        "/share/man",
        "/share/pkgconfig",
        "/share/vala",
        "*.la",
        "*.a"
    ],
    "modules" : [
        {
            "name" : "zeiterfassunggtk",
            "buildsystem" : "meson",
            "config-opts" : [
                "--libdir=lib"
            ],
            "builddir" : true,
            "sources" : [
                {
                    "type" : "git",
                    "url" : "file:///home/g.zehetner/Projekte/ZeiterfassungGtk"
                }
            ]
        }
    ]
}
4

1 回答 1

4

Flatpak 旨在通过使用容器化技术在 Linux 上分发应用程序。这允许 Flatpak 独立于当前的发行版,如 Ubuntu 和 Fedora。然而,创建 Flatpak 的人似乎需要培养一些分发打包者的技能。Flatpak 的依赖项放置在modules清单部分中,这些将被构建并包含在 Flatpak 中。以下内容未经测试,因此可能会丢失一些细节,但它旨在概述有助于提供帮助的想法。有几个选项:

libmariadb

MariaDB 是 MySQL 的一个分支。在担心甲骨文公司收购 MySQL 后被社区分叉。我首先列出了这个,因为它似乎是最简单的选择,至少从长远来看是这样。

MariaDB在 GitHub 上有发布。mariadb-connector-c出于某种原因,GitHub 不显示这些版本的校验和。所以MariaDB 基金会的下载部分在这里是一个更好的选择。mariadb-connector-c可以连接到 MariaDB 和 MySQL。

从源代码来看,构建系统mariadb-connector-c是 CMake。CMakeLists.txt 文件中有您可能需要的选项WITH_SSL,但下面的清单片段忽略了config-opts. 这个Flatpak GitHub 问题可能有一个有关如何config-opts用于 CMake 构建的相关示例。

所以我们有一个源版本,一个校验和,我们知道构建系统。通过在清单的部分中添加类似的modules内容,您应该能够mariadb-connector-c在您的 Flatpak 中包含一个构建:

{
  "name": "mariadb-connector-c",
  "buildsystem": "cmake",
  "sources": [
    {
      "type": "archive",
      "url": "https://downloads.mariadb.org/f/connector-c-3.0.8/mariadb-connector-c-3.0.8-src.tar.gz",
      "sha256": "2ca368fd79e87e80497a5c9fd18922d8316af8584d87cecb35bd5897cb1efd05"
    }
  ]
}

这也错过了cleanup关键。

主要问题是让它与你的 Vala 应用程序一起工作。该pkg-config文件称为libmariadb.pc. 因此,您的 VAPI 需要重命名为libmariadb.vapi. mysql.vapi您可以将from复制/usr/share/到本地应用程序源目录,然后重命名为libmariadb.vapi. 您将需要调整您的meson.build以将其包含为 VAPI 搜索目录,并且您不再需要搜索mysql_config. pkg-configmysql_config代替的工作。

看起来 MySQL C 头文件仍然是maria-connector-c. 手指交叉它只会工作。C 标头中有特定于 MariaDB 的附加符号。如果要修改 VAPI,请阅读手动编写 VAPI。请考虑稍后将您的增强提交到Vala 主线存储库

mysqlclient

MySQL 似乎需要下载服务器来构建客户端。我从这个页面开始,标题为Download Connector/C (libmysqlclient)。这建议 Linux 'Client Utilities Package 可从 MySQL Community Server 下载页面获得'。下载 MySQL 社区服务器页面未提及“客户端实用程序包”,仅允许下载服务器和 C 客户端的 300MiB+ 包。这就是为什么我建议从libmariadb长远来看该选项可能是更好的选项。还有一个页面MySQL Connector/C (Archived Versions),其中归档版本是 8.7M 下载。使用旧版本可能是一个更好的选择。

Flatpak 清单将类似于libmariadb. MySQL 源代码可从 GitHub 获得,也使用 CMake。

MySQL 8 的CMakeLists.txt文件确实显示pkg-config文件是mysqlclient.pc. 所以 Vala VAPI 真的应该是mysqlclient.vapi. 欢迎对 Vala 存储库的贡献来解决这个问题。通过使用pkg-config名称,您不再需要mysql_configmeson.build.

我还搜索了Flathub 存储库,以查看是否有其他项目正在使用mysqlclientlibmariadb在其清单中。什么也没找到。

纸板和胶带选项

如果您想要一个粗略的原型解决方案,那么 Flatpak 确实提供了一种simple构建类型。这允许运行命令,例如cp. 因此,更快的选择可能是将本地 MySQL 客户端文件复制到 Flatpak。这至少可以让您继续开发并重新为最终版本实施强大的解决方案。有关构建示例,请参阅此GitHub 问题LibreOffice Flathub 清单simple。此外,Flatpak 文件结构记录在Requirement and Conventions以及Flatpak 沙箱内的典型文件系统中

于 2018-09-30T20:26:01.717 回答