Vala + Autotools example

As a part of learning great Vala language I decided to implement the simplest possible example of Vala console application e.g. a simple calculator program that parses user input and evaluates the expression.

The project is going to have:

  • Unit tests that tests API level functions.
  • A usage example of libraries that can be used both for unit tests and for the program itself.
  • Small and readable Autotools code. The project should be reusable by anyone else as a skeleton for their own project.

The code of the project you can find at my github page.

I am not going to describe Autotools plumbing code. It is pretty much the same as any other Autotools based project has. I recommend to read following article if you are interested in the Autotools details.

Let’s look at the Vala-specific code instead.

  • configure.ac The key file for autoconf tool.It has several interesting pieces:

AM_PROG_VALAC – Autotools already has Vala support and the given macros enables it. After you added it Automake knows what to do with *.vala source files – it invokes valac compiler.

pkg_modules="glib-2.0 >= 2.24.1
             gobject-2.0 >= 2.24.1"
PKG_CHECK_MODULES(CALCULATOR, [$pkg_modules])
AC_SUBST(CALCULATOR_CFLAGS)
AC_SUBST(CALCULATOR_LIBS)

This code checks in your system libraries needed to compile Vala C files. It also evaluates paths to header and shared library files – later these variables will be used for compilation.

  • src/calculator.vala is a core file that contains most of the calculator logic. Later we are going to test this functionality.
  • src/main.vala this is thin wrapper for the calculator library. It has main() method and this file is needed for creating end-used console application.
  • src/Makefile.am This is the most interesting file in the project. Let’s look at it closely.
bin_PROGRAMS = calculator
noinst_LTLIBRARIES = libcalculator.la

Here we declare that this directory has 1 library and 1 binary file.

libcalculator_la_SOURCES = calculator.vala
libcalculator_la_VALAFLAGS = --library calculator -H calculator.h
Calculator library consists of 1 file – calculator.vala but you can as many *.vala files as you want. The second line declares that make should generate calculator.vapi file and *.h that is also needed for compilation.  *.vapi file is kinda ‘header’ file for Vala compier the *.vapi file contains Vala classes declaration, but does not have any implementation. So the library generates 3 files – *.la, *.vala, *.h.
calculator_SOURCES = main.vala
calculator_LDADD = libcalculator.la $(CALCULATOR_LIBS)
calculator_VALAFLAGS = calculator.vapi

This generates output binary file, our console application that we develop. Its source file is main.vala – wrapper around the library. _LDADD adds calculator library as a dependency, _VALAFLAGS  passes *.vapi file to valac compiler.

  • test/calculator_test.vala. This is a unit (aka API level) test
  • test/Makefile.am

Run ./autogen.sh and then ‘make’ to build ./src/calculator console application. If you run ‘make check’ you’ll see test results

make  check-TESTS
/calculator/add: OK
/calculator/minus: OK
/calculator/multiply: OK
PASS: calculator-test

PS Things that I might add in the future:

  • Valadoc documentation generation. It is nice to have API in readable format so you can upload it to the project server.
  • CMake example. I don’t have a lot of experience in autotools so in this project I learned Autotools in addition to Vala language. As of my taste Autotools have a lot of black magic. I still do not understand how the build system works for my project. Some people say that CMake easier to learn that Autotools. So similar example for CMake could be a good lesson as well.

3 responses to this post.

  1. Posted by Javier Jardón on January 11, 2011 at 08:46

    Thanks for the post. It has been useful for me.
    I’d suggest you to use non-recursive automake, more info here: http://www.flameeyes.eu/autotools-mythbuster/automake/nonrecursive.html

    Also, maybe you can try waf to build your project: http://code.google.com/p/waf/

    Regards

    Reply

  2. Hi, Javier.

    >> maybe you can try waf to build your project
    There are several examples of Waf/Vala integration. You might be interested in this on http://live.gnome.org/Vala/Waf The wiki page is not very useful but it points to vala-project-template project sources. You can also check demo from waf repository http://waf.googlecode.com/svn/trunk/demos/vala

    Reply

  3. There is actually yet another build tool that looks interesting called premake
    http://industriousone.com/what-premake

    Unfortunately there is no any Vala support for it.

    Reply

Leave a comment