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

那就是为什么我在我的meson.build文件中添加了mysql_config的原因。

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')

现在的问题是,flatpak运行时无法使用mysql_config。因此,我需要将其与Flatpak捆绑在一起。

但是Flatpak文档对我不是很有帮助。

Flatpak Documentation

模组

模块列表指定要构建为的每个模块
构建过程的一部分。这些模块之一是应用程序
本身,其他模块是依赖项和库
捆绑在一起作为Flatpak的一部分。虽然简单的应用程序可能仅
指定一个或两个模块,因此有简短的模块部分,
一些应用程序可以捆绑多个模块,因此具有
冗长的模块部分。

GNOME词典的模块部分很短,因为它仅包含
应用程序本身,看起来像:
"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命令参考中列出。

有人可以告诉我如何在我的Flatpak中添加libmysqlclient以及如何使用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"
                }
            ]
        }
    ]
}

最佳答案

Flatpak旨在通过使用容器化技术在Linux上分发应用程序。这使得Flatpak可以独立于Ubuntu和Fedora等当前发行版。但是,创建Flatpak的人似乎需要发展发行打包程序的某些技能。 Flatpak的依赖关系放在清单的modules节中,这些依赖关系将被构建并包含在Flatpak中。以下内容未经测试,因此某些细节可能会丢失,但是其目的是概述可以帮助您的想法。有几种选择:
libmariadb
MariaDB是MySQL的分支。由于担心甲骨文公司(Oracle Corporation)对MySQL的收购,社区对此进行了分叉。我之所以将其列出来是因为它似乎是最简单的选择,至少从长远来看。

MariaDB在GitHub上有releases of mariadb-connector-c 。出于某些原因,GitHub不显示这些版本的校验和。因此,MariaDB Foundation's download section是一个更好的选择。 mariadb-connector-c可以连接到MariaDB和MySQL。

通过查看源代码,mariadb-connector-c的构建系统是CMake。您可能需要CMakeLists.txt file中的某些选项(例如WITH_SSL),但下面的清单片段忽略了config-opts的使用。这个Flatpak GitHub issue可能有一个有关如何将config-opts用于CMake构建的相关示例。

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

{
  "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/usr/share/复制到本地应用程序源目录,并重命名为libmariadb.vapi。您将需要调整meson.build以使其包含在VAPI搜索目录中,并且您不再需要搜索mysql_configpkg-config将代替mysql_config的工作。

看起来MySQL C头文件仍然是maria-connector-c的一部分。手指交叉它会起作用。 C标头中还有特定于MariaDB的其他符号。如果要修改VAPI,请阅读Writing a VAPI Manually。请考虑将您的增强功能提交给Vala mainline repository
mysqlclient
MySQL似乎只需要下载服务器即可构建客户端。我从标题为Download Connector/C (libmysqlclient)的页面开始。这建议Linux“可从MySQL Community Server下载页面获得客户端实用程序包”。 Download MySQL Community Server page没有提到“客户端实用程序包”,仅允许下载服务器和C客户端的300MiB +包。这就是为什么我建议从长远来看libmariadb选项可能更好。还有一个页面MySQL Connector/C (Archived Versions),其中存档版本是870万下载。首先,使用旧版本可能是一个更好的选择。

Flatpak清单与libmariadb的清单类似。 MySQL source is available from GitHub也使用CMake。

MySQL 8的 CMakeLists.txt 文件确实显示pkg-config文件为mysqlclient.pc。因此,Vala VAPI应该确实是mysqlclient.vapi。欢迎对Vala存储库进行贡献以解决此问题。通过使用pkg-config名称,您不再需要在mysql_config中找到meson.build

我还搜索了Flathub repository,以查看其他项目是否在清单中使用了mysqlclientlibmariadb。一无所获。

纸板和胶带选件

如果您想要一个粗糙的原型解决方案,那么Flatpak确实提供了simple构建类型。这样可以运行命令,例如cp。因此,更快的选择是将本地MySQL客户端文件复制到Flatpak。这至少将使您能够继续进行开发,并返回到为最终版本实施可靠的解决方案。有关simple构建的示例,请参见GitHub issueLibreOffice Flathub manifest。 Flatpak文件结构也记录在Requirement and Conventionstypical filesystem inside a Flatpak sandbox中。

08-24 17:26