Index: head/math/maxima/Makefile =================================================================== --- head/math/maxima/Makefile +++ head/math/maxima/Makefile @@ -3,7 +3,7 @@ PORTNAME= maxima PORTVERSION= 5.43.2 -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= math lisp tk MASTER_SITES= SF/maxima/Maxima-source/${PORTVERSION}-source @@ -22,7 +22,7 @@ USES= autoreconf gmake makeinfo shared-mime-info tk GNU_CONFIGURE= yes -CONFIGURE_ARGS= PYTHON=dummy +CONFIGURE_ARGS= PYTHON=dummy --with-wish=${WISH} INFO= imaxima maxima xmaxima abs_integrate drawutils kovacicODE logic @@ -31,11 +31,11 @@ PORTDATA= * PORTEXAMPLES= * -OPTIONS_DEFINE= EXAMPLES DOCS NOUSERINIT MANPAGES TEST +OPTIONS_DEFINE= EXAMPLES DOCS NOUSERINIT MANPAGES SAGE TEST OPTIONS_SINGLE= LISP -OPTIONS_SINGLE_LISP= CCL CMUCL SBCL +OPTIONS_SINGLE_LISP= CCL CMUCL ECL SBCL -OPTIONS_DEFAULT= NOUSERINIT MANPAGES SBCL +OPTIONS_DEFAULT= ECL NOUSERINIT MANPAGES SAGE OPTIONS_SUB= yes CCL_DESC= Build with Clozure Common Lisp @@ -50,17 +50,39 @@ CMUCL_CONFIGURE_ON= --enable-cmucl CMUCL_PLIST_SUB= BINDIR=binary-cmucl BINNAME=maxima_core +ECL_DESC= Build with Embedabble Common Lisp +ECL_BUILD_DEPENDS= ecl:lang/ecl +ECL_RUN_DEPENDS= ecl:lang/ecl +ECL_LIB_DEPENDS= libgmp.so:math/gmp \ + libgc.so:devel/boehm-gc \ + libffi.so:devel/libffi +.if ${:!make -C ${.CURDIR}/../../lang/ecl -V PORT_OPTIONS:MTHREADS!} +ECL_LIB_DEPENDS+= libgc-threaded.so:devel/boehm-gc-threaded +.endif +ECL_CONFIGURE_ON= --with-ecl=ecl +ECL_PLIST_SUB= BINDIR=binary-ecl BINNAME=maxima +GET_ECLLIB= ecl -eval "(princ (SI:GET-LIBRARY-PATHNAME))" -eval "(quit)" + NOUSERINIT_DESC= Do not load user init file for lisp (only for sbcl) +SAGE_DESC= Build with patches from Sage (implies ECL) +SAGE_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-share_linearalgebra_matrixexp.lisp \ + ${PATCHDIR}/extra-patch-src_grind.lisp \ + ${PATCHDIR}/extra-patch-src_hayat.lisp \ + ${PATCHDIR}/extra-patch-src_init-cl.lisp \ + ${PATCHDIR}/extra-patch-src_maxima.system +SAGE_IMPLIES= ECL + SBCL_DESC= Build with Steel Bank Common Lisp SBCL_BUILD_DEPENDS= sbcl:lang/sbcl SBCL_RUN_DEPENDS= sbcl:lang/sbcl SBCL_CONFIGURE_ON= --enable-sbcl SBCL_PLIST_SUB= BINDIR=binary-sbcl BINNAME=maxima_core -TEST_TARGET= check +TEST_TARGET= check TEST_BUILD_DEPENDS= gnuplot:math/gnuplot \ rlwrap:devel/rlwrap + post-patch: ${GREP} -Fe '.core' -l -r ${WRKSRC} | ${XARGS} ${REINPLACE_CMD} 's;\.core;_core;g' ${FIND} -X ${WRKSRC}/interfaces/xmaxima -name 'Makefile.in' | ${XARGS} ${REINPLACE_CMD} "s;tclsh;${TCLSH};g" @@ -70,6 +92,10 @@ post-patch-TEST-off: ${REINPLACE_CMD} 's;tests;;' ${WRKSRC}/Makefile.am +post-configure: + ${REINPLACE_CMD} '/ld-flags/s|" |"|' ${WRKSRC}/src/autoconf-variables.lisp + ${REINPLACE_CMD} '/ld-flags/s| ")|")|' ${WRKSRC}/src/autoconf-variables.lisp + pre-build-CCL-on: cd ${WRKSRC}/src/ && ${MKDIR} binary-ccl && ${LN} -s binary-ccl binary-openmcl @@ -85,6 +111,11 @@ post-install-DOCS-on: ${MKDIR} ${STAGEDIR}${DOCSDIR} cd ${WRKSRC}/doc/info && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR} '-name maxima*\.html' + +post-install-SAGE-on: + ${MKDIR} ${STAGEDIR}$$(${GET_ECLLIB}) + ${INSTALL_DATA} ${WRKSRC}/src/binary-ecl/maxima.fas \ + ${STAGEDIR}$$(${GET_ECLLIB}) post-install-EXAMPLES-on: ${MKDIR} ${STAGEDIR}${EXAMPLESDIR} Index: head/math/maxima/files/extra-patch-share_linearalgebra_matrixexp.lisp =================================================================== --- /dev/null +++ head/math/maxima/files/extra-patch-share_linearalgebra_matrixexp.lisp @@ -0,0 +1,14 @@ +--- share/linearalgebra/matrixexp.lisp.orig 2019-10-21 03:38:58 UTC ++++ share/linearalgebra/matrixexp.lisp +@@ -138,8 +138,9 @@ + (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic)) + (print `(ratfac = ,$ratfac)) + (merror "Unable to find the spectrum"))) +- +- (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z)) ++ ++;; patch borrowed from SageMath ++ (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z)) + (setq m (length sp)) + (dotimes (i m) + (setq zi (nth i sp)) Index: head/math/maxima/files/extra-patch-src_grind.lisp =================================================================== --- /dev/null +++ head/math/maxima/files/extra-patch-src_grind.lisp @@ -0,0 +1,18 @@ +--- src/grind.lisp.orig 2019-10-21 03:38:59 UTC ++++ src/grind.lisp +@@ -297,12 +297,13 @@ + (msz nil l r) + (do ((nl) (w 0)) + ((null (cdr x)) +- (setq nl (cons (if (stringp (car x)) ++;; Patch borrowed from SageMath: undoing_true_false_printing_patch ++ (setq nl (cons (if (atom (car x)) + (msz (makestring (car x)) l r) + (msize (car x) l r lop rop)) + nl)) + (cons (+ w (caar nl)) (nreverse nl))) +- (setq nl (cons (if (stringp (car x)) ++ (setq nl (cons (if (atom (car x)) + (msz (makestring (car x)) l r) + (msize (car x) l r lop rop)) + nl) Index: head/math/maxima/files/extra-patch-src_hayat.lisp =================================================================== --- /dev/null +++ head/math/maxima/files/extra-patch-src_hayat.lisp @@ -0,0 +1,86 @@ +--- src/hayat.lisp.orig 2019-10-21 03:38:59 UTC ++++ src/hayat.lisp +@@ -2205,6 +2205,25 @@ + (or (alike1 (exp-pt (get-datum (datum-var (car l)))) (exp-pt (car l))) + (return () )))) + ++;; Patch borrowed from SageMath: 0001-taylor2-Avoid-blowing-the-stack-when-diff-expand-isn ++;; ++;; SUBTREE-SEARCH ++;; ++;; Search for subtrees, ST, of TREE that contain an element equal to BRANCH ++;; under TEST as an immediate child and return them as a list. ++;; ++;; Examples: ++;; (SUBTREE-SEARCH 2 '(1 2 3)) => '((1 2 3)) ++;; (SUBTREE-SEARCH 2 '(1 2 2 3)) => '((1 2 2 3)) ++;; (SUBTREE-SEARCH 2 '(1 (2) 3)) => '((2)) ++;; (SUBTREE-SEARCH 4 '(1 (2) 3)) => NIL ++;; (SUBTREE-SEARCH 2 '(1 (2) 3 (2))) => '((2) (2)) ++ ++(defun subtree-search (branch tree &optional (test 'equalp)) ++ (unless (atom tree) ++ (if (find branch tree :test test) (list tree) ++ (mapcan (lambda (child) (subtree-search branch child test)) tree)))) ++ + (defun taylor2 (e) + (let ((last-exp e)) ;; lexp-non0 should be bound here when needed + (cond ((assolike e tlist) (var-expand e 1 () )) +@@ -2248,9 +2267,32 @@ + ((null l) t) + (or (free e (car l)) (return ())))) + (newsym e)) +- (t (let ((exact-poly () )) ; Taylor series aren't exact +- (taylor2 (diff-expand e tlist))))))) ++ (t ++ ;; When all else fails, call diff-expand to try to expand e around the ++ ;; point as a Taylor series by taking repeated derivatives. This might ++ ;; fail, unfortunately: If a required derivative doesn't exist, then ++ ;; DIFF-EXPAND will return a form of the form "f'(x)" with the ++ ;; variable, rather than the expansion point in it. ++ ;; ++ ;; Sometimes this works - in particular, if there is a genuine pole at ++ ;; the point, we end up passing a sum of terms like x^(-k) to a ++ ;; recursive invocation and all is good. Unfortunately, it can also ++ ;; fail. For example, if e is abs(sin(x)) and we try to expand to first ++ ;; order, the expression "1/1*(cos(x)*sin(x)/abs(sin(x)))*x^1+0" is ++ ;; returned. If we call taylor2 on that, we will end up recursing and ++ ;; blowing the stack. To avoid doing so, error out if EXPANSION ++ ;; contains E as a subtree. However, don't error if it occurs as an ++ ;; argument to %DERIVATIVE (in which case, we might well be fine). This ++ ;; happens from things like taylor(log(f(x)), x, x0, 1). + ++ (let* ((exact-poly nil) ; (Taylor series aren't exact) ++ (expansion (diff-expand e tlist))) ++ (when (find-if (lambda (subtree) ++ (not (eq ($op subtree) '%derivative))) ++ (subtree-search e expansion)) ++ (exp-pt-err)) ++ (taylor2 expansion)))))) ++ + (defun compatvarlist (a b c d) + (cond ((null a) t) + ((or (null b) (null c) (null d)) () ) +@@ -3024,7 +3066,21 @@ + (and (or (member '$inf pt-list :test #'eq) (member '$minf pt-list :test #'eq)) + (unfam-sing-err))) + +-(defun diff-expand (exp l) ;l is tlist ++;; DIFF-EXPAND ++;; ++;; Expand EXP in the variables as specified in L, which is a list of tlists. If ++;; L is a singleton, this just works by the classic Taylor expansion: ++;; ++;; f(x) = f(c) + f'(c) + f''(c)/2 + ... + f^(k)(c)/k! ++;; ++;; If L specifies multiple expansions, DIFF-EXPAND works recursively by ++;; expanding one variable at a time. The derivatives are computed using SDIFF. ++;; ++;; In some cases, f'(c) or some higher derivative might be an expression of the ++;; form 1/0. Instead of returning an error, DIFF-EXPAND uses f'(x) ++;; instead. (Note: This seems bogus to me (RJS), but I'm just describing how ++;; EVAL-DERIV works) ++(defun diff-expand (exp l) + (check-inf-sing (mapcar (function caddr) l)) + (cond ((not l) exp) + (t Index: head/math/maxima/files/extra-patch-src_init-cl.lisp =================================================================== --- /dev/null +++ head/math/maxima/files/extra-patch-src_init-cl.lisp @@ -0,0 +1,12 @@ +--- src/init-cl.lisp.orig 2020-06-07 20:30:47 UTC ++++ src/init-cl.lisp +@@ -137,7 +137,8 @@ When one changes, the other does too." + (setq libdir (combine-path maxima-prefix-env "lib")) + (setq libexecdir (combine-path maxima-prefix-env "libexec")) + (setq datadir (combine-path maxima-prefix-env "share")) +- (setq infodir (combine-path maxima-prefix-env #+(or cygwin windows win32 win64) "share" "info"))) ++ ;; patch borrowed from SageMath ++ (setq infodir (combine-path maxima-prefix-env "share" "info"))) + (progn + (setq libdir (maxima-parse-dirstring *autoconf-libdir*)) + (setq libexecdir (maxima-parse-dirstring *autoconf-libexecdir*)) Index: head/math/maxima/files/extra-patch-src_maxima.system =================================================================== --- /dev/null +++ head/math/maxima/files/extra-patch-src_maxima.system @@ -0,0 +1,24 @@ +--- src/maxima.system.orig 2019-10-21 03:38:59 UTC ++++ src/maxima.system +@@ -1,5 +1,8 @@ + ;;; -*- Lisp -*- + ++(require :cmp) ++(setf c::*compile-in-constants* t) ++ + (in-package :cl-user) + + (pushnew :cl *features*) +@@ -75,6 +78,12 @@ + ;; Convert dir/foo.fas to dir/foo.o + (make-pathname :type "o" :defaults p)) + files))) ++;; Patch borrowed from SageMath: build the Maxima library ++ (c::build-fasl "binary-ecl/maxima" :lisp-files obj ++ :ld-flags ++ (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*" ++ (find-package "MAXIMA"))))) ++ (if (and x (not (string= x ""))) (list x)))) + (c::build-program "binary-ecl/maxima" :lisp-files obj + :ld-flags + (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*" Index: head/math/maxima/pkg-plist =================================================================== --- head/math/maxima/pkg-plist +++ head/math/maxima/pkg-plist @@ -1,6 +1,7 @@ bin/maxima bin/rmaxima bin/xmaxima +%%SAGE%%lib/ecl-16.1.3/maxima.fas lib/maxima/%%PORTVERSION%%/%%BINDIR%%/%%BINNAME%% %%CMUCL%%lib/maxima/%%PORTVERSION%%/%%BINDIR%%/lisp libexec/maxima/%%PORTVERSION%%/mgnuplot