ValveSoftware/Proton
GitHub: ValveSoftware/Proton
Proton 是基于 Wine 的 Steam 兼容层工具,解决 Linux 下运行 Windows 游戏的问题。
Stars: 30892 | Forks: 1389
## 简介
**Proton** 是一个用于 Steam 客户端的工具,它允许在 Linux 操作系统上运行原本
仅限 Windows 的游戏。它通过使用 Wine 来实现这一功能。
**大多数用户** 应该直接使用 Steam 客户端自带的 Proton。如需更多细节,请参考
[此篇 Steam 社区文章][steam-play-introduction]。
源代码的提供是为了让高级用户能够修改 Proton。例如,某些用户可能希望针对特定游戏
使用不同版本的 Wine。
**更新日志** 可在 [我们的维基][changelog] 上查阅。
## 获取 Proton 源代码
通过克隆 并检出你所需的分支来获取 Proton 源代码。
你可以使用以下命令将最新的 Proton 克隆到你的系统:
```
git clone --recurse-submodules https://github.com/ValveSoftware/Proton.git proton
```
切换分支时请务必更新子模块:
```
git checkout experimental_6.3
git submodule update --init --recursive
```
如果你需要修改任何子组件,现在就可以进行。例如,若要修改 Wine,
请在 `wine/` 目录下进行操作。
## 构建 Proton
Proton 的主要构建过程在 Proton SDK 容器内完成,对主机依赖极少。
## 准备构建环境
你需要安装 Docker 或 Podman。我们强烈推荐使用[无根 Podman 设置][rootless-podman]。
请参考你的发行版文档获取安装说明(例如 Arch 的 [Podman][arch-podman] /
[Docker][arch-docker],Debian 的 [Podman][debian-podman] /
[Docker][debian-docker])。
## 简便方式
我们提供了一个顶层 Makefile,可以自动执行大部分构建命令。
在克隆仓库并更新其子模块后,假设你已有一个可用的 Docker 或 Podman 环境,
可以通过一条简单命令构建并安装 Proton:
```
make install
```
如果构建系统缺少依赖项,它会快速失败并显示清晰的错误信息。
构建完成后,你可能需要重启 Steam 客户端才能看到新的 Proton 工具。
该工具在 Steam 客户端中的名称将基于当前检出的 Proton 分支。你可以使用
`build_name` 变量来覆盖此名称。
运行 `make help` 可查看其他构建目标和选项。
## 手动构建
### 配置构建
```
mkdir ../build && cd ../build
../proton/configure.sh --enable-ccache --build-name=my_build
```
运行 `configure.sh` 将创建一个 `Makefile`,用于构建 Proton。
该脚本会检查容器是否正常工作,并在缺少主机依赖时提示你。
你应该在一个专门为构建创建的目录中运行此命令。
配置脚本会尝试查找可用的 Docker 或 Podman 环境,但你可以使用
`--container-engine=` 强制指定兼容的引擎。
你可以通过 `--enable-cache` 标志启用 ccache。这会将你的
`$CCACHE_DIR` 或 `$HOME/.ccache` 挂载到容器内。
`--proton-sdk-image=registry.gitlab.steamos.cloud/proton/soldier/sdk:`
可用于使用自定义版本的 Proton SDK 镜像进行构建。
请查看 `--help` 获取更多配置选项。
**注意**:如果启用了 **SELinux**,Proton 构建容器可能无法访问你的用户文件。
这是由 [SELinux 的文件系统标签][selinux-labels] 引起的。
你可以传递 `--relabel-volumes` 开关给 configure,让 [容器引擎重新标记其
绑定挂载][bind-mounts],从而允许容器内访问这些文件。
在处理系统目录时请谨慎操作,并参考容器引擎的手册。
### 构建
```
make
```
**重要 make 目标:**
`make install` - 将 Proton 安装到当前用户的 Steam 目录,详见 [本地安装 Proton
部分](#install-proton-locally) 的详细说明。
`make redist` - 创建一个可分发构建(`redist/`),可复制到
`~/.steam/root/compatibilitytools.d/`。
`make deploy` - 创建一个部署构建(`deploy/`)。这是我们用于通过 Steamworks
向 Steam 用户部署 Proton 的方式。
`make module= module` - 构建指定模块的 32 位和 64 位版本。这允许对单个模块
进行快速迭代。此目标仅在构建完 Proton 后才有用。
`make dxvk` / `make vkd3d-proton` - 重新构建 DXVK / vkd3d-proton。
### 查明构建失败的原因
Proton 构建系统会并行调用多个子项目的构建。如果某个子项目失败,
在其他顶层退出之前可能会有数千行输出。这会使找出构建失败的真正原因变得困难。
追加 `2>&1 | tee build.log` 可以将完整的构建输出记录到 `build.log` 文件中。
从文件底部向上搜索包含 `Error` 的内容,可以定位到问题区域。例如:
```
make 2>&1 | tee build.log
grep -n '] Error [0-9]' build.log
```
```
11220:make: *** [../Makefile.in:465: /builds/proton/proton/build-dir/.kaldi-i386-configure] Error 1
12427:make: *** [../Makefile.in:1323: deploy] Error 2
```
### 调试构建
为防止符号剥离,请在 `make` 调用中添加 `UNSTRIPPED_BUILD=1`。
这应仅用于干净的构建目录。
例如:
```
mkdir ../debug-proton-build && cd ../debug-proton-build
../proton/configure.sh --enable-ccache --build-name=debug_build
make UNSTRIPPED_BUILD=1 install
```
### ARM64 构建
你需要一个 ARM64 构建机器,并传递 `--target-arch=arm64` 给 `configure.sh`。
无法在通过 FEX 运行的 x86 Steam 中使用生成的构建结果。
## 本地安装 Proton
Steam 自带多个 Proton 版本,游戏默认使用这些版本,或可在 Steam 设置中的 Steam Play 页面选择。
Steam 也支持使用本地构建的 Proton 来运行游戏,你可以将其安装到本地机器。
要将本地构建的 Proton 安装到 Steam,请在
`~/.steam/root/compatibilitytools.d/` 下创建一个以你选择的工具名称命名的目录,
并将包含可分发构建的目录放置在该路径下。
`make install` 目标会自动完成此操作,将 Proton 构建安装到当前用户的 Steam 文件夹中。
你需要重启 Steam 客户端才能使其识别新的工具。
一个正确的本地工具安装示例如下:
```
compatibilitytools.d/my_proton/
├── compatibilitytool.vdf
├── filelock.py
├── LICENSE
├── proton
├── proton_dist.tar
├── toolmanifest.vdf
├── user_settings.sample.py
└── version
```
要在 Steam 中启用本地构建,请进入设置窗口的 Steam Play 部分。
如果构建已正确安装,你应该能在兼容性工具的下拉列表中看到
"proton-localbuild"。
该软件的每个组件均在各自许可证条款下使用。
请参阅此处的 `LICENSE` 文件,以及每个子模块和目录中的 `LICENSE`、`COPYING` 等文件以了解详细信息。
如果你向其他用户分发 Proton 的构建版本,必须遵守这些许可证条款。
## 调试
默认情况下,Proton 构建会剥离符号信息。你可以在 Steam 中切换到
"debug" 测试分支(在你的资料库中搜索 Proton,
属性... -> 测试版 -> 选择 "debug")或构建时不剥离符号(详见
[调试构建部分](#debug-builds))。
符号信息通过配套的 `.debug` 文件提供,可能需要调试工具显式加载。
对于 GDB,可以使用 `wine/tools/gdbinit.py` 脚本(需引用)提供的
`load-symbol-files`(或简写为 `lsf`)命令来加载所有已映射文件的符号。
有关调试技巧,请参考 [docs/DEBUGGING-LINUX.md](docs/DEBUGGING-LINUX.md)
和 [docs/DEBUGGING-WINDOWS.md](docs/DEBUGGING-WINDOWS.md)。
## `compile_commands.json`
用于 [clangd](https://clangd.llvm.org/) LSP 服务器及相关工具。
使用 CMake 或 Meson 构建的项目(例如 vkd3d-proton)会自动生成
`compile_commands.json`。Wine 也会通过 `makedep` 自动生成该文件。
Proton 的构建系统会将所有 `compile_commands.json` 文件收集到构建目录下的
`compile_commands/` 子目录中。
路径会被转换为指向真实源文件(即非 rsync 副本)。不过,它仍可能依赖构建目录
中的内容,例如自动生成的 `config.h`,因此对于 Wine,可能需要在源目录中运行
`tools/make_requests`,因为这些更改不会被提交。
之后,你可以通过多种方式配置编辑器以使用该文件进行 clangd:
1. 直接指定路径——某些编辑器/插件允许你直接指定 `compile_commands.json` 的路径;
2. 通过 `.clangd` 文件,例如:
```
cd src/proton/wine/
cat > .clangd <
标签:Docker, Linux 平台游戏, Linux 游戏, Makefile, Podman, Proton, Steam Play, Steam 客户端, ValveSoftware, Windows 兼容层, Windows 游戏, Wine, 依赖管理, 兼容性工具, 子模块, 安全可观测性, 安全防御评估, 容器化构建, 开源, 游戏兼容, 游戏兼容性工具, 源码构建, 版本控制, 请求拦截, 逆向工具, 高级用户自定义