为 gccgo 前端做贡献
简介
以下是关于为 GCC 的 gccgo 前端做贡献的一些注意事项。 若要了解为 Go 语言其他部分(而非 gccgo)做贡献的信息, 请参阅为 Go 项目做贡献。关于 自行构建 gccgo 的信息, 请参阅安装和使用 gccgo。 有关使用 gccgo 前端进行开发过程的更多具体细节, 请参阅 gofrontend 代码库中的 HACKING 文件。
法律前提条件
所有对 gccgo 前端及相关 libgo 库的更改,都必须遵循 Go 版权规则。属于 GCC(而非 gccgo)的代码,必须遵循通用的 GCC 贡献规则。
代码
gccgo 前端的主源码位于
https://go.googlesource.com/gofrontend。
它们在
https://github.com/golang/gofrontend 有镜像。
这些主源码本身无法单独构建,只能与 GCC 一起使用(未来可能支持其他编译器)。
对 gccgo 前端的更改也会同步到托管在 gcc.gnu.org 的 GCC 源代码仓库中。
在 gofrontend 仓库中,go 目录
镜像到 GCC 仓库的 gcc/go/gofrontend 目录,而
gofrontend 的 libgo
目录则镜像到 GCC 的 libgo 目录。此外,
来自 主 Go 代码库 的 test 目录
会镜像到 GCC 仓库的 gcc/testsuite/go.test/test 目录。
这些目录的更改总是从主源码流向 GCC 仓库。除非通过更改主源码并进行镜像, 否则绝不应直接在 GCC 仓库中修改这些文件。
gccgo 前端使用 C++ 编写。
它遵循 GNU 和 GCC 的 C++ 编码规范。
在为前端编写代码时,请遵循周围代码的格式。
几乎所有 GCC 特定的代码都不在前端本身,而是位于 GCC 源码的 gcc/go 目录中。
gccgo 的运行时库与 主 Go 代码库 中的库基本相同。
Go 代码库中的库代码会定期合并到 gofrontend 的 libgo/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-torture
或 gcc/testsuite/go.dg 目录中。
提交更改
Go 前端的更改应遵循与主 Go 代码库相同的流程,只是针对的是
gofrontend 项目和 gofrontend-dev@googlegroups.com 邮件列表,
而非 go 项目和 golang-dev@googlegroups.com 邮件列表。
这些更改随后将被合并到 GCC 源代码中。