用于 Linux 的 Swift UI 工具包。由 Vulkan 提供支持
AppKid 是一个开源应用程序开发框架,深受 Apple 的 AppKit 和 UIKit 的启发。它的初衷是为启用 X11 的 GNU/Linux 环境提供一个便捷的 SDK,用于构建 UI 应用程序。该框架完全使用 Swift 编写,使用 Vulkan 作为渲染后端,并依赖 X11 进行窗口管理和用户输入事件。
import AppKid
import Foundation
class RootViewController: ViewController {
override func viewDidLoad() {
super.viewDidLoad()
let label = Label(frame: CGRect(x: 0.0, y: 0.0, width: 320.0, height: 44.0))
label.text = "Hello World"
view.addSubview(label)
label.center = CGPoint(x: 160.0, y: 120.0)
}
}
@main
final class AppDelegate: ApplicationDelegate {
func application(_: Application, didFinishLaunchingWithOptions _: [Application.LaunchOptionsKey: Any]? = nil) -> Bool {
let window = Window(contentRect: CGRect(x: 0.0, y: 0.0, width: 320.0, height: 240.0))
window.title = "Hello World"
window.rootViewController = RootViewController()
return true
}
}
AppKid 依赖于多个开源项目。以下是在基于 Debian 的 Linux 发行版上设置这些项目的说明。基于 RPM 的说明将在稍后添加。
-
Swift 语言
-
从 swift.org 获取 tarball 包,将其解压到某个系统目录(如
/opt/swift
),并更新全局$PATH
变量sudo nano /etc/profile.d/10swift_path.sh
粘贴此内容
export PATH=/opt/swift/usr/bin:"${PATH}"`
其中
/opt/swift
是您的 swift 工具链的路径 -
或者,通过 swiftlang 构建 安装 swiftlang 包(不需要扩展
$PATH
变量)wget -qO - https://archive.swiftlang.xyz/install.sh | sudo bash sudo apt install swiftlang -y
-
-
Vulkan SDK
- 来自 LunarG 仓库的 Vulkan SDK LunarG 正在使用已弃用的 apt-key 来验证签名,因此此仓库通过
SupportingFiles
提供了更现代和安全的配置wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | gpg --dearmor | sudo tee -a /usr/share/keyrings/lunarg-archive-keyring.gpg sudo wget -q https://raw.githubusercontent.com/smumriak/AppKid/main/SupportingFiles/lunarg-vulkan-jammy.list -O /etc/apt/sources.list.d/lunarg-vulkan-jammy.list sudo apt update sudo apt install -y vulkan-sdk
- 或者,您可以尝试从 LunarG 提供的 tarball 安装 Vulkan SDK,或者如果您使用的是 Debian 12 及更高版本或 Ubuntu 23.04 及更高版本,则可以使用发行版仓库中的软件包来替代 LunarG 的 Vulkan SDK
sudo apt install -y \ libvulkan-dev \ vulkan-validationlayers \ glslc
glslc
编译器,该项目位于 此处。
- 来自 LunarG 仓库的 Vulkan SDK LunarG 正在使用已弃用的 apt-key 来验证签名,因此此仓库通过
-
系统库
sudo apt install -y \ libx11-dev \ libxi-dev \ libwayland-dev \ libcairo2-dev \ libpango1.0-dev \ libglib2.0-dev
-
用于着色器预处理的 libclang
注意: 由于着色器编译现在是管道的一部分,因此这现在是一个必需的依赖项
AppKid 正在为其内部着色器使用自己的 GLSL 方言。它通过自定义工具进行预处理,该工具构建在 libclang 之上。
安装 libclang 本身
sudo apt install -y \ libclang-15-dev
安装为 libclang 提供的软件包配置文件,因为 llvm 不提供该文件
sudo mkdir -p /usr/local/lib/pkgconfig sudo wget -q https://raw.githubusercontent.com/smumriak/AppKid/main/SupportingFiles/clang.pc -O /usr/local/lib/pkgconfig/clang.pc
如果您要安装不同版本的 libclang - 请相应地调整 clang.pc。
-
用于调试器支持的 libpython3.8
注意: 如果您不打算调试 Swift 代码,则可以跳过此步骤
Swift 的 LLDB 是使用 libpython3.8 构建的。在现代系统上,您可能会遇到 libpython3.9 或更高版本。只需从新版本到旧版本创建一个符号链接即可。但这并非理想选择,并且每次主要发行版更新时都会中断
cd /usr/lib/x86_64-linux-gnu sudo ln -sf libpython3.10.so libpython3.8.so.1.0
其中
libpython3.10.so
是当前安装的版本,而 libpython3.8.so.1.0 是 Swift 的 LLDB 构建所针对的文件名。
在设置必要的依赖项后,只需将此软件包添加到您的 SwiftPM 清单文件中作为依赖项,并将 AppKid 产品作为依赖项添加到您的目标
// swift-tools-version: 5.8
import PackageDescription
let package = Package(
name: "MyApp",
dependencies: [
.package(
url: "https://github.com/smumriak/AppKid",
branch: "main"
),
],
targets: [
.executableTarget(
name: "MyApp",
dependencies: [
.product(name: "AppKid", package: "AppKid")
])
]
)
非常欢迎贡献。在您深入之前,建议设置您的本地开发环境。
您可以使用提供的示例应用程序 AppKidDemo,它位于此仓库中,是产品之一。 AppKidDemo 用 swift 编写,并为 AppKid 开发提供示例环境。
appkiddemo_2.mp4
appkiddemo.mp4
在直接开始编写代码之前,需要进行一些开发设置。以下是如何为基于 Debian 的 Linux 或 macOS 设置开发环境的说明
- 按照在您的项目中开始使用 AppKid 中的步骤安装依赖项
- 就是这样
-
通过 AppStore 或 developer.apple.com 获取 Xcode
-
XQuartz
brew install xquartz
-
通过 lunarg.com 获取 Vulkan SDK
-
PKG_CONFIG_PATH 全局变量
更新全局
PKG_CONFIG_PATH
变量,以便命令行工具具有正确的 pkg-config 搜索路径sudo nano /etc/profile
粘贴此内容
export PKG_CONFIG_PATH="/opt/X11/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/lib:$PKG_CONFIG_PATH"
添加一个 launchctl 代理,该代理将更新每个用户会话的环境变量,以便 Xcode 可以找到正确构建项目所需的所有 pkg-config 文件
mkdir -p ~/Library/LaunchAgents curl -s https://raw.githubusercontent.com/smumriak/AppKid/main/SupportingFiles/environment.plist -o ~/Library/LaunchAgents/environment.plist launchctl load -w ~/Library/LaunchAgents/environment.plist
注意: 此文件不会被 TimeMachine 备份,因此您可能需要以其他方式为命令行工具扩展此环境变量
-
安装其他项目依赖项
brew install \ pkg-config \ cairo \ glib \ pango
此仓库中的所有项目都专门使用 Swift Package Manager。这意味着构建顶级产品就像这样简单
注意: 由于目前这是一个包含多个项目的 monorepo,因此建议通过向 swift 命令添加 --build-path 参数来使用专用构建目录
警告: 在 macOS 上无法运行使用 AppKid 构建的应用程序,并且没有计划这样做
swift build --product AppKid
运行也是如此
swift run --product AppKid
Utilities
目录下有其他脚本,其中包含预定义的构建、运行、清理和其他命令。
警告: 由于在纯 swift 项目中使用 vulkan-sdk 作为 C 库的问题,目前在 macOS 上构建已损坏
在 Linux 上,推荐的编写代码方式是使用 VSCode 或 VSCodium IDE。这样您将获得预配置的 LLDB 配置以构建和运行 AppKidDemo,与 Swift SourceKit LSP 的完全集成,以实现语法高亮、符号导航、自动完成,就像在 Xcode 中一样等等。这非常方便。
在 macOS 上,您可以在 VSCode/VSCodium 和 Xcode 之间进行选择。我建议通过 swift package generate-xcodeproj
生成 Xcode 项目并打开它,因为索引和构建目标生成速度更快,但您也可以在 Xcode 中打开 Packge.swift
,用户体验几乎相同。
swift package manager 中的 generate-xcodeproj 已弃用。它不再接收更新,并且在 Package.swift
文件中遇到插件定义时会抛出致命错误。打开 Package.swift
本身也不再真正有效,因为它只是没有在 Xcode 源代码树中显示任何本地子模块。
在 reporisotory 的根目录中提供了一个精心制作的 VSCode/VSCoium 配置,包括启动配置和许多任务,例如从 Vulkan 规范重新生成 Vulkan 实体接口一致性或重建 ContentAnimation 着色器。为了在 VSCode/VSCodium 中获得最佳体验,强烈建议安装以下扩展
- Swift
- CodeLLDB
- Camel Case Navigation
- SwiftFormat
- Launch Configs
- change-case
- Shader languages support
- psioniq File Header
本仓库中的代码根据 Apache-2.0 许可证分发。在创建拉取请求之前,请查看贡献
AppKid 正在使用以下开源项目
- Swift Collections,Apache-2.0 许可证
- cglm,MIT 许可证
- Swift Argument Parser,Apache-2.0 许可证
- XLMCoder,MIT 许可证
- swift-tools-support-core,Apache-2.0 许可证
- Vulkan Memory Allocator,MIT 许可证
- stb,MIT 许可证
- Vulkan SDK,Apache-2.0 许可证
- libXlib,X11 变体的 MIT 许可证
- libwayland,MIT "Expat" 许可证
- libCairo,LGPL-2.1 许可证
- libPango,LGPL-2.1 许可证
- libGlib,LGPL-2.1 许可证
- libclang,带有 LLVM 例外的 Apache-2.0 许可证