为 gccgo 前端做出贡献

简介

以下是一些有关为 GCC 的 gccgo 前端做出贡献的说明。有关为 gccgo 以外的其他 Go 部分做出贡献的信息,请参阅 为 Go 项目做出贡献。有关为自己构建 gccgo 的信息,请参阅 设置和使用 gccgo。有关使用 gccgo 前端进行开发过程的更多详细内容,请参阅 gofrontend 存储库中的 文件 HACKING

法律先决条件

您必须遵循 Go 版权规则,对 gccgo 前端和关联的 libgo 库进行所有更改。属于 GCC 而非 gccgo 的代码必须遵循一般的 GCC 贡献规则

代码

gccgo 前端的 master 源代码可以在 https://go.googlesource.com/gofrontend 中找到。它们在 https://github.com/golang/gofrontend 中镜像。master 源代码本身不可构建,只能与 GCC 结合使用(将来,可能会支持其他编译器)。对 gccgo 前端所做的更改也会应用到托管在 gcc.gnu.org 中的 GCC 源代码存储库。在 gofrontend 存储库中,go 目录镜像到 GCC 存储库中的 gcc/go/gofrontend 目录,而 gofrontend libgo 目录镜像到 GCC libgo 目录。此外,从 主 Go 存储库 中的 test 目录镜像到 GCC 存储库中的 gcc/testsuite/go.test/test 目录。

对这些目录的更改始终从 master 源代码流向 GCC 存储库。除了在 master 源代码中更改它们并镜像它们之外,这些文件绝不应在 GCC 存储库中更改。

gccgo 前端是用 C++ 编写的。它遵循 GNU 和 GCC 的 C++ 编码标准。在为前端编写代码时,请遵循周围代码的格式。几乎所有 GCC 特定的代码都不在前端本身中,而是在 gcc/go 目录中的 GCC 源代码中。

gccgo 的运行时库与 Go 主存储库 中的库基本相同。Go 存储库中的库代码会定期合并到 gofrontendlibgo/go 目录中,然后使用 shell 脚本 libgo/merge.sh 合并到 GCC 存储库中。因此,大多数库更改都应在 Go 主存储库中进行。libgo/go 之外的文件是 gccgo 特有的;也就是说,libgo/runtime 中的一些文件基于 Go 主存储库中 src/runtime 中的文件。

测试

所有补丁都必须经过测试。引入新故障的补丁不可接受。

要运行 gccgo 测试套件,请在构建目录中运行 make check-go。这将在 gcc/testsuite/go.* 下运行各种测试,还将运行 libgo 测试套件。来自 Go 主存储库的这些测试副本使用 gcc/testsuite/go.test/go-test.exp 中的 DejaGNU 脚本运行。

大多数新测试都应提交到 Go 主存储库,以便稍后镜像到 GCC 存储库。如果需要针对 gccgo 进行特定测试,则应将它们放入 GCC 存储库中的 gcc/testsuite/go.go-torturegcc/testsuite/go.dg 目录中。

提交更改

对 Go 前端的更改应遵循与 Go 主存储库相同的流程,仅适用于 gofrontend 项目和 [email protected] 邮件列表,而不是 go 项目和 [email protected] 邮件列表。然后,这些更改将合并到 GCC 源中。