openage 在 FreeBSD 上的编译安装指南:依赖清单、编译器选择与构建流程
本篇指南面向 FreeBSD 用户,完整介绍在 FreeBSD 系统上从零编译 openage(《帝国时代 II》的开源引擎克隆实现)所需的软件包依赖、C++ 编译器选择方法以及完整的构建与运行流程。读者读完本文后,可以在 FreeBSD 上正确安装全部依赖、通过 ./configure 选择 clang 或 GCC 编译器,并完成 make、make test、make run 等全流程操作。
一、FreeBSD 编译环境概述
openage 由纯 C++ 库 libopenage 和 openage Python 包两部分构成,构建系统基于 CMake,并提供一个 autotools 风格的 ./configure 包装脚本(详见 doc/building.md 与 doc/buildsystem.md)。在 FreeBSD 上编译它需要准备好三类东西:
- 编译链:CMake、Python 3.9+、Cython、C++20 编译器(默认使用系统自带 clang,也可换成
pkg里的任意版本 GCC/Clang); - C++ 运行库依赖:Eigen、HarfBuzz、libpng、toml11、Qt6 等;
- Python 构建依赖:mako、numpy、lz4、pillow、pygments、toml、pylint 等,以及引擎配置语言 nyan。
下文以 FreeBSD 的官方包管理器 pkg 为主线,逐一给出安装命令,并结合源码说明这些依赖各自在构建中扮演的角色。
二、通过 pkg 安装全部系统依赖
FreeBSD 官方文档给出的安装命令是一次性安装所有必需软件包:
sudo pkg install cmake cython eigen3 harfbuzz opus-tools opusfile png py-mako py-numpy py-lz4 py-pillow py-pygments py-toml pylint python qt6 toml11
这条命令涵盖的软件包与 openage 构建/运行需求的对应关系如下(标签含义参考 doc/building.md 中的依赖约定:C=编译,R=运行,A=资源转换,S=静态检查,O=可选):
| pkg 包名 | 对应 openage 依赖 | 用途 |
|---|---|---|
cmake | cmake >= 3.16 | 构建系统核心(CMakeLists.txt 明确要求 cmake_minimum_required(VERSION 3.16)) |
cython | cython >= 3.0.10 | 将 openage/ 下的 .pyx 扩展编译为 C++(详见 buildsystem.md 的 cythonize 步骤) |
eigen3 | eigen >= 3 | 线性代数库,供坐标变换、矩阵运算使用 |
harfbuzz | harfbuzz | 复杂文本整形,引擎通过 find_package(HarfBuzz 1.0.0 REQUIRED) 强制要求(见 libopenage/CMakeLists.txt) |
opus-tools | opus / ogg | Opus 音频编码工具链 |
opusfile | opusfile | 解码 Opus 音频流(find_package(Opusfile REQUIRED)) |
png | libpng | 图像解码,find_package(PNG REQUIRED) 强依赖 |
py-mako | mako | 代码生成模板引擎,openage.codegen 用它渲染生成 C++ 源码 |
py-numpy | numpy | 资源转换流程(标签 A)中的数值处理 |
py-lz4 | lz4 | 资源转换时解压 lz4 压缩数据 |
py-pillow | pillow (PIL) | 转换 SLP 等原版图像格式为 PNG |
py-pygments | pygments | 代码高亮等工具支持 |
py-toml | toml | Python 侧读取 TOML 配置 |
pylint | pylint | 代码合规静态检查(make checkall 使用,见 doc/buildsystem.md) |
python | python >= 3.9 | 运行时与构建依赖(CMakeLists.txt 中 PYTHON_MIN_VERSION 定义为 3.9) |
qt6 | qt6 >= 6.2 | 图形界面(Core、Quick、QuickControls、Multimedia 模块),GUI 代码位于 assets/qml |
toml11 | toml11 | C++ 侧 TOML 配置解析,find_package(toml11 REQUIRED) 强制要求 |
三、安装 nyan(引擎配置语言依赖)
FreeBSD 官方文档明确指出,除了上述 pkg 包,还必须安装 nyan 及其依赖。nyan 是 openage 的引擎配置语言,负责描述游戏对象、组件与修改包(modpack)。
nyan 的安装有两种方式(详见 doc/building.md 的 "nyan installation" 一节):
- 开发模式(免安装):直接 clone nyan 仓库并按其构建说明编译。openage 的 CMake 会通过 CMake 用户包注册表(
~/.cmake/packages/nyan/)以及系统注册表(/usr/lib/cmake/nyan/)查找nyanConfig.cmake,因此无需make install即可被识别; - 自动下载:在配置阶段传入
./configure --download-nyan或cmake -DDOWNLOAD_NYAN=YES ...,由构建系统自动获取 nyan。
若 nyan 已安装但 CMake 找不到,可手动指定其位置:
./configure -- -Dnyan_DIR=/目录/包含/nyanConfig.cmake/的路径/
其中 -- 之后的参数会原样透传给 CMake(见 configure 中 raw_cmake_args 的处理逻辑)。
四、选择 C++ 编译器:clang 与 GCC 的切换
FreeBSD 的默认编译器是基础系统中的 clang,因此开箱即可编译 openage。此外,也可以使用 pkg 仓库中任意版本的 GCC(>= 10)或其他版本的 clang:
sudo pkg install gcc
切换编译器的入口是 ./configure --help:运行后可以查看全部配置选项,其中 --compiler / -c 参数用于指定 C++ 编译器可执行文件名。从 configure 的 get_compiler() 源码可知:
./configure -c clang会被映射为clang++,-c gcc会被映射为g++;- 支持带版本后缀的写法,例如
-c clang-18、-c gcc-13(源码中按-拆分后拼接-与版本号); - 若未显式指定,非 macOS 平台默认回退到
g++,FreeBSD 用户应显式指定编译器以避免歧义; - 环境变量
CXX也会被读取(--compiler的默认值来源)。
由于 ./configure 会为每一组编译器与优化参数组合创建独立的构建目录(默认位于 .bin/<编译器>-<模式>-<优化> 并通过 bin 符号链接暴露),在 clang 与 GCC 之间切换无需清空重建,只需用新的参数重新执行 ./configure 即可(详见 doc/buildsystem.md)。
五、完整构建与运行流程
依赖齐备、编译器选定后,按照以下步骤完成构建(流程与 doc/building.md 的 "Development" 一节一致):
# 1. 获取源码后,进入仓库根目录,选择编译器并生成构建目录
./configure -c clang # FreeBSD 默认编译器;想用 GCC 则改为 -c gcc
# 2. 生成并构建所有目标(含 codegen 生成 C++、pxdgen 生成 Cython 声明、编译 libopenage 与 Cython 扩展)
make
# 3. 运行内置测试
make test
# 4. 启动游戏(等价于 bin/run;首次运行会引导完成配置)
make run
构建产物的运行入口是 bin/run,支持多种运行模式(详见 doc/running.md):
bin/run game # 启动引擎并直接创建新游戏实例(默认模式)
bin/run test # 运行引擎内置测试与各子系统演示
bin/run convert # 从原版游戏安装转换资源为 openage modpack
bin/run convert-file # 转换单个媒体文件(图形转 PNG、音频转 OPUS)
bin/run codegen # 手动执行构建期的代码生成逻辑
若采用 Release 方式安装到系统目录,可参考 doc/building.md 的 "Release" 一节执行 ./configure --mode=release --compiler=clang --prefix=/usr/local 后 make install。官方建议优先使用发行版的 openage 软件包;对于 FreeBSD 而言,若本地没有现成包,则直接在 git 仓库内运行即可,无需 make install。
六、FreeBSD 平台相关的源码细节
从源码结构看,FreeBSD 在 openage 中有一系列平台相关处理,可作为编译排错时的参考依据:
- 链接
execinfo库:在 libopenage/CMakeLists.txt 中,当CMAKE_SYSTEM_NAME为FreeBSD时,构建系统会额外find_library(EXECINFO_LIB execinfo)并链接,用于支持错误处理模块的堆栈回溯(对应 libopenage/error/handlers.cpp 中__FreeBSD__分支); - PTY 支持:libopenage/util/pty.h 中 FreeBSD 走与 Linux 不同的头文件与接口分支;
- 系统级 API 差异:libopenage/util/os.cpp 对 FreeBSD 有专门的平台分支处理。
这些代码分支说明 FreeBSD 是 openage 持续支持的一等构建平台,编译时如遇与回溯、PTY 或系统 API 相关的错误,可优先检查上述文件对应的依赖(如 execinfo)是否已正确安装。
七、常见问题排查
参考 doc/building.md 的 Troubleshooting 一节,在 FreeBSD 上构建遇到问题时可按如下思路排查:
-
想看完整编译命令:
make VERBOSE=1; -
CMake 找不到 Qt/Python 等依赖:在构建目录运行
ccmake或cmake-gui查看并修改配置变量;也可以直接向./configure透传 CMake 参数,例如:./configure -- -DPython3_EXECUTABLE=/usr/local/bin/python3.11 -
报缺头文件:确认对应库的开发者版本(含头文件)已安装,例如
sudo pkg install eigen3(已含头文件); -
报
unable to execute .../clang++之类的 CMake 怪错:通常是直接调用 cmake 时对已初始化的构建目录重复指定编译器所致,去掉编译器定义或清理构建目录(rm -rf build bin .bin,注意从源码结构看实际构建目录为.bin/...的符号链接bin)后重新配置。
八、总结
在 FreeBSD 上构建 openage 的要点可归纳为三步:先用 pkg 一次性安装 freebsd.md 中列出的全部依赖并准备好 nyan;再通过 ./configure --help 选择 clang(默认)或 GCC >= 10 作为 C++ 编译器;最后执行 ./configure、make、make test、make run 完成构建、验证与启动。借助 ./configure 的独立构建目录机制,FreeBSD 用户可以自由地在多套编译器组合之间切换,无需担心互相污染。若在安装依赖或编译过程中遇到问题,可结合本文第六节的平台源码细节与第七节的排查清单快速定位。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



