blob: f6e5dd90205a0c66a5f86c1d54b374a7d111dc2d [file] [log] [blame]
Some notes on development of the Go frontend
Ian Lance Taylor
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, and mirrored on To check out the
source code:
git clone
(or use the mirror on github: git clone
That gives you the frontend only. Now you need a copy of the GCC
source code. See for details, or simply:
git clone git://
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
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 ; 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:
set -e
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
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)
echo "gosync: no relevant files in change $next"
(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 I run "gosync; svn commit". GCC rules
require that all GCC patches be sent to the mailing list 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
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:// I maintain
it using the general GCC branch policies described at .