aboutsummaryrefslogtreecommitdiff
# GNU Guix --- Functional package management for GNU
# Copyright © 2022 Ludovic Courtès <ludo@gnu.org>
#
# 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 <http://www.gnu.org/licenses/>.

#
# Test 'guix shell --export-manifest'.
#

guix shell --version

tmpdir="t-guix-manifest-$$"
trap 'rm -r "$tmpdir"' EXIT
mkdir "$tmpdir"

manifest="$tmpdir/manifest.scm"

# Basics.
guix shell --export-manifest guile-bootstrap > "$manifest"
test "$(guix build -m "$manifest")" = "$(guix build guile-bootstrap)"

guix shell -m "$manifest" --bootstrap -- \
     "$SHELL" -c 'guix package --export-manifest -p "$GUIX_ENVIRONMENT"' > \
     "$manifest.second"
for m in "$manifest" "$manifest.second"
do
    grep -v '^;' < "$m" > "$m.new" # filter out comments
    mv "$m.new" "$m"
done

cat "$manifest"
cat "$manifest.second"

cmp "$manifest" "$manifest.second"

# Manifest for a profile.
guix shell --bootstrap guile-bootstrap -r "$tmpdir/profile" -- \
     guile --version
test -x "$tmpdir/profile/bin/guile"
guix shell -p "$tmpdir/profile" --export-manifest > "$manifest.second"
guix shell --export-manifest guile-bootstrap > "$manifest"
cat "$manifest.second"
cmp "$manifest" "$manifest.second"

rm "$tmpdir/profile"

# Combining manifests.
guix shell --export-manifest -m "$manifest" gash gash-utils \
     > "$manifest.second"
guix build -m "$manifest.second" -d | \
    grep "$(guix build guile-bootstrap -d)"
guix build -m "$manifest.second" -d | \
    grep "$(guix build gash -d)"

# Package transformation option.
guix shell --export-manifest guile guix \
     --with-input=guile-json@3=guile-json > "$manifest"
grep 'options->transformation' "$manifest"
grep '(with-input . "guile-json@3=guile-json")' "$manifest"

# Development manifest.
guix shell --export-manifest -D guile git > "$manifest"
grep 'package->development-manifest' "$manifest"
grep '"guile"' "$manifest"
guix build -m "$manifest" -d | \
    grep "$(guix build -e '(@@ (gnu packages commencement) gcc-final)' -d)"
guix build -m "$manifest" -d | \
    grep "$(guix build git -d)"

guix shell --export-manifest -D guile -D python-itsdangerous > "$manifest"
guix build -m "$manifest" -d | grep "$(guix build libffi -d)"
guix build -m "$manifest" -d | \
    grep "$(guix build -e '(@ (gnu packages python) python)' -d)"

# Test various combinations to make sure generated code uses interfaces
# correctly.
for options in					\
    "coreutils grep sed"			\
    "gsl openblas gcc-toolchain --tune"		\
    "guile -m $manifest.previous"		\
    "git:send-email gdb guile:debug"		\
    "git -D coreutils"
do
    guix shell --export-manifest $options > "$manifest"
    cat "$manifest"
    guix shell -m "$manifest" -n
    mv "$manifest" "$manifest.previous"
