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_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.
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
Posted by anatol on January 11, 2011 at 17:20
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
Posted by anatol on January 11, 2011 at 17:22
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.