SwiftGtk

围绕 gtk-3.x 和 gtk-4.x 的 Swift 包装器,主要从 gobject-introspection 自动生成。本项目旨在使 gtk 比使用纯 C 语言接口更 “swifty”。有关最新的(自动生成)参考文档,请参阅 https://rhx.github.io/SwiftGtk/

macOS 11 build macOS 10.15 build macOS gtk4 build Ubuntu 20.04 build Ubuntu 18.04 build

最新动态?

通过 gtk4 分支添加了对 gtk 4 的支持。

gir2swift 的版本 15 提供了 Package Manager Plugin。这需要 Swift 5.6 或更高版本(旧版本可以通过 swift52 分支使用)。

用法

通常,您不会直接构建此软件包(但为了测试您可以 - 请参阅下面的“构建”)。相反,您需要使用 Swift Package Manager 将 SwiftGtk 嵌入到您自己的项目中。安装先决条件(请参阅下面的“先决条件”)后,您可以通过创建一个新的空项目文件夹,然后运行 projgen.sh 脚本来完成此操作,例如

mkdir MyProject
cd MyProject
curl -L https://git.io/SwiftGtk3.sh | sh

之后,您应该能够在您的源代码中 import Gtk 并使用 swift build 来构建您的项目。或者,您可以手动下载 run-gir2swift.sh 并将 SwiftGtk 作为依赖项添加到您的 Package.swift 文件中,例如

// swift-tools-version:5.6

import PackageDescription

let package = Package(name: "MyPackage",
    dependencies: [
        .package(url: "https://github.com/rhx/gir2swift.git", branch: "main"),
        .package(url: "https://github.com/rhx/SwiftGtk.git",  branch: "gtk3"),
    ],
    targets: [
        .target(name: "MyPackage",
                dependencies: [
                    .product(name: "Gtk", package: "SwiftGtk")
                ]
        )
    ]
)

对于 gtk4,将 .branch("gtk3") 替换为 .branch("gtk4")

示例

您可以在 GitHub 上找到一些示例项目,展示如何使用 SwiftGtk

构建脚本

演示应用程序附带构建脚本,这些脚本配置了一些环境变量,并在调用 swift buildswift package 等时传递必需的参数。最简单的入门方法是克隆以下项目之一,然后将所有 *.sh shell 脚本复制到您自己的项目中。此外,如果您希望能够构建桌面应用程序,请创建一个 Resources 文件夹,并复制(至少)Info.plist 文件。

您可以使用常用的 Swift 编译器命令构建、测试或运行您的项目

swift build
swift test
swift run

您也可以在 macOS 上使用 Xcode 构建项目。为此,您需要首先创建一个 Xcode 项目,然后在 Xcode IDE 中打开该项目

./xcodegen.sh
open MyPackage.xcodeproj

之后,使用(常用的)“构建”和“测试”按钮来构建/测试此软件包。请注意,在此阶段,Swift Package Manager 无法为 Xcode 创建 App targets(因此,要构建 macOS 应用程序而不仅仅是命令行可执行文件,您仍然需要使用 build.sh 脚本,该脚本调用 app-wrapper.sh 来创建独立的应用程序捆绑包)。

先决条件

Swift 5.6 或更高版本

要构建,请从 https://swiftlang.cn/download/ 下载 Swift -- 如果您使用的是 macOS,请确保您也安装了命令行工具)。使用 swift --version 测试您的编译器是否工作,它应该给您类似这样的输出

$ swift --version
swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx13.0

在 macOS 上,或者在 Linux 上,您应该得到类似这样的输出

$ swift --version
Swift version 5.10 (swift-5.10-RELEASE)
Target: x86_64-unknown-linux-gnu

Gtk 3.22 或更高版本

Swift 包装器已在 glib-2.56、2.58、2.60、2.62、2.64、2.66、2.68、2.70、2.72、2.74、2.76、2.78 和 2.80 以及 gdk/gtk 3.22、3.24 以及 gtk4 分支上的 4.0、4.2、4.4、4.6、4.8、4.10、4.12 和 4.14 上进行了测试。它们应该适用于更高版本,但 YMMV。 还要确保您安装了 gobject-introspection 及其 .gir 文件。

Linux

Ubuntu

在 Ubuntu 22.04、20.04 和 18.04 上,您可以使用发行版附带的 gtk。只需使用 apt 包管理器安装即可

sudo apt update
sudo apt install libgtk-3-dev gir1.2-gtksource-3.0 libcogl-pango-dev libcogl-path-dev libcogl-dev libpango1.0-dev gir1.2-pango-1.0 libgdk-pixbuf2.0-dev gir1.2-gdkpixbuf-2.0 libgraphene-1.0-dev gir1.2-graphene-1.0 libglib2.0-dev glib-networking gobject-introspection libgirepository1.0-dev libxml2-dev jq

Ubuntu 18.04 还要求您安装 libcogl-gles2-dev

Fedora

在 Fedora 上,您可以使用发行版附带的 gtk。只需使用 dnf 包管理器安装即可

sudo dnf install gtk3-devel pango-devel cairo-devel cairo-gobject-devel glib2-devel gobject-introspection-devel libxml2-devel jq

macOS

在 macOS 上,您可以使用 HomeBrew 安装 gtk(有关设置说明,请参阅 https://brew.sh.cn)。一旦您安装了运行的 HomeBrew,您就可以使用它来安装 gtk 的原生版本

brew update
brew install gtk+3 glib glib-networking gobject-introspection pkg-config jq

构建

如上面的“用法”部分所述,您通常不会直接构建此软件包,而是将其嵌入到您自己的项目中。但是,您可以单独构建和测试此模块,以确保一切正常。确保您已安装所有先决条件(见上文)。之后,您可以简单地克隆此存储库并构建命令行可执行文件(请耐心等待,这将下载所有必需的依赖项并花费一些时间来编译),使用

git clone https://github.com/rhx/SwiftGtk.git
cd SwiftGtk
swift build
swift test

文档

您可以在 docs 文件夹中找到参考文档。这是使用 jazzy 工具生成的。如果您想生成您自己的文档,以匹配您的本地安装,您可以使用存储库中的 generate-documentation.sh 脚本。确保您已安装 sourcekittenjazzy,例如在 macOS 上

brew install sourcekitten
sudo gem install jazzy
./generate-documentation.sh

故障排除

以下是您可能遇到的一些常见错误以及如何修复它们。

SwiftGtk 构建时间非常长

是的,gtk 是一个庞然大物。从 gtk 头文件生成的 Swift 接口接近 300,000 行。这需要一些时间来构建!

缺少 .gir 文件

如果您收到类似这样的错误

Girs located at
Cannot open '/GLib-2.0.gir': No such file or directory

请确保您已安装相关的 gobject-introspection 软件包(如“先决条件”部分所述),包括它们的 .gir.pc 文件。

旧的 Swift 工具链或 Xcode

如果您在运行 swift build 时遇到 Segmentation fault (core dumped) 或循环依赖错误,例如

warning: circular dependency detected while parsing pangocairo: harfbuzz -> freetype2 -> harfbuzz

这可能意味着您的 Swift 工具链太旧,尤其是在 Linux 上(在撰写本文时,至少需要 Swift 5.6)。确保当您运行 Swift 编译器时,找到的是最新的工具链(见上文)。

如果您获得旧版本,请确保在您的 PATH 中首先找到正确版本的 swift 编译器。在 macOS 上,使用 xcode-select 选择并安装最新版本,例如

sudo xcode-select -s /Applications/Xcode.app
xcode-select --install