Contents
Developing Genie
Introduction
Genie is an Open Source and Free Software project. The source code is openly available from the Gnome software repository and you are free to copy and use the software under the terms of the GNU Lesser General Public License (LGPLv2.1+).
Genie acts as a parser for the Vala compiler and makes up only three files within the Vala repository. The relation between Genie, the Vala compiler and the C compiler is illustrated and explained below.
There are several ways to contribute to and enhance Genie. These include submitting bug reports, submitting patches and reviewing patches. This page gives more detail on these processes to make it quicker and easier to contribute to the project.
What to Expect
Gnome Bugzilla and Mailing List
Bugs and feature requests are recorded using the Gnome bugzilla:
Before filing a new bug use the links above to check if a bug or feature request is not already recorded. When filing a bug include a simple test case that illustrates the problem.
The links also show changes to bugs in date order, newest first. This is a useful way to check for new bugs and updates if you are intending to be a reviewer.
A patch to the Genie parser can be submitted by attaching it to the bug report.
There is a mailing list for Vala and Genie where questions can be asked.
Genie's Relation to valac
When starting to analyze a problem with compiling a program it is useful to break the compilation process down into three stages. The first stage is carried out by the Genie parser and translates the program source file into a Vala abstract syntax tree (AST). The second stage is carried out by the valac compiler and translates the AST into C code. The third stage is carried out by a C compiler, gcc by default, and compiles the C source file into a binary.
These three stages are illustrated below. Further details are then given on how to examine the output of each stage. Note that valac can process other input files at the same time as Genie source files.
Stage 1 - Genie Parser
The Genie parser is made up of three files in the valac source code. The files can be browsed from the main Vala git repository with the following links:
- valagenietokentype.vala
- This file contains an enumerated list of tokens. This file is unlikely to need modifying unless adding new functionality
- valageniescanner.vala
- The scanner reads .gs files and converts the text into tokens
- valagenieparser.vala
- This file parses the tokens and creates a Vala AST
- See Hackers's Guide to Vala - Parser for a list of classes used in the Vala AST
A project can include other files that are then included in the AST. These can be Vala source files and Vala API bindings to C libraries. So it is advisable to develop a simple Genie test program that only includes the feature you are testing. This avoids introducing any unnecessary uncertainties into the testing. The only two Vala API files that are included automatically are for GLib and GLib's GObject system.
Use the --dump-tree=filename.vala switch with valac to see the AST converted to Vala code. This is useful to check if the parser is working as expected.
Stage 2 - C Code Generation
The Vala compiler will use the AST to generate C code. At this stage the Genie parser has finished its work, so any bugs seen here are likely to be within the Vala compiler itself or an error in the C bindings. The Genie parser, however, may not have created the AST correctly and this can be ruled out by coding the test in Vala to compare with the Genie results. Bug hunting is sometimes a long and slow art! Hopefully there is satisfaction when the cause of the bug is tracked down.
To only see the C code and not produce a binary use the --ccode switch with valac.
Stage 3 - C Compiler
At this stage you are probably a long way from a bug in the Genie parser itself, but it is useful to understand there are powerful debugging tools available for C compiled programs.
gdb, the GNU Project debugger, or a graphical front end to gdb, such as Nemiver, can be used to step through binaries produced from Genie code. Use the --debug switch with valac. This inserts line numbers from the Genie code into the C code, which are then included in the binary and are displayed with gdb's output. To both see the C code and produce the binary use the --save-temps switch with valac.
valgrind can also be used for dynamic analysis of the program. This is useful for tracking down memory leaks. A blog post Testing for memory leakage with Vala and GLib by Richard Schwarting gives an idea of what can be achieved.
Unit Tests
When submitting a bug report it is helpful to attach a test case to show the problem. This can be used to test any patch submitted.
Vala has a test suite that can be browsed at https://git.gnome.org/browse/vala/tree/tests
There is currently no test suite for Genie in the Vala source code.
Building valac from Source
To start tracking down the cause of a bug and developing a fix for it you need to build the Vala compiler from its source code. The instructions that follow are for a GNU/Linux operating system, such as Fedora or Ubuntu, but Vala can also be built on Windows or Mac OS X with the right tools.
These instructions place the Vala compiler in your local user directory. This makes your development valac independent of the valac you would normally use to compile Genie programs. This allows normal Genie coding to continue, while keeping development of the fixed compiler separate.
Setting up a Build Environment
The Vala compiler is self compiling so a copy of valac will be needed. To manage the large number of files in the compile process Vala uses the GNU build system, also known as Autotools. The commands that follow have been tested on a virtual machine running a clean install of Fedora 20. The Ubuntu commands were found from a search, but are untested.
Anyone already compiling Genie programs will have the following installed, but they are listed here for completeness:
Description |
Fedora command |
Ubuntu command |
Vala compiler |
yum install vala |
apt-get install valac |
GLib and headers |
yum install glib2-devel |
apt-get install libglib2.0-dev |
A C compiler, GCC in this example |
yum install gcc |
apt-get install gcc |
You will also need the GNU build system, the Git version control system and some additional packages for GObject introspection:
Description |
Fedora command |
Ubuntu command |
Automake, part of GNU build system |
yum install automake |
apt-get install automake |
Libtool, part of GNU build system |
yum install libtool |
apt-get install libtool |
Git, version control software |
yum install git |
apt-get install git |
Bison, required by gobject-introspection |
yum install bison |
apt-get install bison |
Flex, required by gobject-introspection |
yum install flex |
apt-get install flex |
GObject introspection header files |
yum install gobject-introspection-devel |
apt-get install gobject-introspection |
Compiling valac to a Local Directory
The following instructions will download Vala into your Unix home directory ($HOME) and create the directory structure:
$HOME/vala/source/ - contains the Vala source code
$HOME/vala/installed/ - contains the local build of Vala
The first stage is to download a copy of the Vala source code repository and configure the build system. This stage is done once:
Step |
Description |
Command |
1 |
Download a copy of the Vala source code |
git clone git://git.gnome.org/vala $HOME/vala/source/ |
2 |
Change current working directory to Vala source |
cd $HOME/vala/source/ |
3 |
Configure the GNU build system |
./autogen.sh --prefix=$HOME/vala/installed/ |
The next stage is to build and install valac from source. This will be repeated each time you want to test your modifications to the source code:
Step |
Description |
Command |
1 |
Compile valac |
make |
2 |
Run Vala test suite |
make test |
3 |
Install valac to local directory |
make install |
Creating a Patch with git
Check Your Identity
Patches should be submitted with your full name and a valid email address. Check these have been set up in git with:
git config user.name git config user.email
To set them use:
git config --global user.name "your name" git config --global user.email your@email
To set these the just for the current project replace --global with --local
Refresh Your valac and Create a Branch
It is best to work with an up to date version of the Vala compiler. This is so when it comes to submitting your patch it is less likely to need revision because of changes upstream.
A great advantage of git is the ease of creating branches. It is easy to create a branch, try out some ideas, commit the changes in the branch and if you decide you don't like them just delete the branch.
A typical way of starting hacking would be:
git checkout master git pull origin git checkout -b name_of_working_branch
Tips on Working
While developing the idea using just make and then make install to build valac is quicker than running the full test suite each time.
The aim is to create a clear and simple patch or set of patches. git rebase --interactive master provides a powerful way of re-organising commits in a local branch so what was originally developed over four or five commits, for example, can be squashed into one or two simpler commits. A reviewer of the patch doesn't need to know the development stages, but the patch needs to be clear in what it does and how it does it.
Final Checks
Before generating the patch it is best to make sure valac is built from the most up to date version and that the changes you have made work against a clean source. Something like this:
git checkout master git pull origin git checkout -b name_of_working_branch git rebase master make clean make make test rm $HOME/vala/installed/* -rf make install
Then run your test cases against the version of valac just generated. So long as everything works it is time to generate your patch.
Generate and Submit the Patch
To list, for example, the last ten commits use:
git log --oneline -10
This will show the abbreviated commit hashes. Choose the commit just before your work and note its abbreviated hash. This hash is then used to identify the commits after that to generate the patch or patches:
git format-patch abbreviated_hash
You should now have one or more files starting with a number and ending in .patch. These are the files that will be uploaded to the Vala bugzilla.
Reviewing a Patch
A submitted patch needs to be reviewed by someone else to check that it:
- resolves the bug / feature request
- maintains compatibility with previous versions of Genie
- meets the security standards of the project
- provides a simple and elegant solution
meets the coding standards of the project (see Vala Hacking - Coding Style)
Refresh the Build Environment
Before applying the patch remove the old build of valac and make sure the vala source is clean and up to date:
rm $HOME/vala/installed/* -rf cd $HOME/vala/source make clean git checkout master git pull
Download and Apply the Patch
Usually a patch is added as an attachment to Bugzilla. This can be downloaded with a web browser. In Firefox, for example, click on the name of the attached file to view the content in raw format. Then choose File -> Save Page As from the Firefox menu and save the patch to the local Vala source directory.
Create a new branch to test the patch in, apply the patch and build a new local copy of valac:
cd $HOME/vala/source git checkout -b testing_branch git apply name_of_patch_downloaded.patch make make install