Difference between revisions of "Building on Windows"

From GnuCash
Jump to: navigation, search
(Created page with '== GnuCash Windows - Development Notes == === Guile 1.8 === GnuCash/Windows currently uses guile 1.6.x. Guile's development continues and the use of this old, no longer support…')
 
(GnuCash Windows - Development Notes: Add environment instructions, indicate guile 1.8 is sorted.)
Line 1: Line 1:
 
== GnuCash Windows - Development Notes ==
 
== GnuCash Windows - Development Notes ==
 +
== Working on Gnucash ==
 +
Once you've successfully built Gnucash and all of its dependencies, it's a bit of a pain to re-run install.sh after every edit. To use <tt>make</tt> from the command prompt as usual, you need to set the following environment:
 +
export OLDPATH=$PATH
 +
 +
PATH=/c/soft/svn/bin:$PATH
 +
PATH=/c/soft/autotools/bin:$PATH
 +
PATH=/c/soft/swig:$PATH
 +
PATH=$PATH:/c/soft/active-perl/ActivePerl/perl/bin
 +
PATH=$PATH:/c/soft/aqbanking/bin
 +
PATH=$PATH:/c/soft/gwenhywfar/bin
 +
PATH=$PATH:/c/soft/autotools/bin
 +
PATH=$PATH:/c/soft/enchant/bin
 +
PATH=$PATH:/c/soft/gmp/bin
 +
PATH=$PATH:/c/soft/gnome/bin
 +
PATH=$PATH:/c/soft/gnutls/bin
 +
PATH=$PATH:/c/soft/goffice/bin
 +
PATH=$PATH:/c/soft/guile/bin
 +
PATH=$PATH:/c/soft/libdbi/bin
 +
PATH=$PATH:/c/soft/libgsf/bin
 +
PATH=$PATH:/c/soft/libofx/bin
 +
PATH=$PATH:/c/soft/libsoup/bin
 +
PATH=$PATH:/c/soft/libxslt/bin
 +
PATH=$PATH:/c/soft/mysql/bin
 +
PATH=$PATH:/c/soft/mysql/lib
 +
PATH=$PATH:/c/soft/opensp/bin
 +
PATH=$PATH:/c/soft/pcre/bin
 +
PATH=$PATH:/c/soft/pgsql/bin
 +
PATH=$PATH:/c/soft/pgsql/lib
 +
PATH=$PATH:/c/soft/regex/bin
 +
PATH=$PATH:/c/soft/sqlite3/bin
 +
PATH=$PATH:/c/soft/webkit/bin
 +
 +
export PATH
 +
 +
export LTDL_LIBRARY_PATH=/c/soft/gnucash/inst/lib
 +
export GNOME2_PATH=/c/soft/gnome
 +
export INTLTOOL_PERL=/c/soft/active-perl/ActivePerl/perl/bin/perl
 +
export GIT_CMD=/c/soft/git/git
 +
export ACLOCAL_FLAGS="-I/c/soft/guile/share/aclocal -I/c/soft/gwenhywfar/share/aclocal -I/c/soft/aqbanking/share/aclocal -I/c/soft/autotools/share/aclocal -I/c/soft/gnome/share/aclocal -I/c/soft/gnutls/share/aclocal"
 +
 +
I put all of those commands into a file called <tt>devrc</tt> and then source it into my shell:
 +
. devrc
 +
<tt>$OLDPATH</tt> is there so that you can reset the path easily:
 +
export PATH=$OLDPATH
 +
 +
The other piece of the puzzle is that you need to specify some environment to configure. Paste the following into a file (in your top-level source directory) -- I call mine <tt>.configure</tt>:
 +
./configure \
 +
    --prefix=/c/soft/gnucash-inst \
 +
    --enable-aqbanking \
 +
    --enable-ofx \
 +
    --enable-debug \
 +
    --enable-schemas-install=no \
 +
    --enable-dbi \
 +
    --with-dbi-dbd-dir=/c/soft/libdbi-drivers/lib/dbd \
 +
    --enable-binreloc \
 +
    --enable-locale-specific-tax \
 +
    CPPFLAGS="$CPPFLAGS -I/c/soft/autotools/include -I/c/soft/regex/include -I/c/soft/gnome/include -I/c/soft/guile/include -I/c/soft/libdbi/include -I/c/soft/gmp/include -I/c/soft/gwenhywfar/include -I/c/soft/libsoup/include -D_WIN32 -ggdb3 -Wall -Werror -fno-builtin-dgettext -fno-builtin-towupper -fno-builtin-iswlower" \
 +
    LDFLAGS="$LDFLAGS -L/c/soft/autotools/lib -L/c/soft/regex/lib -L/c/soft/gnome/lib -L/c/soft/guile/lib -L/c/soft/libdbi/lib -L/c/soft/gmp/lib -L/c/soft/gwenhywfar/lib -L/c/soft/libsoup/lib -L/c/soft/enchant/lib -L/c/soft/libxslt/lib -L/c/soft/sqlite3/lib" \
 +
      PKG_CONFIG_PATH=/c/soft/autotools/lib/pkgconfig:/c/soft/regex/lib/pkgconfig:/c/soft/gnome/lib/pkgconfig:/c/soft/guile/lib/pkgconfig:/c/soft/libdbi/lib/pkgconfig:/c/soft/gmp/lib/pkgconfig:/c/soft/gwenhywfar/lib/pkgconfig:/c/soft/libsoup/lib/pkgconfig:/c/soft/aqbanking/lib/pkgconfig:/c/soft/libofx/lib/pkgconfig:/c/soft/isocodes/lib/pkgconfig:/c/soft/libonoboui/lib/pkgconfig:/c/soft/libgsf/lib/pkgconfig:/c/soft/libxslt/lib/pkgconfig:/c/soft/webkit/lib/pkgconfig:/c/soft/enchant/lib/pkgconfig:/c/soft/gnutls/lib/pkgconfig:/c/soft/goffice/lib/pkgconfig
 +
 +
Then you call <tt>.configure</tt> instead of <tt>configure</tt> before you run <tt>make</tt>
  
 
=== Guile 1.8 ===
 
=== Guile 1.8 ===
 +
The following is obsolete: The build scripts for 2.4 and trunk correctly build Guile 1.8. The notes are retained for historical interest.
  
 
GnuCash/Windows currently uses guile 1.6.x. Guile's development continues and the use of this old, no longer supported version of guile is blocking some improvements. Recent examples of this were:
 
GnuCash/Windows currently uses guile 1.6.x. Guile's development continues and the use of this old, no longer supported version of guile is blocking some improvements. Recent examples of this were:

Revision as of 22:30, 26 May 2012

GnuCash Windows - Development Notes

Working on Gnucash

Once you've successfully built Gnucash and all of its dependencies, it's a bit of a pain to re-run install.sh after every edit. To use make from the command prompt as usual, you need to set the following environment:

export OLDPATH=$PATH

PATH=/c/soft/svn/bin:$PATH
PATH=/c/soft/autotools/bin:$PATH
PATH=/c/soft/swig:$PATH
PATH=$PATH:/c/soft/active-perl/ActivePerl/perl/bin
PATH=$PATH:/c/soft/aqbanking/bin
PATH=$PATH:/c/soft/gwenhywfar/bin
PATH=$PATH:/c/soft/autotools/bin
PATH=$PATH:/c/soft/enchant/bin
PATH=$PATH:/c/soft/gmp/bin
PATH=$PATH:/c/soft/gnome/bin
PATH=$PATH:/c/soft/gnutls/bin
PATH=$PATH:/c/soft/goffice/bin
PATH=$PATH:/c/soft/guile/bin
PATH=$PATH:/c/soft/libdbi/bin
PATH=$PATH:/c/soft/libgsf/bin
PATH=$PATH:/c/soft/libofx/bin
PATH=$PATH:/c/soft/libsoup/bin
PATH=$PATH:/c/soft/libxslt/bin
PATH=$PATH:/c/soft/mysql/bin
PATH=$PATH:/c/soft/mysql/lib
PATH=$PATH:/c/soft/opensp/bin
PATH=$PATH:/c/soft/pcre/bin
PATH=$PATH:/c/soft/pgsql/bin
PATH=$PATH:/c/soft/pgsql/lib
PATH=$PATH:/c/soft/regex/bin
PATH=$PATH:/c/soft/sqlite3/bin
PATH=$PATH:/c/soft/webkit/bin

export PATH

export LTDL_LIBRARY_PATH=/c/soft/gnucash/inst/lib
export GNOME2_PATH=/c/soft/gnome
export INTLTOOL_PERL=/c/soft/active-perl/ActivePerl/perl/bin/perl
export GIT_CMD=/c/soft/git/git
export ACLOCAL_FLAGS="-I/c/soft/guile/share/aclocal -I/c/soft/gwenhywfar/share/aclocal -I/c/soft/aqbanking/share/aclocal -I/c/soft/autotools/share/aclocal -I/c/soft/gnome/share/aclocal -I/c/soft/gnutls/share/aclocal"

I put all of those commands into a file called devrc and then source it into my shell:

. devrc

$OLDPATH is there so that you can reset the path easily:

export PATH=$OLDPATH

The other piece of the puzzle is that you need to specify some environment to configure. Paste the following into a file (in your top-level source directory) -- I call mine .configure:

./configure \
	    --prefix=/c/soft/gnucash-inst \
	    --enable-aqbanking \
	    --enable-ofx \
	    --enable-debug \
	    --enable-schemas-install=no \
	    --enable-dbi \
	    --with-dbi-dbd-dir=/c/soft/libdbi-drivers/lib/dbd \
	    --enable-binreloc \
	    --enable-locale-specific-tax \
	    CPPFLAGS="$CPPFLAGS -I/c/soft/autotools/include -I/c/soft/regex/include -I/c/soft/gnome/include -I/c/soft/guile/include -I/c/soft/libdbi/include -I/c/soft/gmp/include -I/c/soft/gwenhywfar/include -I/c/soft/libsoup/include -D_WIN32 -ggdb3 -Wall -Werror -fno-builtin-dgettext -fno-builtin-towupper -fno-builtin-iswlower" \
	     LDFLAGS="$LDFLAGS -L/c/soft/autotools/lib -L/c/soft/regex/lib -L/c/soft/gnome/lib -L/c/soft/guile/lib -L/c/soft/libdbi/lib -L/c/soft/gmp/lib -L/c/soft/gwenhywfar/lib -L/c/soft/libsoup/lib -L/c/soft/enchant/lib -L/c/soft/libxslt/lib -L/c/soft/sqlite3/lib" \
	       PKG_CONFIG_PATH=/c/soft/autotools/lib/pkgconfig:/c/soft/regex/lib/pkgconfig:/c/soft/gnome/lib/pkgconfig:/c/soft/guile/lib/pkgconfig:/c/soft/libdbi/lib/pkgconfig:/c/soft/gmp/lib/pkgconfig:/c/soft/gwenhywfar/lib/pkgconfig:/c/soft/libsoup/lib/pkgconfig:/c/soft/aqbanking/lib/pkgconfig:/c/soft/libofx/lib/pkgconfig:/c/soft/isocodes/lib/pkgconfig:/c/soft/libonoboui/lib/pkgconfig:/c/soft/libgsf/lib/pkgconfig:/c/soft/libxslt/lib/pkgconfig:/c/soft/webkit/lib/pkgconfig:/c/soft/enchant/lib/pkgconfig:/c/soft/gnutls/lib/pkgconfig:/c/soft/goffice/lib/pkgconfig

Then you call .configure instead of configure before you run make

Guile 1.8

The following is obsolete: The build scripts for 2.4 and trunk correctly build Guile 1.8. The notes are retained for historical interest.

GnuCash/Windows currently uses guile 1.6.x. Guile's development continues and the use of this old, no longer supported version of guile is blocking some improvements. Recent examples of this were:

  • Guile 1.8.7 removed some deprecated functions. However, the replacement functions were not available in 1.6.x. Because of this, GnuCash has to carry a compatibility header. We were lucky to get away with that.
  • Andy Wingo provided patches to make GnuCash work with the upcoming guile 2.0 and to remove our dependency on slib. These patches are incompatible with guile 1.6.x (and likely will always be), so they couldn't all be applied.

I have been attempting for some time to build a more recent version of guile but this turns out to be rather difficult. At the time of this writing, I have a working guile, save it won't load slib. There were many small things I had to do to get to this point. In order not to forget them, I've chosen to document them here.

Getting it to build

The 1.8.7 tarball you can download from guile's homepage won't build in our GnuCash mingw/MSYS environment.

  • First error is that our version of automake is too old. Guile requires 1.11, GnuCash still builds with 1.10 at the time of this writing. Luckily, this can easily be fixed by updating the version in defaults.sh and rebuilding the autotools/libtool packages.
  • Guile 1.8.7 no longer contains its own libltdl implementation. This is provided with libtool though. All it required to fix this was to add the proper paths to CPPFLAGS and LDFLAGS.
  • Also new is that guile now requires gmp. Another addition to CPPFLAGS and LDFLAGS solves this.
  • Next is libintl. GnuCash builds this as part of the Gnome packages. However, we pull in the gnome libraries after we build guile. This doesn't work. So the build script has to be modified to first do the gnome install and then build guile.
  • Guile 1.8.7 still recognizes the configure time option --disable-networking, yet it won't build on Windows if this option is set. So this option should be removed from the build script.
  • Next, all kinds of unresolved symbol errors pop up. To fix most of them, I looked at the source package of MSYS-guile-1.8.7. They apparently managed to build guile, so it provided a good starting point. I can't use their patches verbatim, because that would result in a guile package that depends on the MSYS environment. Their patch for config.in was very useful though. To build build with this patch, the configure script has to be rebuilt, using autoreconf. This in itself was a bit of a quest. It wouldn't work unless I redefined ACLOCAL and passed autoreconf a number of library paths.
  • I also learned from the MSYS-guile project that guile should be built with "-Wl,enable-auto-import" to avoid a number of linker warnings (which are treated as errors in our build process).
That was about all to get the library and executable to build. But then it really gets ugly. The next part of the guile build process uses the freshly compiled executable to setup other required bits. This fails miserably with a rather cryptic error
ERROR: In procedure scm_i_lreadparen: #<unknown port>:1:7: end of file
.

It took me quite a while to grasp this one. I found several threads on different mailing lists about the error, which where more or less helpful:

Result: the guile build process completes, and the guile binary works - provided it can find all of its library dependencies of course.

guile -c '(use-modules (srfi srfi-39))'
runs with no problems.

slib

This is still problematic at this point.

guile -c "(use-modules (ice-9 slib)) (require 'printf)"
results in this error:

ERROR: In procedure open-file: ERROR: No such file or directory: "C:/GCDevel/guile/share/guile/1.8/slib/C:/GCDevel/guile/share/guile/1.8/slib/require" ABORT: (system error)</pre>

Obviously there's something wrong with the path guile uses to find the file require.scm.

I'm still investigating what happens here.