Subject: [bug#41118] [PATCH V2] gnu: inkscape: Update to 1.0.

From: Maxim Cournoyer <[email-masked]>
Date: Thu, 07 May 2020 00:37:35 -0400

Hi again,

Here's a v2 for the Inkscape 1.0 patch.  It adds a couple optional
dependencies that are nice to have.  Thanks to Nicolò Balzarotti who
shared another Inkscape 1.0 patch on guix-devel.

Maxim

>From 30e39891c1e502bc325ce3d853d91238f5f61ca7 Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <[email-masked]>
Date: Mon, 6 Jan 2020 16:37:44 -0500
Subject: [PATCH] gnu: inkscape: Update to 1.0.

* gnu/packages/inkscape.scm (inkscape)[version]: Update to 1.0.
[origin]: Remove the obsolete Poppler patch.  Add a macro to remove bundled
libraries where possible.
[inputs]: Upgrade gtk+-2 and gtkmm-2 to their current version.  Add autotrace,
gdl-minimal, lib2geom, libjpeg, libsoup, gtkspell3, libcdr, libwpd, libwpg and
libvisio.  Upgrade python-2 to its current version, and move it...
[native-inputs]: ...here.  Add imagemagick and googletest.
[arguments]: Enable tests, specifying the test target as "check".  Move the
check phase after the install phase.  Remove the obsoleted
adjust-for-new-poppler phase.  Add a set-home phase to quiet Inkscape
warnings.  Add a disable-latex-export-tests phase to skip failing tests.
[license]: Change to GPLv3+, although upstream says GPLv2+, due to an
unresolved license incompatibility when building with the external lib2geom
library.
* gnu/packages/patches/inkscape-poppler-0.76.patch: Delete file.
* gnu/local.mk: Unregister it.
---
 gnu/local.mk                                  |   1 -
 gnu/packages/inkscape.scm                     | 193 ++++++++++++++----
 .../patches/inkscape-poppler-0.76.patch       |  36 ----
 3 files changed, 154 insertions(+), 76 deletions(-)
 delete mode 100644 gnu/packages/patches/inkscape-poppler-0.76.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 86efba5d2d..da8ac7c130 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1089,7 +1089,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/ilmbase-fix-tests.patch			\
   %D%/packages/patches/ilmbase-openexr-pkg-config.patch		\
   %D%/packages/patches/inetutils-hurd.patch			\
-  %D%/packages/patches/inkscape-poppler-0.76.patch		\
   %D%/packages/patches/intltool-perl-compatibility.patch	\
   %D%/packages/patches/irrlicht-use-system-libs.patch		\
   %D%/packages/patches/isl-0.11.1-aarch64-support.patch	\
diff --git a/gnu/packages/inkscape.scm b/gnu/packages/inkscape.scm
index 26d4642547..65d6e5687b 100644
--- a/gnu/packages/inkscape.scm
+++ b/gnu/packages/inkscape.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016, 2018 Ricardo Wurmus <[email-masked]>
 ;;; Copyright © 2017, 2020 Marius Bakke <[email-masked]>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <[email-masked]>
+;;; Copyright © 2020 Maxim Cournoyer <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -30,8 +31,13 @@
   #:use-module (gnu packages aspell)
   #:use-module (gnu packages bdw-gc)
   #:use-module (gnu packages boost)
+  #:use-module (gnu packages check)
   #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages graphics)
   #:use-module (gnu packages gtk)
+  #:use-module (gnu packages imagemagick)
+  #:use-module (gnu packages libreoffice)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pdf)
@@ -46,64 +52,173 @@
 (define-public inkscape
   (package
     (name "inkscape")
-    (version "0.92.4")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://media.inkscape.org/dl/"
-                                  "resources/file/"
-                                  "inkscape-" version ".tar.bz2"))
-              (patches (search-patches "inkscape-poppler-0.76.patch"))
-              (sha256
-               (base32
-                "0pjinhjibfsz1aywdpgpj3k23xrsszpj4a1ya5562dkv2yl2vv2p"))))
+    (version "1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://media.inkscape.org/dl/"
+                           "resources/file/"
+                           "inkscape-" version ".tar.xz"))
+       (sha256
+        (base32
+         "1fwl7yjkykqb86555k4fm24inhc40mrvxqwgl2v2vi9alv8j7hc9"))
+       (modules '((guix build utils)
+                  (ice-9 format)))
+       (snippet
+        '(begin
+           (let-syntax
+               ;; XXX: The build system doesn't currently support using
+               ;; system libraries over bundled ones (see:
+               ;; https://gitlab.com/inkscape/inkscape/issues/876).
+               ((unbundle
+                 (syntax-rules ()
+                   ((_ (name source-dir use-pkg-config?) ...)
+                    (begin
+                      ;; Delete bundled source directories.
+                      (delete-file-recursively source-dir) ...
+                      (substitute* '("src/CMakeLists.txt"
+                                     "src/3rdparty/CMakeLists.txt")
+                        (((string-append ".*add_subdirectory\\("
+                                         (basename source-dir) "\\).*"))
+                         "") ...)
+                      ;; Remove bundled entries from INKSCAPE_TARGET_LIBS.
+                      (substitute* "src/CMakeLists.txt"
+                        (((string-append name "_LIB.*")) "") ...)
+                      ;; Register the external libraries, so that their
+                      ;; headers are added to INKSCAPE_INCS_SYS and their
+                      ;; shared libraries added to INKSCAPE_LIBS.
+                      (if use-pkg-config?
+                          (let* ((width (string-length "pkg_check_modules("))
+                                 (indent (string-join (make-list width " ") "")))
+                            (substitute* "CMakeScripts/DefineDependsandFlags.cmake"
+                              (("^pkg_check_modules\\(INKSCAPE_DEP REQUIRED.*" start)
+                               (string-append start
+                                              (format #f "~a~a~%" indent name)))))
+                          (substitute* "CMakeScripts/DefineDependsandFlags.cmake"
+                            (("^find_package\\(Iconv REQUIRED\\).*" start)
+                             (string-append (format #f "
+find_path(~a_INCLUDE_DIR NAMES ~:*~a/~:*~a.h ~:*~a.h)
+if(NOT ~:*~a_INCLUDE_DIR)
+  message(FATAL_ERROR \"~:*~a headers not found\")
+else()
+  list(APPEND INKSCAPE_INCS_SYS ${~:*~a_INCLUDE_DIR})
+endif()
+
+find_library(~:*~a_LIB NAMES ~:*~a)
+if(NOT ~:*~a_LIB)
+  message(FATAL_ERROR \"~:*~a library not found\")
+else()
+  list(APPEND INKSCAPE_LIBS ~:*~a_LIB)
+endif()~%~%"
+                                                    name)
+                                            start)))) ...
+                      ;; Fix the references to the headers of the
+                      ;; unbundled libraries.
+                      (substitute* (find-files "." "\\.h$|\\.cpp$")
+                        (((string-append "#include (\"|<)3rdparty/"
+                                         (basename source-dir)) _ quote)
+                         (string-append "#include " quote
+                                        (basename source-dir)))
+                        ...))))))
+             (unbundle ("2geom" "src/2geom" #t)
+                       ;; libcroco cannot be unbundled as it is heavily
+                       ;; modified (see:
+                       ;; https://gitlab.com/inkscape/inkscape/issues/876#note_276114904).
+                       ;; ("croco" "src/3rdparty/libcroco" #t)
+                       ;; FIXME: Unbundle the following libraries once they
+                       ;; have been packaged.
+                       ;; ("cola" "src/3rdparty/adaptagrams/libcola")
+                       ;; ("avoid" "src/3rdparty/adaptagrams/libavoid")
+                       ;; ("vpsc" "src/3rdparty/adaptagrams/libvpsc")
+                       ;; libuemf cannot be unbundled as it slightly modified
+                       ;; from upstream (see:
+                       ;; https://gitlab.com/inkscape/inkscape/issues/973).
+                       ;; ("uemf" "src/3rdparty/libuemf" #f)
+                       ;; FIXME: libdepixelize upstream is ancient and doesn't
+                       ;; build with a recent lib2geom
+                       ;; (see: https://bugs.launchpad.net/libdepixelize/+bug/1862458).
+                       ;;("depixelize" "src/3rdparty/libdepixelize")
+                       ("autotrace" "src/3rdparty/autotrace" #t)))
+           ;; Lift the requirement on the double-conversion library, as
+           ;; it is only needed by lib2geom, which is now unbundled.
+           (substitute* "CMakeScripts/DefineDependsandFlags.cmake"
+             ((".*find_package\\(DoubleConversion.*") ""))
+           #t))))
     (build-system cmake-build-system)
+    (arguments
+     `(#:tests? #t
+       #:test-target "check"            ;otherwise some test binaries are missing
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-icon-cache-generator
+           (lambda _
+             (substitute* "share/icons/application/CMakeLists.txt"
+               (("gtk-update-icon-cache") "true"))
+             #t))
+         (add-after 'unpack 'disable-latex-export-tests
+           ;; FIXME: For some reason the test.pdf_tex file generated by the
+           ;; "--export-latex" lacks "some text" in its content when run in
+           ;; the build environment.  Skip the related tests.
+           (lambda _
+             (substitute* "testfiles/cli_tests/CMakeLists.txt"
+               (("add_cli_test\\(export-latex")
+                "message(TEST_DISABLED: export-latex"))
+             #t))
+         (add-after 'unpack 'set-home
+           ;; Mute Inkscape warnings during tests.
+           (lambda _
+             (setenv "HOME" (getcwd))
+             (format #t "ARGS is set to: ~a" (getenv "ARGS"))
+             #t))
+         ;; Move the check phase after the install phase, as when run in the
+         ;; tests, Inkscape relies on files that are not yet installed, such
+         ;; as the "share/inkscape/ui/units.xml" file.
+         (delete 'check)
+         (add-after 'install 'check
+           (assoc-ref %standard-phases 'check)))))
     (inputs
      `(("aspell" ,aspell)
-       ("gtkmm" ,gtkmm-2)
-       ("gtk" ,gtk+-2)
+       ("autotrace" ,autotrace)
+       ("gdl" ,gdl-minimal)
+       ("gtkmm" ,gtkmm)
+       ("gtk" ,gtk+)
+       ("gtkspell3" ,gtkspell3)
        ("gsl" ,gsl)
        ("poppler" ,poppler)
+       ;;("libcroco" ,libcroco) ;see comment in origin snippet above
+       ("lib2geom" ,lib2geom)
+       ;; ("libdepixelize" ,libdepixelize) ;build is currently broken
+       ("libjpeg" ,libjpeg-turbo)
        ("libpng" ,libpng)
+       ;;("libuemf" ,libuemf)  ;see comment in origin snippet above
        ("libxml2" ,libxml2)
        ("libxslt" ,libxslt)
        ("libgc" ,libgc)
+       ("libsoup" ,libsoup-minimal)
+       ("libcdr" ,libcdr)
+       ("libvisio" ,libvisio)
+       ("libwpd" ,libwpd)
+       ("libwpg" ,libwpg)
        ("freetype" ,freetype)
        ("popt" ,popt)
        ("potrace" ,potrace)
-       ("python" ,python-2)
        ("lcms" ,lcms)
        ("boost" ,boost)))
     (native-inputs
-     `(("intltool" ,intltool)
+     `(("imagemagick" ,imagemagick)     ;for tests
+       ("intltool" ,intltool)
        ("glib" ,glib "bin")
+       ("googletest" ,googletest)
        ("perl" ,perl)
-       ("pkg-config" ,pkg-config)))
-    ;; FIXME: tests require gmock
-    (arguments
-     `(#:tests? #f
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-icon-cache-generator
-           (lambda _
-             (substitute* "share/icons/application/CMakeLists.txt"
-              (("gtk-update-icon-cache") "true"))
-             #t))
-         (add-after 'unpack 'adjust-for-new-poppler
-           (lambda _
-             (substitute* (find-files "src/extension/internal/pdfinput")
-               ;; Needed for Poppler 0.82.
-               (("Unicode \\*u") "Unicode const *u")
-               ;; Needed for Poppler 0.83.
-               (("\\(GfxPath") "(const GfxPath")
-               (("GfxSubpath") "const GfxSubpath")
-               (("new GlobalParams\\(\\)")
-                "std::unique_ptr<GlobalParams>(new GlobalParams())")
-               (("new GlobalParams\\(poppler_datadir\\)")
-                "std::unique_ptr<GlobalParams>(new GlobalParams(poppler_datadir))"))
-             #t)))))
+       ("pkg-config" ,pkg-config)
+       ("python" ,python-wrapper)))
     (home-page "https://inkscape.org/")
     (synopsis "Vector graphics editor")
     (description "Inkscape is a vector graphics editor.  What sets Inkscape
 apart is its use of Scalable Vector Graphics (SVG), an XML-based W3C standard,
 as the native format.")
-    (license license:gpl2+)))
+    ;; The external, unbundled lib2geom library effective license is GPLv3+,
+    ;; given it links against the GNU Scientific Library, which in turn means
+    ;; that the license of Inkscape should also be GPLv3+, when built this way
+    ;; (see: https://gitlab.com/inkscape/inkscape/issues/784).
+    (license license:gpl3+)))
diff --git a/gnu/packages/patches/inkscape-poppler-0.76.patch b/gnu/packages/patches/inkscape-poppler-0.76.patch
deleted file mode 100644
index 08e8303892..0000000000
--- a/gnu/packages/patches/inkscape-poppler-0.76.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-This patch adds support for Poppler 0.76 and later.
-
-Taken from upstream:
-<https://gitlab.com/inkscape/inkscape/commit/e831b034746f8dc3c3c1b88372751f6dcb974831>
-
-diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
-index 8484984bdf..4f798e35bf 100644
---- a/src/extension/internal/pdfinput/pdf-parser.cpp
-+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
-@@ -421,7 +421,7 @@ void PdfParser::parse(Object *obj, GBool topLevel) {
- 	error(errInternal, -1, "Weird page contents");
-     	return;
-   }
--  parser = new Parser(xref, new Lexer(xref, obj), gFalse);
-+  parser = new _POPPLER_NEW_PARSER(xref, obj);
-   go(topLevel);
-   delete parser;
-   parser = nullptr;
-diff --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h
-index 61a15083a0..5e8bc4ae90 100644
---- a/src/extension/internal/pdfinput/poppler-transition-api.h
-+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
-@@ -14,6 +14,13 @@
- 
- #include <glib/poppler-features.h>
- 
-+#if POPPLER_CHECK_VERSION(0, 76, 0)
-+#define _POPPLER_NEW_PARSER(xref, obj) Parser(xref, obj, gFalse)
-+#else
-+#define _POPPLER_NEW_PARSER(xref, obj) Parser(xref, new Lexer(xref, obj), gFalse)
-+#endif
-+
-+
- #if POPPLER_CHECK_VERSION(0, 72, 0)
- #define getCString c_str
- #endif
-- 
2.26.2