done
stitute* "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/3rdparty/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.*") "")))))) (build-system cmake-build-system) (arguments (list #:test-target "check" ;otherwise some test binaries are missing #:disallowed-references (list imagemagick/stable) #:imported-modules `(,@%cmake-build-system-modules (guix build glib-or-gtk-build-system)) #:modules '((guix build cmake-build-system) ((guix build glib-or-gtk-build-system) #:prefix glib-or-gtk:) (guix build utils)) ;; Disable imagemagick support in the stable variant, to reduce the ;; number of dependents of the 'imagemagick' package. #:configure-flags #~(list "-DWITH_IMAGE_MAGICK=OFF" ;; TODO: Remove after next release, since the problematic ;; libsoup/soup.h include is no longer used. (string-append "-DCMAKE_CXX_FLAGS=-I" (search-input-directory %build-inputs "/include/libsoup-2.4"))) #:phases #~(modify-phases %standard-phases (add-after 'unpack 'generate-gdk-pixbuf-loaders-cache-file (assoc-ref glib-or-gtk:%standard-phases 'generate-gdk-pixbuf-loaders-cache-file)) #$@(if (or (target-aarch64?) (target-ppc64le?) (target-riscv64?)) '((add-after 'unpack 'disable-more-tests (lambda _ ;; https://gitlab.com/inkscape/inkscape/-/issues/3554#note_1035680690 (substitute* "testfiles/CMakeLists.txt" (("lpe64-test") "#lpe64-test") ((" lpe-test") " #lpe-test") (("add_subdirectory\\(lpe_tests\\)") "")) ;; https://gitlab.com/inkscape/inkscape/-/issues/3554#note_1035539888 ;; According to upstream, this is a false positive. (substitute* "testfiles/rendering_tests/CMakeLists.txt" (("add_rendering_test\\(test-use" all) (string-append "#" all))) ;; https://gitlab.com/inkscape/inkscape/-/issues/3554#note_1035539888 ;; Allegedly a precision error in the gamma. (substitute* "testfiles/cli_tests/CMakeLists.txt" (("add_cli_test\\(export-png-color-mode-gray-8_png" all) (string-append "#" all)) ;; These also seem to be failing due to precision errors. (("add_pdfinput_test\\(font-(spacing|style) 1 draw-all" all) (string-append "#" all)))))) '()) #$@(if (target-x86-32?) '((add-after 'unpack 'fix-32bit-size_t-format (lambda _ ;; Fix an error due to format type mismatch with 32-bit size_t. (substitute* "testfiles/src/visual-bounds-test.cpp" (("%lu") "%u"))))) '()) (add-after 'unpack 'set-home ;; Mute Inkscape warnings during tests. (lambda _ (setenv "HOME" (getcwd)))) ;; 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 ;; Use ctest directly so that we can easily exclude problematic ;; tests. (lambda* (#:key parallel-tests? tests? #:allow-other-keys) (when tests? ;; The following tests fails, perhaps due to building without ;; ImageMagick (see: ;; https://gitlab.com/inkscape/inbox/-/issues/10005). (let ((job-count (if parallel-tests? (number->string (parallel-job-count)) "1")) (skipped-tests (list "cli_export-type-caseinsensitive_check_output" "cli_export-type_xaml_check_output" "cli_export-height_export-use-hints_check_output" "cli_export-plain-svg_check_output" "cli_export-use-hints_export-id_check_output" "cli_export-extension_svg_check_output" "cli_export-extension_ps_check_output" "cli_export-extension_eps_check_output" "cli_export-extension_pdf_check_output" "cli_export-plain-extension-svg_check_output" ;; These fail non-deterministically (see: ;; https://gitlab.com/inkscape/inbox/-/issues/10005). "cli_export-ps-level_3_check_output" "cli_export-ps-level_3_content_check_output" "cli_export-ps-level_2_content_check_output" "cli_export-ps-level_2_check_output" ;; These fail on i686 but not x86-64 #$@(if (target-x86-32?) '("cli_pdfinput-font-spacing_check_output" "cli_pdfinput-font-style_check_output" "cli_pdfinput-latex_check_output" "cli_pdfinput-multi-page-sample_check_output" "test_lpe") '())))) (invoke "make" "-j" job-count "tests") (invoke "ctest" "-j" job-count "--output-on-error" "-E" (string-append "(" (string-join skipped-tests "|") ")")))))) (add-after 'install 'glib-or-gtk-compile-schemas (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-compile-schemas)) (add-after 'glib-or-gtk-compile-schemas 'glib-or-gtk-wrap (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap)) (add-after 'install 'wrap-program ;; Ensure Python is available at runtime. (lambda* (#:key inputs #:allow-other-keys) (wrap-program (string-append #$output "/bin/inkscape") `("PATH" prefix (,(dirname (search-input-file inputs "bin/python")))) `("GUIX_PYTHONPATH" prefix (,(getenv "GUIX_PYTHONPATH"))) ;; Wrapping GDK_PIXBUF_MODULE_FILE allows Inkscape to load ;; its own icons in pure environments. `("GDK_PIXBUF_MODULE_FILE" = (,(getenv "GDK_PIXBUF_MODULE_FILE"))) ;; Ensure GObject Introspection typelibs are found. `("GI_TYPELIB_PATH" ":" prefix (,(getenv "GI_TYPELIB_PATH"))))))))) (inputs (list (librsvg-for-system) ;for the pixbuf loader autotrace bash-minimal boost freetype gdl-minimal gsl gspell gtk+ gtkmm-3 lcms lib2geom libcdr libgc libjpeg-turbo libpng libsoup-minimal-2 libvisio libwpd libwpg libxml2 libxslt poppler popt potrace ;; These Python dependencies are used by the Inkscape extension ;; management system. To verify that it is working, visit the ;; Extensions -> Manage Extensions... menu. python-appdirs python-cssselect python-lxml python-numpy python-pygobject python-pyserial python-requests python-scour python-wrapper readline)) (native-inputs (list `(,glib "bin") bc gettext-minimal googletest imagemagick/stable ;for tests perl pkg-config)) (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:gpl3+)))) ;see the file COPYING (define-public inkscape (package (inherit inkscape/stable) (name "inkscape") (version "1.3.2") (source (origin (inherit (package-source inkscape/stable)) (method url-fetch) (uri (string-append "https://media.inkscape.org/dl/" "resources/file/" "inkscape-" version ".tar.xz")) (sha256 (base32 "0sq81smxwypgnp7r3wgza8w25dsz9qa8ga79sc85xzj3qi6q9lfv")))) (build-system cmake-build-system) (arguments (substitute-keyword-arguments (package-arguments inkscape/stable) ((#:configure-flags flags ''()) ;; Enable ImageMagick support. #~(delete "-DWITH_IMAGE_MAGICK=OFF" #$flags)) ((#:phases phases) #~(modify-phases #$phases #$@(if (target-x86-32?) #~() ;XXX: there are remaining failures on i686 #~((replace 'check ;; Re-instate the tests disabled in inkscape/stable, now that ;; their ImageMagick requirement is satisfied. (assoc-ref %standard-phases 'check)))) (replace 'wrap-program ;; Ensure Python is available at runtime. (lambda _ (wrap-program (string-append #$output "/bin/inkscape") `("GUIX_PYTHONPATH" prefix (,(getenv "GUIX_PYTHONPATH"))) ;; Wrapping GDK_PIXBUF_MODULE_FILE allows Inkscape to load ;; its own icons in pure environments. `("GDK_PIXBUF_MODULE_FILE" = (,(getenv "GDK_PIXBUF_MODULE_FILE")))))))))) (inputs (modify-inputs (package-inputs inkscape/stable) (append imagemagick))) ;for libMagickCore and libMagickWand (native-inputs (modify-inputs (package-native-inputs inkscape/stable) ;; Only use 1 imagemagick across the package build. (replace "imagemagick" imagemagick))) (properties (alist-delete 'hidden? (package-properties inkscape/stable)))))