From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ricardo Wurmus Subject: [PATCH] Add GnuCash. Date: Wed, 06 May 2015 08:46:20 +0200 Message-ID: <871tiuw6df.fsf@mango.localdomain> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:55637) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ypt6G-00044W-0c for guix-devel@gnu.org; Wed, 06 May 2015 02:46:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ypt6C-0005qp-NT for guix-devel@gnu.org; Wed, 06 May 2015 02:46:31 -0400 Received: from sender1.zohomail.com ([74.201.84.162]:29710) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ypt6C-0005qe-92 for guix-devel@gnu.org; Wed, 06 May 2015 02:46:28 -0400 List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: Guix-devel --=-=-= Content-Type: text/plain Hi Guix, here's a patch to add the latest release of webkitgtk 2.4 which is needed by GnuCash (second patch). I was not able to run the complete test suite of GnuCash, but it starts just fine. ~~ Ricardo --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: inline; filename=0001-gnu-Add-WebkitGTK-2.4.8.patch Content-Transfer-Encoding: 8bit >From a2ea83cfe3fab5101388870626c323191200c066 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Wed, 6 May 2015 08:38:06 +0200 Subject: [PATCH 1/2] gnu: Add WebkitGTK 2.4.8. * gnu/packages/webkit.scm (webkitgtk-2.4): New variable. * gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch: New file. * gnu-system.am (dist_patch_DATA): Add it. --- gnu-system.am | 1 + .../patches/webkitgtk-2.4.8-gmutexlocker.patch | 284 +++++++++++++++++++++ gnu/packages/webkit.scm | 35 +++ 3 files changed, 320 insertions(+) create mode 100644 gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch diff --git a/gnu-system.am b/gnu-system.am index 9ffb76e..c95c335 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -555,6 +555,7 @@ dist_patch_DATA = \ gnu/packages/patches/vpnc-script.patch \ gnu/packages/patches/vtk-mesa-10.patch \ gnu/packages/patches/w3m-fix-compile.patch \ + gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch \ gnu/packages/patches/weex-vacopy.patch \ gnu/packages/patches/wicd-urwid-1.3.patch \ gnu/packages/patches/wmctrl-64-fix.patch \ diff --git a/gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch b/gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch new file mode 100644 index 0000000..f8cc70e --- /dev/null +++ b/gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch @@ -0,0 +1,284 @@ +Webkit's own WebCore::GMutexLocker conflicts with the GMutexLocker in +glib-2.44.0. + +diff -up webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp.gmutexlocker webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp +--- webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp.gmutexlocker 2015-02-18 15:40:21.851816374 +0100 ++++ webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp 2015-02-18 15:45:58.560092191 +0100 +@@ -316,7 +316,7 @@ void MediaPlayerPrivateGStreamerBase::mu + #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS) + PassRefPtr MediaPlayerPrivateGStreamerBase::updateTexture(TextureMapper* textureMapper) + { +- GMutexLocker lock(m_bufferMutex); ++ WebCore::GMutexLocker lock(m_bufferMutex); + if (!m_buffer) + return nullptr; + +@@ -366,7 +366,7 @@ void MediaPlayerPrivateGStreamerBase::tr + g_return_if_fail(GST_IS_BUFFER(buffer)); + + { +- GMutexLocker lock(m_bufferMutex); ++ WebCore::GMutexLocker lock(m_bufferMutex); + gst_buffer_replace(&m_buffer, buffer); + } + +@@ -398,7 +398,7 @@ void MediaPlayerPrivateGStreamerBase::pa + if (!m_player->visible()) + return; + +- GMutexLocker lock(m_bufferMutex); ++ WebCore::GMutexLocker lock(m_bufferMutex); + if (!m_buffer) + return; + +diff -up webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp.gmutexlocker webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp +diff -up webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp.gmutexlocker webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp +--- webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp.gmutexlocker 2015-02-18 15:16:11.995228731 +0100 ++++ webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp 2015-02-18 15:45:42.686843477 +0100 +@@ -118,7 +118,7 @@ static gboolean webkitVideoSinkTimeoutCa + WebKitVideoSink* sink = reinterpret_cast(data); + WebKitVideoSinkPrivate* priv = sink->priv; + +- GMutexLocker lock(priv->bufferMutex); ++ WebCore::GMutexLocker lock(priv->bufferMutex); + GstBuffer* buffer = priv->buffer; + priv->buffer = 0; + priv->timeoutId = 0; +@@ -140,7 +140,7 @@ static GstFlowReturn webkitVideoSinkRend + WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(baseSink); + WebKitVideoSinkPrivate* priv = sink->priv; + +- GMutexLocker lock(priv->bufferMutex); ++ WebCore::GMutexLocker lock(priv->bufferMutex); + + if (priv->unlocked) + return GST_FLOW_OK; +@@ -279,7 +279,7 @@ static void webkitVideoSinkGetProperty(G + + static void unlockBufferMutex(WebKitVideoSinkPrivate* priv) + { +- GMutexLocker lock(priv->bufferMutex); ++ WebCore::GMutexLocker lock(priv->bufferMutex); + + if (priv->buffer) { + gst_buffer_unref(priv->buffer); +@@ -305,7 +305,7 @@ static gboolean webkitVideoSinkUnlockSto + WebKitVideoSinkPrivate* priv = WEBKIT_VIDEO_SINK(baseSink)->priv; + + { +- GMutexLocker lock(priv->bufferMutex); ++ WebCore::GMutexLocker lock(priv->bufferMutex); + priv->unlocked = false; + } + +@@ -330,7 +330,7 @@ static gboolean webkitVideoSinkStart(Gst + { + WebKitVideoSinkPrivate* priv = WEBKIT_VIDEO_SINK(baseSink)->priv; + +- GMutexLocker lock(priv->bufferMutex); ++ WebCore::GMutexLocker lock(priv->bufferMutex); + priv->unlocked = false; + return TRUE; + } +diff -up webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp.gmutexlocker webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp +--- webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp.gmutexlocker 2015-02-18 15:16:40.954678407 +0100 ++++ webkitgtk-2.4.8/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2015-02-18 15:45:19.567481225 +0100 +@@ -346,7 +346,7 @@ static void webKitWebSrcSetProperty(GObj + + switch (propID) { + case PROP_IRADIO_MODE: { +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + priv->iradioMode = g_value_get_boolean(value); + break; + } +@@ -364,7 +364,7 @@ static void webKitWebSrcGetProperty(GObj + WebKitWebSrc* src = WEBKIT_WEB_SRC(object); + WebKitWebSrcPrivate* priv = src->priv; + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + switch (propID) { + case PROP_IRADIO_MODE: + g_value_set_boolean(value, priv->iradioMode); +@@ -417,7 +417,7 @@ static gboolean webKitWebSrcStop(WebKitW + + ASSERT(isMainThread()); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + + bool seeking = priv->seekID; + +@@ -476,7 +476,7 @@ static gboolean webKitWebSrcStart(WebKit + + ASSERT(isMainThread()); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + + priv->startID = 0; + priv->corsAccessCheck = CORSNoCheck; +@@ -573,7 +573,7 @@ static GstStateChangeReturn webKitWebSrc + return ret; + } + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_DEBUG_OBJECT(src, "READY->PAUSED"); +@@ -604,7 +604,7 @@ static gboolean webKitWebSrcQueryWithPar + gst_query_parse_duration(query, &format, NULL); + + GST_DEBUG_OBJECT(src, "duration query in format %s", gst_format_get_name(format)); +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + if (format == GST_FORMAT_BYTES && src->priv->size > 0) { + gst_query_set_duration(query, format, src->priv->size); + result = TRUE; +@@ -612,7 +612,7 @@ static gboolean webKitWebSrcQueryWithPar + break; + } + case GST_QUERY_URI: { +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + gst_query_set_uri(query, src->priv->uri); + result = TRUE; + break; +@@ -653,7 +653,7 @@ static gchar* webKitWebSrcGetUri(GstURIH + WebKitWebSrc* src = WEBKIT_WEB_SRC(handler); + gchar* ret; + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + ret = g_strdup(src->priv->uri); + return ret; + } +@@ -668,7 +668,7 @@ static gboolean webKitWebSrcSetUri(GstUR + return FALSE; + } + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + + g_free(priv->uri); + priv->uri = 0; +@@ -704,7 +704,7 @@ static gboolean webKitWebSrcNeedDataMain + + ASSERT(isMainThread()); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + // already stopped + if (!priv->needDataID) + return FALSE; +@@ -725,7 +725,7 @@ static void webKitWebSrcNeedDataCb(GstAp + + GST_DEBUG_OBJECT(src, "Need more data: %u", length); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + if (priv->needDataID || !priv->paused) { + return; + } +@@ -739,7 +739,7 @@ static gboolean webKitWebSrcEnoughDataMa + + ASSERT(isMainThread()); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + // already stopped + if (!priv->enoughDataID) + return FALSE; +@@ -760,7 +760,7 @@ static void webKitWebSrcEnoughDataCb(Gst + + GST_DEBUG_OBJECT(src, "Have enough data"); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + if (priv->enoughDataID || priv->paused) { + return; + } +@@ -774,7 +774,7 @@ static gboolean webKitWebSrcSeekMainCb(W + + ASSERT(isMainThread()); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + // already stopped + if (!priv->seekID) + return FALSE; +@@ -792,7 +792,7 @@ static gboolean webKitWebSrcSeekDataCb(G + WebKitWebSrcPrivate* priv = src->priv; + + GST_DEBUG_OBJECT(src, "Seeking to offset: %" G_GUINT64_FORMAT, offset); +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + if (offset == priv->offset && priv->requestedOffset == priv->offset) + return TRUE; + +@@ -811,7 +811,7 @@ static gboolean webKitWebSrcSeekDataCb(G + void webKitWebSrcSetMediaPlayer(WebKitWebSrc* src, WebCore::MediaPlayer* player) + { + ASSERT(player); +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + src->priv->player = player; + } + +@@ -841,7 +841,7 @@ char* StreamingClient::createReadBuffer( + + mapGstBuffer(buffer); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + priv->buffer = adoptGRef(buffer); + locker.unlock(); + +@@ -867,7 +867,7 @@ void StreamingClient::handleResponseRece + return; + } + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + + priv->corsAccessCheck = corsAccessCheck; + +@@ -966,7 +966,7 @@ void StreamingClient::handleDataReceived + WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src); + WebKitWebSrcPrivate* priv = src->priv; + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + + GST_LOG_OBJECT(src, "Have %lld bytes of data", priv->buffer ? static_cast(gst_buffer_get_size(priv->buffer.get())) : length); + +@@ -1035,7 +1035,7 @@ void StreamingClient::handleNotifyFinish + + GST_DEBUG_OBJECT(src, "Have EOS"); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + if (!priv->seekID) { + locker.unlock(); + gst_app_src_end_of_stream(priv->appsrc); +@@ -1194,7 +1194,7 @@ void ResourceHandleStreamingClient::wasB + + GST_ERROR_OBJECT(src, "Request was blocked"); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + uri.reset(g_strdup(src->priv->uri)); + locker.unlock(); + +@@ -1208,7 +1208,7 @@ void ResourceHandleStreamingClient::cann + + GST_ERROR_OBJECT(src, "Cannot show URL"); + +- GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); ++ WebCore::GMutexLocker locker(GST_OBJECT_GET_LOCK(src)); + uri.reset(g_strdup(src->priv->uri)); + locker.unlock(); + +diff -up webkitgtk-2.4.8/Source/WTF/wtf/gobject/GMutexLocker.h.gmutexlocker webkitgtk-2.4.8/Source/WTF/wtf/gobject/GMutexLocker.h diff --git a/gnu/packages/webkit.scm b/gnu/packages/webkit.scm index 41b9b9a..1445a95 100644 --- a/gnu/packages/webkit.scm +++ b/gnu/packages/webkit.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Sou Bunnbu ;;; Copyright © 2015 David Hashe +;;; Copyright © 2015 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,9 +23,13 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system cmake) + #:use-module (guix build-system gnu) + #:use-module (gnu packages) + #:use-module (gnu packages base) #:use-module (gnu packages bison) #:use-module (gnu packages databases) #:use-module (gnu packages enchant) + #:use-module (gnu packages flex) #:use-module (gnu packages gettext) #:use-module (gnu packages gl) #:use-module (gnu packages glib) @@ -109,3 +114,33 @@ HTML/CSS applications to full-fledged web browsers.") license:lgpl2.1+ license:bsd-2 license:bsd-3)))) + +(define-public webkitgtk-2.4 + ;; Latest release of the stable 2.4 series. + (package (inherit webkitgtk) + (name "webkitgtk") + (version "2.4.8") + (source (origin + (method url-fetch) + (uri (string-append "http://www.webkitgtk.org/releases/" + name "-" version ".tar.xz")) + (sha256 + (base32 + "08xxqsxpa63nzgbsz63vrdxdxgpysyiy7jdcjb57k1hprdcibwb8")) + ;; Patch taken from + (patches (list (search-patch "webkitgtk-2.4.8-gmutexlocker.patch"))))) + (build-system gnu-build-system) + (arguments + '(#:tests? #f ; no tests + #:phases (modify-phases %standard-phases + (add-after + 'unpack 'set-gcc + (lambda _ (setenv "CC" "gcc") #t))) + #:configure-flags '("--enable-webkit2=no" + "--with-gtk=2.0"))) + (inputs + `(("flex" ,flex) + ("which" ,which) + ,@(package-inputs webkitgtk))))) -- 2.1.0 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: inline; filename=0002-gnu-Add-GnuCash.patch Content-Transfer-Encoding: 8bit >From 23ff763f1492f0e5694ed514b888410df7620c2c Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Wed, 6 May 2015 08:41:40 +0200 Subject: [PATCH 2/2] gnu: Add GnuCash. * gnu/packages/gnucash.scm: New file. * gnu-system.am (GNU_SYSTEM_MODULES): Add it. --- gnu-system.am | 1 + gnu/packages/gnucash.scm | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 gnu/packages/gnucash.scm diff --git a/gnu-system.am b/gnu-system.am index c95c335..710c0c4 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -124,6 +124,7 @@ GNU_SYSTEM_MODULES = \ gnu/packages/gl.scm \ gnu/packages/glib.scm \ gnu/packages/gnome.scm \ + gnu/packages/gnucash.scm \ gnu/packages/gnunet.scm \ gnu/packages/gnupg.scm \ gnu/packages/gnustep.scm \ diff --git a/gnu/packages/gnucash.scm b/gnu/packages/gnucash.scm new file mode 100644 index 0000000..efd3843 --- /dev/null +++ b/gnu/packages/gnucash.scm @@ -0,0 +1,72 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015 Ricardo Wurmus +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu packages gnucash) + #:use-module (guix licenses) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix build-system gnu) + #:use-module (gnu packages) + #:use-module (gnu packages gnome) + #:use-module (gnu packages glib) + #:use-module (gnu packages gtk) + #:use-module (gnu packages guile) + #:use-module (gnu packages icu4c) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages webkit) + #:use-module (gnu packages xml)) + +(define-public gnucash + (package + (name "gnucash") + (version "2.6.6") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/gnucash/gnucash-" + version ".tar.bz2")) + (sha256 + (base32 + "103ir5qg6k8m2mmg9b99c3gn8myxh1gsqyr0mfhmrhqya68wfdr3")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ;FIXME: failing at /qof/gnc-date/qof print date dmy buff + #:configure-flags '("--disable-dbi"))) + (inputs + `(("guile" ,guile-2.0) + ("intltool" ,intltool) + ("icu4c" ,icu4c) + ("glib" ,glib) + ("glib" ,glib "bin") ; glib-compile-schemas, etc. + ("gtk" ,gtk+-2) + ("goffice" ,goffice-0.8) + ("libgnomecanvas" ,libgnomecanvas) + ("libxml2" ,libxml2) + ("libxslt" ,libxslt) + ("webkitgtk" ,webkitgtk-2.4))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (home-page "https://gnu.org/software/gnucash") + (synopsis "Personal and small business financial accounting software") + (description + "GnuCash is personal and professional financial-accounting software. +It can be used to track bank accounts, stocks, income and expenses, based on +the double-entry accounting practice. It includes support for QIF/OFX/HBCI +import and transaction matching. It also automates several tasks, such as +financial calculations or scheduled transactions.") + (license gpl3+))) -- 2.1.0 --=-=-=--