[bug#66606,v3] gnu: Add reduce-csl.
Commit Message
Hello,
Am Thu, Feb 06, 2025 at 09:40:11PM +0500 schrieb Nigko Yerden:
> I rewrote this old patch. New patch provides
> 1. Updated package revision number 6860 (was 6547).
> 2. Apparent reproducibility of the package.
> 3. 'check' build phase for running tests.
> 4. Unbundled libffi.
thanks for sending the new patch, and so quickly; I did not expect
unbundling of libffi to require so much work! And running tests is also
good.
I have moved the package from the maths to the algebra module (which is
more specific). The patch needs to be registered in local.mk.
I would also suggest to use the snapshot date and not the svn commit as
the version number, since it is more telling (and also appears "higher
up" in the file hierarchy on their site).
And maybe call the package just "reduce" instead of "reduce-csl"?
I wondered whether we should also compile with psl (using "--with-both"
instead of "--with-csl"); but I suppose that this would just create a
duplicate?
It is a bit surprising to first use "--without-autogen" and then call
autogen in a separate phase, but I tried to drop both, and this caused
an error.
The package compiles, and I could run reduce with a few of the examples
from their website.
Are you okay with the patch as attached, or would you prefer to handle
differently some changes I made?
Andreas
From fd80b9f9f53326f9855379244c96aabbc122d08d Mon Sep 17 00:00:00 2001
Message-ID: <fd80b9f9f53326f9855379244c96aabbc122d08d.1738920719.git.andreas@enge.fr>
From: Nigko Yerden <nigko.yerden@gmail.com>
Date: Thu, 6 Feb 2025 21:40:11 +0500
Subject: [PATCH] gnu: Add reduce.
* gnu/packages/math.scm (reduce): New variable.
* gnu/packages/patches/reduce-unbundle-libffi.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register file.
Change-Id: Ic85be7dc490f005f7ba65c418250cc9681fbb3a8
Signed-off-by: Andreas Enge <andreas@enge.fr>
---
gnu/local.mk | 1 +
gnu/packages/algebra.scm | 106 +++++++++++++++
.../patches/reduce-unbundle-libffi.patch | 125 ++++++++++++++++++
3 files changed, 232 insertions(+)
create mode 100644 gnu/packages/patches/reduce-unbundle-libffi.patch
base-commit: 2a4bba2249a71e928bd612d47b6ef439dc498c9c
Comments
Hello,
Andreas Enge wrote:
> thanks for sending the new patch, and so quickly; I did not expect
> unbundling of libffi to require so much work!
Yes, these build scripts are somewhat messy! Now I wonder if we really
need unbundled libffi? This patch provide us with additional maintainance
burden, while the benefit of unbundling libffi is negligibly small
(libffi takes in my /gnu/store only 272K of space and even
smaller than that in RAM). Frankly, I would prefer to have libffi
as a bundled library.
> I have moved the package from the maths to the algebra module (which is
> more specific).
That's fine, but is it okay that Maxima CAS, which is a twin sister (or brother)
of Reduce, resides in maths.scm? It would make sense to put those two together.
> The patch needs to be registered in local.mk.
That’s useful to know.
> I would also suggest to use the snapshot date and not the svn commit as
> the version number, since it is more telling (and also appears "higher
> up" in the file hierarchy on their site).
That's totally fine.
> And maybe call the package just "reduce" instead of "reduce-csl"?
Indeed, I'm in favor of "reduce". It is clearer and shorter.
> I wondered whether we should also compile with psl (using "--with-both"
> instead of "--with-csl"); but I suppose that this would just create a
> duplicate?
From the document https://reduce-algebra.sourceforge.io/lisp-docs/insidereduce.pdf
on p. 34 we read:
> While all relevant source file for all of PSL are available as part of
> the Reduce distribution the normal way of building Reduce starts by
> having pre-made PSL binary files to use. These are provided for a range
> of targets (mainly using Intel processors) but machines by SGI and Sun
> (at least) are also reasonably easy to find.
Those binaries for Portable Standard Lisp (PSL) are included in the repo directly.
As far as I know, nobody builds those binaries from sources, perhaps written in
some ancient language, for many years. This is in contrast to Codemist Standard
Lisp (CSL) written in C++. Therefore CSL Reduce exists for a good reason.
Thank you for doing this patch!
Regards,
Nigko
Hello,
Am Fri, Feb 07, 2025 at 05:13:35PM +0500 schrieb Nigko Yerden:
> Yes, these build scripts are somewhat messy! Now I wonder if we really
> need unbundled libffi? This patch provide us with additional maintainance
> burden, while the benefit of unbundling libffi is negligibly small
> (libffi takes in my /gnu/store only 272K of space and even
> smaller than that in RAM). Frankly, I would prefer to have libffi
> as a bundled library.
well, it is a Guix principle to unbundle as much as possible, with an
eye on the effort it takes. But now that you have done all the work, I
prefer to keep the library unbundled.
> That's fine, but is it okay that Maxima CAS, which is a twin sister (or brother)
> of Reduce, resides in maths.scm? It would make sense to put those two together.
Yes, and I think it was a mistake to put Maxima in maths instead of
algebra. But moving it would break "git blame", so I would suggest to
leave it where it is.
Thanks for all your other comments! I have pushed the patch and am
closing this issue.
Apologies again for not working on your submission earlier. Next time it
happens on a patch of yours in my realm, please feel free to ping me.
Andreas
@@ -2167,6 +2167,7 @@ dist_patch_DATA = \
%D%/packages/patches/rtags-separate-rct.patch \
%D%/packages/patches/racket-chez-scheme-bin-sh.patch \
%D%/packages/patches/racket-rktio-bin-sh.patch \
+ %D%/packages/patches/reduce-unbundle-libffi.patch \
%D%/packages/patches/remake-impure-dirs.patch \
%D%/packages/patches/restartd-update-robust.patch \
%D%/packages/patches/restic-0.9.6-fix-tests-for-go1.15.patch \
@@ -17,6 +17,7 @@
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2023 Mehmet Tekman <mtekman89@gmail.com>
;;; Copyright © 2025 Sharlatan Hellseher <sharlatanus@gmail.com>
+;;; Copyright © 2025 Nigko Yerden <nigko.yerden@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -36,6 +37,7 @@
(define-module (gnu packages algebra)
#:use-module (gnu packages)
#:use-module (gnu packages autotools)
+ #:use-module (gnu packages base)
#:use-module (gnu packages bash)
#:use-module (gnu packages bison)
#:use-module (gnu packages boost)
@@ -46,14 +48,17 @@ (define-module (gnu packages algebra)
#:use-module (gnu packages documentation)
#:use-module (gnu packages flex)
#:use-module (gnu packages fltk)
+ #:use-module (gnu packages fontutils)
#:use-module (gnu packages gcc)
#:use-module (gnu packages gl)
#:use-module (gnu packages graphviz)
#:use-module (gnu packages image)
#:use-module (gnu packages java)
+ #:use-module (gnu packages libffi)
#:use-module (gnu packages maths)
#:use-module (gnu packages mpi)
#:use-module (gnu packages multiprecision)
+ #:use-module (gnu packages ncurses)
#:use-module (gnu packages networking)
#:use-module (gnu packages ocaml)
#:use-module (gnu packages perl)
@@ -1875,3 +1880,104 @@ (define-public parform
(description (string-append (package-description form)
" This package also includes
@code{parform}, a version of FORM parallelized using OpenMPI."))))
+
+(define-public reduce
+ (package
+ (name "reduce")
+ (version "2024-08-12")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "mirror://sourceforge/reduce-algebra/snapshot_"
+ version "/Reduce-svn6860-src.tar.gz"))
+ (sha256
+ (base32
+ "13bij9d4dj96vd5di59skz77s2fihj7awmkx403fvh9rd04ly25z"))
+ (modules '((guix build utils)))
+ (patches (search-patches "reduce-unbundle-libffi.patch"))
+ ;; remove binaries and unnecessary parts
+ ;; to ensure we build from source files only
+ (snippet '(map delete-file-recursively
+ (append (find-files "csl/generated-c" "\\.img$")
+ '("psl" "vsl"
+ "jlisp"
+ "jslisp"
+ "libedit"
+ "macbuild"
+ "MacPorts"
+ "mac-universal"
+ "reduce2"
+ "winbuild64"
+ "common-lisp"
+ "contrib"
+ "generic/qreduce"
+ "web/htdocs/images/Thumbs.db")
+ (find-files "csl"
+ "^(embedded|new-embedded|winbuild|support-packages)$"
+ #:directories? #t)
+ (find-files "libraries"
+ "^(original|wineditline|libffi|libffi-for-mac)$"
+ #:directories? #t))))))
+ (build-system gnu-build-system)
+ (arguments
+ (list #:configure-flags
+ #~(list "--without-autogen"
+ ;; fix conflict with internal build name determination
+ "--build="
+ "--with-csl"
+ (string-append "CPPFLAGS=-I"
+ #$freetype
+ "/include/freetype2"))
+ #:make-flags #~(list "csl")
+ #:phases
+ #~(modify-phases %standard-phases
+ (replace 'check
+ (lambda* (#:key tests? #:allow-other-keys)
+ (when tests?
+ (invoke "scripts/testall.sh" "--csl" "--noregressions"))))
+ (add-before 'patch-source-shebangs 'autogen
+ (lambda _
+ (invoke "sh" "autogen.sh")))
+ (add-after 'install 'fix-install
+ (lambda _
+ (copy-file "bin/rfcsl"
+ (string-append #$output "/bin/rfcsl"))
+ (copy-file "generic/newfront/redfront.1"
+ (string-append #$output
+ "/share/man/man1/rfcsl.1"))
+ (let ((.desktop-file
+ "debianbuild/reduce/debian/redcsl.desktop")
+ (icon "debianbuild/reduce/debian/reduce.png"))
+ (install-file .desktop-file
+ (string-append #$output
+ "/share/applications"))
+ (install-file icon
+ (string-append
+ #$output
+ "/share/icons/hicolor/32x32/apps")))
+ (with-directory-excursion #$output
+ (map (lambda (dir)
+ (map (lambda (file)
+ (chmod file #o444))
+ (find-files dir)))
+ '("share/man/man1" "share/reduce/fonts"))))))))
+ (native-inputs (list autoconf automake libtool which))
+ (inputs
+ ;; bundled libraries: fox (adjusted) editline (adjusted)
+ ;; crlibm softfloat
+ (list freetype libffi libx11 libxext libxft ncurses))
+ (synopsis "Portable general-purpose computer algebra system")
+ (description
+ "REDUCE is a portable general-purpose computer algebra system. It is a
+system for doing scalar, vector and matrix algebra by computer, which also
+supports arbitrary precision numerical approximation and interfaces to
+gnuplot to provide graphics. It can be used interactively for simple
+calculations but also provides a full programming language, with a syntax
+similar to other modern programming languages. REDUCE supports alternative
+user interfaces including Run-REDUCE, TeXmacs and GNU Emacs. This package
+provides the Codemist Standard Lisp (CSL) version of REDUCE. It uses the
+gnuplot program, if installed, to draw figures.")
+ (home-page "https://reduce-algebra.sourceforge.io/")
+ (license (license:non-copyleft "file://README"
+ "See README in the distribution."))))
+
new file mode 100644
@@ -0,0 +1,125 @@
+This patch unbundles libffi.
+
+Index: autogen.sh
+===================================================================
+diff --git a/autogen.sh b/autogen.sh
+--- a/autogen.sh (revision 6860)
++++ b/autogen.sh (working copy)
+@@ -142,18 +142,6 @@
+ ;;
+ *--with-csl* | *--with-both*)
+ L="$L ./csl ./csl/cslbase ./csl/cslbase-nothrow ./libraries/SoftFloat-3a/source"
+-# On Apple m1 (ie arm64) I will want to build a universal version of the
+-# libffi library and that is done in a way that differs from standrad builds.
+- case "`uname -s` `uname -m`" in
+- *Darwin*arm64*)
+- L="$L ./libraries/libffi-for-mac/libffi-3.3-arm64"
+- L="$L ./libraries/libffi-for-mac/libffi-3.3-x86_64"
+- L="$L ./libraries/libffi"
+- ;;
+- *)
+- L="$L ./libraries/libffi"
+- ;;
+- esac
+ case $a in
+ *--without-fox* | *with-fox=no* | \
+ *--without-gui* | *with-gui=no*)
+Index: configure.ac
+===================================================================
+diff --git a/configure.ac b/configure.ac
+--- a/configure.ac (revision 6860)
++++ b/configure.ac (working copy)
+@@ -1389,37 +1389,6 @@
+ cd "$builddir"
+ fi
+
+-AC_MSG_NOTICE([About to configure libffi])
+-mkdir -p libffi
+-if test `uname` = "Darwin" && test "$enable_universal" != "no"
+-then
+-# This is a messy script that arranges to build a universal version of
+-# the library on MacOS. It does this by building arm64 and an x86_64
+-# separately and then merging the resulting libraries.
+- sed "s+@srcdir@+$abssrcdir+" \
+- < $abssrcdir/libraries/libffi-for-mac/Makefile \
+- > libffi/Makefile
+-else
+- cd libffi
+- setpasscc
+- doconfig="$SHELL $abssrcdir/libraries/libffi/configure -C $filtered \
+- $pass_host \
+- CPPFLAGS=\"$CPPFLAGS\" \
+- CFLAGS=\"$CFLAGS\" \
+- CXXFLAGS=\"$CXXFLAGS\" \
+- LDFLAGS=\"$LDFLAGS\" \
+- $passcc \
+- --disable-multi-os-directory \
+- --disable-docs \
+- --prefix=\"$builddir\" \
+- --libdir=\"$builddir/lib\" \
+- --includedir=\"$builddir/include\""
+- AC_MSG_NOTICE([doconfig = $doconfig])
+- printf "\n\n+++ About to configure libffi +++\n\n"
+- eval "$doconfig"
+- cd "$builddir"
+-fi
+-
+ AC_MSG_NOTICE([About to configure libsoftfloat])
+ mkdir -p softfloat
+ cd softfloat
+Index: csl/cslbase/Makefile.am
+===================================================================
+diff --git a/csl/cslbase/Makefile.am b/csl/cslbase/Makefile.am
+--- a/csl/cslbase/Makefile.am (revision 6860)
++++ b/csl/cslbase/Makefile.am (working copy)
+@@ -807,35 +807,6 @@
+
+ endif !crlibm
+
+-LIBFFIDEPS=../lib/libffi.a ../include/ffi.h
+-
+-FFIDEP = ../include/ffi.h
+-FFIINC = -I../include
+-AM_CPPFLAGS += $(FFINC)
+-reduce_CPPFLAGS += $(FFINC)
+-bootstrapreduce_CPPFLAGS += $(FFINC)
+-csl_CPPFLAGS += $(FFINC)
+-flatcsl_CPPFLAGS += $(FFINC)
+-
+-# The following ugly dependencies are here so that one can go, for
+-# instance, "make csl.o" in a clean tree and libffi building will get
+-# triggered.
+-
+-
+-csl_LDADD += ../lib/libffi.a
+-flatcsl_LDADD += ../lib/libffi.a
+-bootstrapreduce_LDADD += ../lib/libffi.a
+-reduce_LDADD += ../lib/libffi.a
+-
+-csl_DEPENDENCIES += $(LIBFFIDEPS)
+-flatcsl_DEPENDENCIES += $(LIBFFIDEPS)
+-bootstrapreduce_DEPENDENCIES += $(LIBFFIDEPS)
+-reduce_DEPENDENCIES += $(LIBFFIDEPS)
+-
+-$(LIBFFIDEPS):
+- @printf "About to build libffi for %s ($@)\n" `pwd`
+- -$(TRACE)@$(MAKE) -C ../libffi install
+-
+ SOFTFLOATDEPS=../lib/libsoftfloat.a ../include/softfloat.h
+
+ SOFTFLOATDEP = ../include/softfloat.h
+Index: csl/cslbase/configure.ac
+===================================================================
+diff --git a/csl/cslbase/configure.ac b/csl/cslbase/configure.ac
+--- a/csl/cslbase/configure.ac (revision 6860)
++++ b/csl/cslbase/configure.ac (working copy)
+@@ -146,8 +146,8 @@
+ AC_DEFINE(WITHOUT_FFI, [1], [remove the foreign function support])
+ fi
+
++AC_SEARCH_LIBS([ffi_call], [ffi])
+
+-
+ # What host am I on?
+ AC_CANONICAL_HOST()
+