| 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://gcc.gnu.org/svn/gcc/branches/gccgo. I maintain |
| it using the general GCC branch policies described at |
| http://gcc.gnu.org/wiki/SvnBranch . |