拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

mGBA 贡献指南:从 Issue 提报到编码规范与 MPL 2.0 许可合规的完整实践

mGBA 贡献指南:从 Issue 提报到编码规范与 MPL 2.0 许可合规的完整实践 游戏开发【免费下载链接】mgbamGBA Game Boy Advance Emulator项目地址https://gitcode.com/gh_mirrors/mg/mgba点击查看免费下载mGBA 是一个以 C 和 C 编写的 Game Boy Advance 模拟器同时支持 Game Boy / Game Boy Color 与 Super Game Boy代码覆盖 ARM7 核心、GBA/GB 两套模拟核心、Qt 与 SDL 前后端以及 3DS、Switch、Vita、Wii 等多个移植平台。本文以仓库根目录下的 CONTRIBUTING.md 为骨架结合仓库源码与目录结构系统讲解向 mGBA 提交 Issue、发起 Pull Request 时必须遵循的流程、组件命名、编码风格与许可要求。读完本文你将能规范地提报带完整诊断信息的 bug 报告写出符合 mGBA 风格的 C/C 代码并避免在合并环节被要求返工或直接关闭 PR。提报 Issue一份高质量 bug 报告的三要素mGBA 的 Issue 需要提交到项目的问题跟踪器。在提报时官方要求至少包含三部分信息它们共同决定了问题能否被快速定位与复现。构建版本号定位问题的第一把钥匙mGBA 要求提供你正在使用的构建版本。对于近期构建版本号直接显示在标题栏中格式形如0.3-2134-4ec19aa这个字符串由四段组成从左到右依次是版本号如0.3对应当前开发版本分支名若不在master分支上会显式标注示例中未标注即为master修订计数如2134即当前提交在历史中的序号截断的修订哈希如4ec19aa即该提交的短哈希。如果本地存在尚未提交的改动版本号末尾还会追加-dirty后缀。这套版本号的生成逻辑可以在仓库根目录的 version.cmake 中找到构建系统通过git describe --always --dirty、git symbolic-ref --short HEAD、git rev-list HEAD --count等命令分别抓取短哈希、分支名与修订计数再按master/非master分支组合出VERSION_STRING最终通过configure_file写入版本源文件。版本数据最终以全局变量的形式暴露给运行时定义在 include/mgba/core/version.h如gitCommit、gitCommitShort、gitBranch、gitRevision、projectVersion等其取值在 src/core/version.c.in 中由 CMake 模板展开Qt 前端的“关于”对话框见 AboutScreen.cpp与更新器见 ApplicationUpdater.cpp都会读取这些常量用于显示与比对。对于0.2.1这类旧版构建标题栏没有版本号此时需要手动说明你下载或编译的是哪个具体版本。如果你是从源码自行构建git describe --always输出的描述字符串就是最准确的标识。运行环境软硬件信息缺一不可操作系统例如 Windows 7 32-bit 或 Ubuntu 15.04 64-bitCPU 与显卡如 Core i5-3570K 与 AMD Radeon R9 280X通常不是必需的仅在怀疑与硬件相关的渲染、性能问题时提供。问题描述越详细越好请尽可能详尽地描述问题包括复现问题的游戏名称进入异常状态的具体操作路径如何一步步触发 bug。若适用mGBA 还允许将存档文件savestate重命名为.png后缀后直接作为附件挂到 Issue 上——存档本身即附带了运行快照维护者可以直接加载复现这比纯文字描述高效得多。提交 Pull Request组件命名与提交信息规范发起 PR 之前请确认你的改动符合下述编码风格并了解许可要求见后文“许可”一节。此外所有提交必须满足两点提交信息前后一致、可读提交信息中包含被修改组件的名称。重要提醒mGBA 明确声明不接受 AI 生成的代码。若 PR 中的代码由 AI 生成该 PR 将被直接关闭summarily closed。组件命名表mGBA 将代码库划分为多个组件PR 提交信息应以组件名开头。官方组件列表如下组件名含义ARM7ARM 核心GBAGBA 代码GBA Memory内存相关GBA Video视频、渲染GBA Audio音频处理GBA SIO串行 I/O、多人联机、linkGBA Hardware附加设备如陀螺仪、光传感器GBA BIOS高层 BIOSGBGB 代码GB Memory内存相关GB Video视频、渲染GB Audio音频处理GB MBC内存控制器 / 卡带硬件GB SIO串行 I/O、多人联机、linkCore各模拟核心共享的基础设施QtQt 移植相关代码SDLSDL 移植相关代码含其他移植中的使用Util公共工具代码Tools杂项工具Debugger内置调试功能3DS3DS 移植SwitchSwitch 移植VitaVita 移植WiiWii 移植mGUI各 homebrew 移植共享的 UI 代码All不涉及特定组件、影响整个项目的改动需要注意的是该列表并非穷尽涉及具体文件时查看相关文件的提交日志commit log往往能给出更准确的组件归属。在仓库中这些组件与目录结构一一对应ARM 核心在 src/armGBA 与 GB 的代码分别在 src/gba 与 src/gb共享基础设施在 src/coreQt 与 SDL 前端分别在 src/platform/qt 与 src/platform/sdl工具代码在 src/util 与 src/tools各移植平台则位于 src/platform 下。编码风格mGBA 的代码书写规范mGBA 致力于保持代码库的一致与整洁因此对贡献代码有明确约束。PR 中存在风格错误时维护者会要求先修正再合并。以下规范全部以“好/坏”对照的形式给出可直接作为自查清单。命名规则变量名含函数参数一律使用 camelCase。文件作用域 static 变量必须以下划线_开头。C 结构体名以大写字母开头与该结构体相关的函数应以“类名”含大写字母开头、后续使用 camelCase。C 结构体不得被typedef。与结构体无关的函数整体使用 camelCase此类 static 函数必须以下划线_开头。枚举值与#define全部大写、以下划线分隔。正确示例static int _localVariable; struct LocalStruct { void (*methodName)(struct LocalStruct struct, param); int memberName; }; enum { ENUM_ITEM_1, ENUM_ITEM_2 }; void LocalStructCreate(struct LocalStruct* struct); void functionName(int argument); static void _LocalStructUse(struct LocalStruct* struct); static void _function2(int argument2);在仓库源码中可以大量观察到这套规则的落地。例如 include/mgba/core/core.h 中struct mCore以大写m开头且未被 typedef枚举mPlatform使用全大写mPLATFORM_GBA、mPLATFORM_GB形式其成员与相关函数如mCoreInit、mCoreLoadFile系列均遵循“类名前缀 camelCase”的命名模式核心内部则普遍采用_前缀的 file-scoped static 变量。C 命名规则C 类应限定在命名空间内。对于 Qt 移植该命名空间名为QGBA——在 src/platform/qt 下几乎所有头文件如 AboutScreen.h、Action.h都可见namespace QGBA { ... }的包裹。类名的处理方式与 C 结构体类似成员字段按作用域加前缀m_非 static 成员s_static 成员。花括号花括号不独占一行只有收尾的}单独成行条件子句与花括号之间要有一个空格即使是单行块也必须使用花括号。正确写法if (condition) { block; } else if (condition2) { block2; } else { block3; }错误写法花括号独占一行if (condition) { block; } else if (condition2) { block2; } else { block3; }错误写法缺失花括号if (condition) statement; else if (condition2) statement2; else statement3;错误写法缺少空格if (condition){ block; }缩进与对齐缩进使用制表符tab并与花括号层级保持一致行内对齐应尽量克制使用且只能用空格做对齐。头文件保护宏Header GuardsC 头文件保护宏应为文件名含H后缀的全大写形式标点替换为下划线且#endif后不得加注释#ifndef FILE_NAME_H #define FILE_NAME_H // Header #endif仓库中几乎所有 C 头文件都遵循这一模式例如 include/mgba/core/core.h 的M_CORE_H、include/mgba/core/version.h 的VERSION_H等。QtC头文件保护宏以QGBA_开头且不包含_H后缀其余规则相同。这是出于历史兼容原因未来可能调整#ifndef QGBA_FILE_NAME #define QGBA_FILE_NAME // Header #endif其他规则块语句if、while、for的关键字与括号之间必须有一个空格正确while (condition) {错误while(condition) {。C 代码中用0而非NULL历史原因未来可能调整布尔场景应使用bool类型及true/false而不是1/0。C 代码中使用nullptr而不是NULL或0。无函数体的语句不必加花括号可以直接用分号收尾。这是建议而非强制正确while (f());错误while (f()) {}。内部含有break的无限循环优先使用while (true)而非for (;;)。许可MPL 2.0 下的代码引入边界mGBA 采用 Mozilla Public License version 2.0仓库根目录的 LICENSE 文件即该许可证全文。向 mGBA 贡献代码时这一点会带来若干明确约束新增代码将默认以MPL 2.0授权GPL 许可的代码不能合入上游但可以在编译时与 mGBA 链接MIT、BSD、CC0 等宽松许可的代码可以合入上游但如适用优先放入third-party区域。仓库中对此已有清晰的实践佐证第三方代码统一收拢在 src/third-party如 inih、libpng、lzma、sqlite3、zlib、discord-rpc 等并在 res/licenses 下保存了各第三方组件的许可文本如 inih.txt、rapidjson.txt 等。mGBA 自身源文件则普遍带有 MPL 2.0 的版权头例如 include/mgba/core/core.h 与 src/core/version.c.in 开头均为 “This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0”。因此在提交 PR 前请先确认你的代码是否可被 MPL 2.0 授权若是 GPL 衍生代码它只能作为外链模块存在不能进入 mGBA 上游代码树。小结提交前的最终自查清单综合 CONTRIBUTING.md 的要点向 mGBA 贡献之前建议逐项核对Issue 提报附上标题栏版本号旧版注明具体版本、操作系统与关键硬件、游戏名称与进入 bug 状态的操作路径必要时将 savestate 改名.png后上传PR 提交提交信息以组件名开头如GBA Video:、Core:、Qt:且内容一致可读不提交 AI 生成代码编码风格变量 camelCase、结构体大写开头且不 typedef、枚举与宏全大写、static 变量加_前缀C 类放入QGBA命名空间成员用m_/s_前缀书写细节花括号不独占行且单行块也必须加花括号、tab 缩进、头文件保护宏按 CFILE_NAME_H与 QtQGBA_FILE_NAME两套规则书写、块语句关键字与括号间留空格、C 用0/bool、C 用nullptr、无限循环用while (true)许可合规新代码可接受 MPL 2.0 授权GPL 代码仅可链接不可合入宽松许可代码优先放入third-party区域。遵循这些约定你的 Issue 将更易被复现、PR 将更易被合并代码也会与 mGBA 十余年沉淀下来的工程风格保持一致。赞分享游戏开发【免费下载链接】mgbamGBA Game Boy Advance Emulator项目地址https://gitcode.com/gh_mirrors/mg/mgba点击查看免费下载相关推荐Label Studio 贡献者指南从 Issue 提报到代码合入的完整贡献流程与工程规范Label Studio 贡献者指南从 Issue 提报到代码合入的完整贡献流程与工程规范 导读 Label Studio 是一个支持多类型数据标注的开源工具数据标注人工智能John the Ripper jumbo 贡献指南从编码规范到许可证要求的完整实践John the Ripper jumbo 贡献指南从编码规范到许可证要求的完整实践 John the Ripper jumbo 是社区增强版的密码破解器支网络安全密码学渗透测试应用安全Atom 开源贡献指南从 Issue 提报到 Pull Request 合入的完整流程与代码规范Atom 开源贡献指南从 Issue 提报到 Pull Request 合入的完整流程与代码规范 本文以 Atom 仓库根目录的 CONTRIBUTING.m代码编辑器桌面应用开发工具上一篇react-native-router-flux 状态管理性能未来超光速内存架构下一篇语音识别可视化终极指南从原始音频到智能分析图表创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表