| Some notes on development of the Go frontend | 
 | Ian Lance Taylor | 
 | iant@golang.org | 
 |  | 
 | The Go frontend currently only works with GCC.  I want to make it more | 
 | portable, but that work is not complete. | 
 |  | 
 |  | 
 | Go frontend as part of GCC | 
 | -------------------------- | 
 |  | 
 | There is a copy of the Go frontend in the GCC source code.  However, | 
 | the Go frontend source code repository is not the GCC source code | 
 | repository.  This means that if you want to modify the Go frontend, | 
 | you need to do some setup.  This is how I do it. | 
 |  | 
 | The Go frontend sources are stored using Git hosted at | 
 | go.googlesource.com, and mirrored on github.com.  To check out the | 
 | source code: | 
 |  | 
 | git clone https://go.googlesource.com/gofrontend | 
 |  | 
 | (or use the mirror on github: git clone https://github.com/golang/gofrontend) | 
 |  | 
 | That gives you the frontend only.  Now you need a copy of the GCC | 
 | source code.  See https://gcc.gnu.org/git.html for details, or simply: | 
 |  | 
 | git clone git://gcc.gnu.org/git/gcc | 
 |  | 
 | The GCC source code will have a copy of the Go frontend, but because | 
 | you want to change the Go frontend, you will need to replace that copy | 
 | with your own.  I do this using symlinks.  Symlinking the Go frontend | 
 | proper is trivial.  Symlinking libgo is a bit harder, because | 
 | convenient use of automake and autoconf requires that they be able to | 
 | see the sources in top level of the GCC repository.  So this is what I | 
 | do: | 
 |  | 
 | rm -rf gcc/go/gofrontend | 
 | ln -s GOFRONTEND/go gcc/go/gofrontend | 
 | rm -rf libgo | 
 | mkdir libgo | 
 | for f in GOFRONTEND/libgo/*; do ln -s $f libgo/`basename $f`; done | 
 |  | 
 | You can then build GCC as usual, with --enable-languages=go.  The | 
 | build will use the Go frontend in your Git repository. | 
 |  | 
 | This is all you need to build gccgo yourself and develop your own | 
 | patches.  To get your patch committed, send them in using "git | 
 | codereview mail" as described at | 
 | https://golang.org/doc/gccgo_contribute.html ; it's the same process as | 
 | changes for the regular Go repository. | 
 |  | 
 | At present I am the only person who commits changes to the Go frontend | 
 | repository.  Because the GCC repository has a copy of the Go frontend, | 
 | I need to commit changes to both repositories.  To do this, I use a | 
 | script that copies changes from the Git repository to GCC's SVN | 
 | repository.  This script uses a file MERGE that exists only in the GCC | 
 | repository.  This is the script: | 
 |  | 
 | ================================================== | 
 | #!/bin/sh | 
 |  | 
 | set -e | 
 |  | 
 | merge="/home/iant/gcc/trunk/gcc/go/gofrontend/MERGE" | 
 | current=`head -1 $merge` | 
 | next=`git log ${current}.. | grep '^commit' | tail -1 | sed -e 's/^[^ ]* //'` | 
 |  | 
 | if test "$next" = ""; then | 
 |   echo "gosync: already up to date" | 
 |   exit 0 | 
 | fi | 
 |  | 
 | if git show -p $next | grep -e '^\(---\|+++\)' | fgrep 'go/'; then | 
 |   git log -1 $next > /home/iant/gcc/trunk/svn-commit.tmp | 
 |   git show -p $next | \ | 
 |     sed -e 's|\(^[-+][-+][-+] [ab]\)/go|\1/gcc/go/gofrontend|' | \ | 
 |     (cd /home/iant/gcc/trunk && patch -p1) | 
 | else | 
 |   echo "gosync: no relevant files in change $next" | 
 | fi | 
 |  | 
 | (echo ${next}; sed -ne '2,$p' $merge) > ${merge}.tmp | 
 | mv ${merge}.tmp ${merge} | 
 | ================================================== | 
 |  | 
 | (When I'm working with a GCC release branch, I have variants which do | 
 | the same thing with my copy of the GCC release branch.) | 
 |  | 
 | Now every time I submit a change to the gofrontend repository, I run | 
 | gosync to copy the change to my copy of the GCC repository, and the | 
 | commit message is stored in svn-commit.tmp in the GCC repository.  I | 
 | don't automatically commit to both git and svn at once because some | 
 | gofrontend changes require changes to other parts of GCC, and an | 
 | automatic commit to GCC would mean that GCC was temporarily broken. | 
 | So instead after pushing the submit button on | 
 | go-review.googlesource.com I run "gosync; svn commit".  GCC rules | 
 | require that all GCC patches be sent to the mailing list | 
 | gcc-patches@gcc.gnu.org with an explanation, so I do that as well when | 
 | I run "svn commit". | 
 |  | 
 | In summary, there are three steps to every change to the gofrontend: | 
 | 1) git submit | 
 | 2) svn commit | 
 | 3) send e-mail to gcc-patches@gcc.gnu.org | 
 |  | 
 | For the convenience of people who want to use gccgo without waiting | 
 | for a release and without living on tip, I maintain a gccgo branch of | 
 | GCC.  This lives at svn://gcc.gnu.org/svn/gcc/branches/gccgo.  I maintain | 
 | it using the general GCC branch policies described at | 
 | https://gcc.gnu.org/wiki/SvnBranch . |