Difference between revisions of "Building on Windows"
(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
Contents
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).
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:
- http://www.mail-archive.com/bug-guile@gnu.org/msg04711.html, which at some point links to http://lists-archives.org/mingw-users/14268-problem-with-argc-argv-under-msys.html, which in turn refers to http://thread.gmane.org/gmane.comp.gnu.mingw.msys/3719. The solution mentioned here, didn't apply in my case, but I got to understand the problem a little better.
- Then I was lucky enough to stumble upon two thread in the mingw-devel list: Again on windows support and Again on windows support (2). These are two long threads on building guile on windows and the issues in it. I learned here that the build process uses a wrapper program around the guile executable. Confusingly, this wrapper is called guile.exe as well, yet it has issues on windows, that the actual guile.exe doesn't have. So I wrote a small patch to use that actual guile.exe instead of the wrapper during the build process.
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.