cool-retro-term构建系统详解:.pro工程文件与Qt项目构建全流程
【免费下载链接】cool-retro-termA good looking terminal emulator which mimics the old cathode display...项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term
cool-retro-term 是一款模拟老式阴极射线管(CRT)显示效果的复古终端模拟器,基于Qt6 + QML + OpenGL 着色器实现。它采用经典的qmake .pro 工程文件组织构建,整条构建流程由根目录的 cool-retro-term.pro 统一编排。本文带你从零看懂这套构建系统:.pro 文件如何声明模块、如何编译着色器、如何安装产物,并给出完整的 qmake 构建命令。
1️⃣ 获取源码:克隆仓库并初始化子模块
项目依赖两个 Git 子模块,克隆后必须初始化,否则qmltermwidget目录会是空的:
git clone https://gitcode.com/GitHub_Trending/co/cool-retro-term cd cool-retro-term git submodule update --init --recursive两个子模块分别承担不同职责(定义见 .gitmodules):
| 子模块 | 作用 |
|---|---|
qmltermwidget | QML 版终端控件(Konsole qtermwidget 的移植),提供终端核心渲染 |
KDSingleApplication | KDAB 的单实例应用库,防止重复启动多开窗口 |
💡 仓库中 qmltermwidget/ 目录在浅克隆下是空的,属正常现象,
--recursive参数会自动拉取内容。
2️⃣ 根工程文件:subdirs 多目录编排
顶层 cool-retro-term.pro 只有 11 行,却定义了构建的骨架:
TEMPLATE = subdirs CONFIG += ordered SUBDIRS += qmltermwidget SUBDIRS += app三个关键指令:
TEMPLATE = subdirs:声明这是一个"子目录工程",qmake 会先展开所有.pro,再生成一个总 Makefile 统一调度;CONFIG += ordered:保证按书写顺序串行构建——先编译qmltermwidget静态库,再编译app可执行程序(因为 app 链接依赖前者);INSTALLS += desktop:安装时把 cool-retro-term.desktop 放入/usr/share/applications,让桌面环境能识别并显示应用条目。
这种"薄根工程 + 厚子工程"的结构是 Qt 多组件项目的标准做法,每个子目录各自维护自己的.pro,职责清晰。
3️⃣ 主程序工程:app/app.pro 逐段解读
app/app.pro 是整个构建系统的核心,可拆成 5 个功能区块。
3.1 Qt 模块与版本号自动注入
QT += qml quick widgets sql quickcontrols2 TARGET = cool-retro-term APP_VERSION = $$system(git -C $$PWD/.. describe --tags --always --dirty=-dirty) DEFINES += APP_VERSION=\\\"$$APP_VERSION\\\"QT +=一行声明了全部依赖的 Qt 模块:quick/quickcontrols2(QML 界面)、sql(配置存储)、widgets(菜单等桌面组件);$$system(...)在构建期调用git describe --tags,把最近的 Git Tag 编译进二进制,没有 Tag 时回退为unknown。运行时 app/main.cpp 通过APP_VERSION宏提供--version输出——版本号零维护,天然与代码仓库同步。
3.2 C++ 源码与单实例库
SOURCES += main.cpp \ fileio.cpp \ fontmanager.cpp \ fontlistmodel.cpp应用层 C++ 代码很薄(界面全在 QML),只包含文件读写、字体管理等辅助类。同时通过 app/app.pro 将KDSingleApplication子模块的 2 个.cpp直接编入本目标,并用KDSINGLEAPPLICATION_STATIC_BUILD宏静态链接——避免额外安装一个动态库。
3.3 资源文件打包
RESOURCES += qml/resources.qrcapp/qml/resources.qrc 把 20+ 个 QML 组件、18 套复古字体(IBM 3278、Cozette、Atari 400 等)、噪点贴图以及全部编译好的着色器文件打进 Qt 资源系统。qrc文件在编译期生成 C++ 数组,资源随可执行文件分发,运行时不依赖文件路径。
3.4 着色器编译:Qt Shader Baker 定制编译器(最精彩的部分)
cool-retro-term 的 CRT 效果全靠 GPU 着色器。Qt 6 提供Qt Shader Baker(qsb)工具,把 GLSL 源码一次性编译为跨平台二进制格式(.qsb,支持 GLSL/HLSL/Metal)。app/app.pro 通过QMAKE_EXTRA_COMPILERS注册了自定义构建步骤:
qsb.commands = $$QSB_BIN --glsl "100 es,120,150" --hlsl 50 --msl 12 --qt6 \ -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}更巧妙的是着色器变体批量生成(见 app/app.pro):两个"模板着色器"不参与普通编译,而是被 qmake 的四层for循环展开成带宏定义的独立编译任务:
- 动态效果
terminal_dynamic.frag:raster 0~4 × burn 0/1 × frame 0/1 × chroma 0/1→40 个变体(对应屏幕扫描线强度、烧屏、外框、RGB 色散开关); - 静态效果
terminal_static.frag:rgb × bloom × curve × shine各 2 档 →16 个变体。
每个变体通过-DCRT_RASTER_MODE=...等预定义宏生成专用二进制(如terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb),运行时按设置选择已编译版本,避免了 GPU 端动态分支的性能开销——这就是你在 app/shaders/ 目录里看到几十个.qsb文件的来龙去脉。着色器入口 terminal_dynamic.frag 中的#ifndef默认值定义了各宏的缺省行为。
🎯 注释里还透露了未来计划:项目正在向 CMake 迁移,届时将改用 KDSingleApplication 自带的 CMakeLists.txt(见 app/app.pro 的 TODO 说明)。
3.5 安装规则
target.path += /usr/bin/ INSTALLS += target加上 unix 分支的 32/64/128/256 四档 hicolor 图标(app/app.pro)与 macOS 的.icns图标,make install后即可得到系统级可用的完整应用。
4️⃣ 构建全流程:三条命令跑通
前置条件:已安装Qt6 开发包(含 qmake、qsb 工具)与 C++ 编译器(Ubuntu/Debian 下通常为qt6-base-dev、qt6-declarative-dev、qt6-svg-dev、qt6-base-dev-tools等)。
qmake cool-retro-term.pro # 1. 展开 subdirs,生成各子工程 Makefile make -j$(nproc) # 2. 按序构建:子模块静态库 → qsb 编译着色器 → 链接 app sudo make install # 3. 安装到 /usr/bin、图标目录与桌面条目构建完成后,可执行文件会被输出到构建目录根部(DESTDIR = $$OUT_PWD/../,见 app/app.pro),直接运行./cool-retro-term即可启动;支持--default-settings、-p <profile>、--fullscreen等命令行参数(参数说明见 app/main.cpp)。
5️⃣ 构建之外:多格式打包体系
qmake 负责"从源码到二进制",而发行版打包则由 packaging/ 目录承担:
| 格式 | 关键文件 | 说明 |
|---|---|---|
| Snap | snap/snapcraft.yaml | 使用qmake插件构建,声明 Qt/QML 全套 stage-packages |
| Debian | packaging/debian/rules | 标准的dh精简规则,配合 control 文件 |
| RPM | packaging/rpm/cool-retro-term.spec | 面向 Fedora 等 RPM 发行版 |
也就是说,上游仓库只维护"构建 + 打包声明",各发行版官方仓库(Ubuntu、Fedora、Arch 等)会基于这些元数据生成对应的包,用户apt install或dnf install即可直接使用,无需自己编译。
6️⃣ 小结:这套构建系统好在哪
- 分层清晰:根工程只管编排(subdirs + ordered),子工程各自负责源码、资源与安装规则;
- 自动化强:版本号来自 Git Tag、着色器变体由 qmake 循环展开生成,几乎零手工维护;
- 跨平台完整:同一套
.pro同时覆盖 Linux/macOS 构建与 Snap/Debian/RPM 三种发行格式; - 面向未来:已明确预留 CMake 迁移路径,qmake 配置可平滑过渡。
理解这份 app/app.pro,你就掌握了"Qt6 + QML + GPU 着色器"项目构建的完整范式,也为阅读、二次开发 cool-retro-term 打下了坚实基础。
【免费下载链接】cool-retro-termA good looking terminal emulator which mimics the old cathode display...项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考