Sunday, November 12, 2006

Slackware 11 and the Adventure with GnuCash & Gnome

I have read quite some rave reviews on the open source financial management package GnuCash. Since I have my Slackware 11 machine up and running, I thought installing this package will be something like 'a walk by the country side'.

There are a few reasons why I am looking around for accounting software. Currently I am doing my balance sheet on an MS Excel spreadsheet but it is still lacking in many ways as an accounting package. On top of that, after spending RM300 on the Windows XP home edition, I am not interested to fork out any more money to MS to get MS Office suite. Time to give GnuCash a try.

Despite this software is built on top of the Gnome environment which is not supported by Slackware 11, I still thought it would be relatively easy to iron out the differences. Well, it is totally out of hand. Until now, I have encountered roughly 20 major or minor build issues (some of them related to Gnome) on my journey to compile this. "Why don't you just download the pre-compiled binary and run it?", yeap I did, but the dependencies of Gnome is nothing trivial either. I will document the major ones that I remember:

Guile vs. Slib
Packages in question: guile-1.8.1, slib3a4

This was the first problem when I ran 'configure'. The error message was cryptic. As a background introduction, guile is a scheme interpreter while Slib is a scheme library. Guile provides a library binding for slib (slib.scm) so that Slib functions can be invoked through Guile. In return, Slib itself also provides a init script for guile (guile.init) for the same purpose.

In the configure script, test for the presense of Slib is done through

guile -c "(use-modules (ice-9 slib)) (require 'printf)"
Explanation:
guile is the program, the -c switch instructs guile to evaluate the statement after the switch (similar to the -e switch for perl). The use-modules directive will ask guile to load the slib module in the ice-9 directory. After the use-modules statement is evaluated, it will proceed to call functions available through Slib, namely require and printf. The apostrophe (') is used to quote printf as a symbol so that guile will pass it to Slib.

The statement above should return no error. However upon running this, there is an error message:

ERROR: Unbound variable: slib:features
After over 10 hours of debugging, I found out Slib changed the function name from *features* to slib:features and thus obsoletes the library binding of Guile. With this in hand the solution is simple and straight forward: either hack the configure and change that line to:

guile -c "(load "/path/to/slib/guile.init") (require 'printf)"

or you could copy guile.init to the ice-9 directory, replacing slib.scm. Some editing is needed on the guile.init file to make it work though. More specifically you need to change the first line to

(define-module (ice-9 slib))

I am not sure if this copy and paste method will break anything. You are warned.

5 comments:

Anonymous said...

Thank you!! you just saved me over 10 hours of debugging :)

Free Chai said...

Welcome. :)

Anonymous said...

I had to:

cp /usr/lib/slib/mklibcat.scm /usr/lib/slib/mklibcat

Thanks! You saved me 5 hours

Anonymous said...

Thanks for the advice, between this post and a forum post on the ubuntu forums here, I was able to correct the slib error. Thanks again.

Christopher Blunck said...

I'm on OSX Leopard and I just updated my fink. It fargled my gnucash installation because of Guile/Slib:

chris@blunck ~ $ gnucash
main: Error on gbr_init: Binary relocation support is disabled.
ERROR: Unbound variable: slib:features

Your fix helped me out. Note that I also had to change the library-path:
;; Use this path if your scheme does not support GETENV
;; or if SCHEME_LIBRARY_PATH is not set.
"/sw/share/guile/site/slib/"