菜单

交叉编译

相关源文件

本文档解释了交叉编译过程,即在一个平台上构建 scrcpy 以在另一个平台上运行。交叉编译主要用于在 Linux 系统上构建 Windows 二进制文件,但该过程也涵盖了为 macOS 上的不同架构进行构建。

scrcpy 中的交叉编译概述

交叉编译使 scrcpy 能够保持一致的构建过程,同时为多个目标平台生成二进制文件。这对于创建官方发布和确保跨平台的构建可重复性尤其重要。

来源: cross_win64.txt cross_win32.txt release/build_windows.sh release/build_linux.sh release/build_macos.sh

交叉编译配置

Scrcpy 使用 Meson 的交叉文件格式来定义交叉编译环境。主要使用两个配置文件

Windows 交叉编译配置

这些文件指定了 Windows 构建的编译器工具链和目标系统

配置文件目标描述
cross_win32.txt32 位 Windows指定 i686 架构和 MinGW 工具链
cross_win64.txt64 位 Windows指定 x86_64 架构和 MinGW 工具链

这两个文件都遵循 Meson 的交叉文件格式,包含 binaries(定义编译器和工具)和 host_machine(指定目标系统属性)部分。

来源: cross_win64.txt cross_win32.txt

交叉编译构建流程

交叉编译构建过程由 shell 脚本协调,这些脚本执行以下操作:

  1. 设置构建环境
  2. 构建或获取依赖项
  3. 使用 Meson 和相应的交叉文件配置构建
  4. 编译应用程序
  5. 打包结果

Windows 构建流程

Windows 构建过程由 release/build_windows.sh 触发,并支持 32 位和 64 位目标。

来源: release/build_windows.sh .github/workflows/release.yml126-186

该脚本处理以下事项:

  1. 从命令行参数确定架构(32/64 位)
  2. 构建或获取与 Windows 兼容的依赖项
    • SDL2
    • dav1d
    • FFmpeg
    • libusb
    • 适用于 Windows 的 ADB
  3. 使用适当的交叉文件设置 Meson 构建
  4. 使用 Ninja 运行构建
  5. 将输出文件收集到分发目录中

Windows 构建脚本的关键部分

meson setup "$WINXX_BUILD_DIR" \
    --pkg-config-path="$DEPS_INSTALL_DIR/lib/pkgconfig" \
    -Dc_args="-I$DEPS_INSTALL_DIR/include" \
    -Dc_link_args="-L$DEPS_INSTALL_DIR/lib" \
    --cross-file=cross_$WINXX.txt \
    --buildtype=release \
    --strip \
    -Db_lto=true \
    -Dcompile_server=false \
    -Dportable=true

来源: release/build_windows.sh33-42

特定平台的构建系统

Scrcpy 为多个目标平台实现了构建脚本

脚本目标平台交叉编译
build_windows.shWindows (32/64 位)是的,在 Linux 上使用 MinGW
build_linux.shLinux (x86_64)否,原生构建
build_macos.shmacOS (x86_64, aarch64)否,但支持不同架构

macOS 构建流程

尽管严格来说不是交叉编译,但 macOS 构建同时支持 Intel (x86_64) 和 Apple Silicon (aarch64) 架构

来源: release/build_macos.sh .github/workflows/release.yml188-273

依赖管理

依赖项对交叉编译过程至关重要。每个依赖项都由 app/deps/ 目录下的特定脚本处理

依赖脚本目的
adb_windows.sh, adb_linux.sh, adb_macos.sh下载特定平台的 ADB 二进制文件
sdl.sh为目标平台构建 SDL2 库
dav1d.sh为目标平台构建 dav1d AV1 解码器
ffmpeg.sh为目标平台构建 FFmpeg 库
libusb.sh为目标平台构建 libusb

每个依赖脚本都支持原生构建和交叉编译场景。

来源: app/deps/dav1d.sh25-68 app/deps/adb_windows.sh app/deps/adb_linux.sh app/deps/adb_macos.sh

CI/CD集成

交叉编译过程已集成到 CI/CD 管道中,使用了 GitHub Actions。 .github/workflows/release.yml 中的工作流协调了以下操作:

  1. 构建 scrcpy 服务器组件
  2. 为多个平台进行交叉编译
    • Windows 32 位和 64 位
    • Linux x86_64
    • macOS x86_64 和 aarch64
  3. 为分发打包构建
  4. 生成校验和以便验证

来源: .github/workflows/release.yml release/generate_checksums.sh

交叉编译故障排除

交叉编译的常见问题包括:

  1. 缺少依赖项:确保所有必需的软件包都已安装在主机系统上。

    sudo apt install mingw-w64 mingw-w64-tools libz-mingw-w64-dev
    
  2. 路径问题:交叉编译时,确保为交叉编译环境正确指定了路径。

    • 使用 --pkg-config-path 指向交叉编译的依赖项。
    • 使用 -Dc_args-Dc_link_args 显式指定包含和库路径。
  3. 版本兼容性:确保交叉编译的依赖项与目标平台兼容。不同的 Windows 版本可能需要特别考虑。

  4. ABI 兼容性:注意应用程序二进制接口 (ABI) 的兼容性,尤其是在交叉编译 Windows 时。

来源: cross_win64.txt1-2 cross_win32.txt1-2 release/build_windows.sh33-42