Skip to content

如何向GNU upstream贡献代码

Jiawei edited this page Mar 29, 2022 · 4 revisions
  1. 向GNU社区仓库贡献代码首先需要签署FSF版权协议,签署成功后即可开始贡献代码,参考链接:

    https://www.fsf.org/licensing/contributor-faq

  2. 以gcc与binutils项目为例,首先需要将基准开发分支切换到upstream仓库分支(默认为master分支),这样可以减少冲突引起的额外工作量——

    gcc upstream仓库地址: git://gcc.gnu.org/git/gcc.git

    binutils upstream仓库地址: git://sourceware.org/git/binutils-gdb.git

  3. 与git工作方式相同,进行代码修改后使用git add, git commit将修改进行记录,然后使用git format-patch将修改的commit打包成patch文件,复杂的patch或多个patch往往需要添加cover-letter进行说明,以打包最近的三次commit为例:

      mkdir outgoing && cd outgoing
      git format-patch -3 --cover-letter

   此时outgoing目录下会生成4个.patch结尾的文件,我们需要对每个patch补充说明与Changelog信息,Changelog信息可以通过contrib/mklog.py脚本来生成模板——

      ./../contrib/mklog.py 0003-RISC-V-Add-testcases-for-ZCA-and-ZCF.patch
    >>bfd/ChangeLog:
    >>   * elfxx-riscv.c (riscv_multi_subset_supports):
    >>
    >>gas/ChangeLog:
    >>   * config/tc-riscv.c (riscv_set_arch):
    >>   (s_riscv_option):

   将模板复制粘贴到patch文件中,补充必要的说明即可,例如:

Subject: [PATCH 1/3] RISC-V: xxx. -> patch的标题,通常与commit相同。

This patch is xxx. -> patch的解释说明内容
  1. 安装git send-email,并配置.gitconfig中的邮箱设置
      sudo apt-get install git-email

      vim ~/.gitconfig

    >>[sendemail]
    >>  smtpEncryption = tls
    >>  smtpServer = smtp.gmail.com
    >>  smtpUser = yourname@gmail.com
    >>  smtppass = youremail password
    >>  smtpServerPort = ***
  1. 通过git send-email发送patch到邮件列表
git send-email outgoing/* --to gcc-patches@gcc.gnu.org --cc kito.cheng@gmail.com --cc andrew@sifive.com --cc ***

   gcc邮件列表:gcc-patches@gcc.gnu.org

   binutils邮件列表: binutils@sourceware.org

  1. 发送的patch可以在GNU的pipermail中查看,可以参考其他人的patch格式:

   gcc patches: https://gcc.gnu.org/pipermail/gcc-patches/

   binutils patches: https://sourceware.org/pipermail/binutils/

  1. 当收到邮件对patch修改后,需要将**"Subject: [PATCH]"更新版本号修改为"Subject: [V2 PATCH]",再次更新修改为"Subject: [V3 PATCH]"**,此时只需要使用git send-email patches单独发送修改的patch即可,例如我们只修改了0003--.patch
git send-email outgoing/0003-*-*.patch --to gcc-patches@gcc.gnu.org --cc kito.cheng@gmail.com --cc andrew@sifive.com --cc ***
  1. 最终Maintainer接受patch并合并后,可以在upstream的git中看到自己的commit:

   gcc git upstream: https://gcc.gnu.org/git/?p=gcc.git;a=summary

   binutils git upstream: https://sourceware.org/git/?p=binutils-gdb.git;a=summary

欢迎交流!

Clone this wiki locally