|  | 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 http://github.com/golang/gofrontend) | 
|  |  | 
|  | That gives you the frontend only.  Now you need a copy of the GCC | 
|  | source code.  See http://gcc.gnu.org/svn.html for details, or simply: | 
|  |  | 
|  | svn checkout svn://gcc.gnu.org/svn/gcc/trunk | 
|  |  | 
|  | 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 | 
|  | http://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://svn/gcc/branches/gccgo.  I maintain it using | 
|  | the general GCC branch policies described at | 
|  | http://gcc.gnu.org/wiki/SvnBranch . |