void-packages/srcpkgs/sagemath/patches/35094-support_gap_4.12.patch

1304 lines
56 KiB
Diff
Raw Normal View History

diff --git a/build/pkgs/gap/checksums.ini b/build/pkgs/gap/checksums.ini
index 066e943308a..b0ea8ba8818 100644
--- a/build/pkgs/gap/checksums.ini
+++ b/build/pkgs/gap/checksums.ini
@@ -1,5 +1,5 @@
tarball=gap-VERSION.tar.gz
-sha1=4ecdd281b8f430282fb9b12690b06e0a26abde10
-md5=85dc9e459d5b6c66fcad9f468afd3e3e
-cksum=1351843158
+sha1=a6e36f3f874a2c46f51561402634497eab705cca
+md5=c5cd9f272f2703d7a3649ad7193b2d90
+cksum=2760477284
upstream_url=https://github.com/gap-system/gap/releases/download/vVERSION/gap-VERSION.tar.gz
diff --git a/build/pkgs/gap/package-version.txt b/build/pkgs/gap/package-version.txt
index d782fca8f64..f1cd7de1de5 100644
--- a/build/pkgs/gap/package-version.txt
+++ b/build/pkgs/gap/package-version.txt
@@ -1 +1 @@
-4.11.1
+4.12.2
diff --git a/build/pkgs/gap/spkg-check.in b/build/pkgs/gap/spkg-check.in
index d9791d33293..d2fccda6e04 100644
--- a/build/pkgs/gap/spkg-check.in
+++ b/build/pkgs/gap/spkg-check.in
@@ -3,6 +3,13 @@ cd src
# #28728: Fix test failure in tst/testinstall/strings.tst
export LC_CTYPE=en_US.UTF-8
+# #34391: in GAP 4.12 some packages need GAP package io
+# to let tests run, otherwise this hangs. Thus we install io here.
+cd pkg/io
+./configure --with-gaproot=../..
+make
+cd ../..
+
make testinstall
if [[ $? -ne 0 ]]; then
exit 1
diff --git a/build/pkgs/gap/spkg-install.in b/build/pkgs/gap/spkg-install.in
index 2ceadf99db4..e2c8b4dca54 100644
--- a/build/pkgs/gap/spkg-install.in
+++ b/build/pkgs/gap/spkg-install.in
@@ -8,8 +8,7 @@ export CFLAGS=$CFLAGS_NON_NATIVE
export CXXFLAGS=$CXXFLAGS_NON_NATIVE
GAP_BUILD_ROOT="$(pwd)"
-GAP_ROOT="$SAGE_LOCAL/share/gap"
-DESTDIR_GAP_ROOT="$SAGE_DESTDIR$GAP_ROOT"
+GAP_ROOT="$SAGE_LOCAL/lib/gap"
# Enable debug info if requested.
# Note that -g3 allows you to use preprocessor macros in gdb which are widely used
@@ -17,37 +16,17 @@ if [ "$SAGE_DEBUG" = yes ] ; then
export CFLAGS="-O0 -g3 -DDEBUG_MASTERPOINTERS -DDEBUG_GLOBAL_BAGS -DDEBUG_FUNCTIONS_BAGS $CFLAGS"
fi
-sdh_configure $SAGE_CONFIGURE_GMP
-sdh_make -j1
+# LDFLAGS hack below needed by Semigroups package
+sdh_configure $SAGE_CONFIGURE_GMP LDFLAGS="-pthread" --prefix=$SAGE_LOCAL
+sdh_make
-# GAP's "make install" is work in progress; we use bits and pieces of it
-# but we install many things manually.
-sdh_make install-headers install-libgap
-
-# Install config.h, which is not currently handled by `make install-headers`
-sdh_install gen/config.h "$SAGE_LOCAL/include/gap"
-
-# Now install the gap executable as "gap-bin"; it will be called normally
-# through our wrapper script that sets the appropriate GAP_ROOT
-SAGE_BIN="$SAGE_LOCAL/bin"
-mkdir -p "$SAGE_DESTDIR$SAGE_BIN" || sdh_die "Failed to create the directory $SAGE_BIN"
-
-./libtool --mode=install install gap "$SAGE_DESTDIR$SAGE_BIN/gap-bin" || \
- sdh_die "Failed to install gap-bin to $SAGE_BIN"
-
-./libtool --mode=install install gac "$SAGE_DESTDIR$SAGE_BIN/gac" || \
- sdh_die "Failed to install gac to $SAGE_BIN"
-
-# Now copy additional files GAP needs to run (and a few optional bits) into
-# GAP_ROOT; we don't need everything from the source tree
-sdh_install bin doc gen grp lib src tst sysinfo.gap "$GAP_ROOT"
-
-# GAP's copy of libtool is also used by the toolchain for build GAP packages
-# (i.e. by gac)
-sdh_install libtool "$GAP_ROOT"
+sdh_make_install
+# sdh_make install-headers install-libgap
+# The 'packagemanager' package expects this https://github.com/gap-packages/PackageManager/issues/105
+mkdir -p "$SAGE_LOCAL/lib/gap/bin"
# Install only the minimal packages GAP needs to run
-sdh_install pkg/GAPDoc-* pkg/primgrp-* pkg/SmallGrp-* pkg/transgrp "$GAP_ROOT"/pkg
+sdh_install pkg/gapdoc pkg/primgrp pkg/smallgrp pkg/transgrp "$GAP_ROOT"/pkg
# Install additional packages that are not strictly required, but that are
# typically "expected" to be loaded: These are the default packages that are
@@ -58,50 +37,25 @@ sdh_install pkg/GAPDoc-* pkg/primgrp-* pkg/SmallGrp-* pkg/transgrp "$GAP_ROOT"/p
# Also include atlasrep which is a dependency of tomlib
sdh_install \
pkg/atlasrep \
- pkg/autpgrp-* \
- pkg/alnuth-* \
- pkg/crisp-* \
- pkg/ctbllib-* \
- pkg/FactInt-* \
+ pkg/autodoc \
+ pkg/autpgrp \
+ pkg/alnuth \
+ pkg/crisp \
+ pkg/ctbllib \
+ pkg/factint \
pkg/fga \
- pkg/irredsol-* \
- pkg/laguna-* \
- pkg/PackageManager-* \
- pkg/polenta-* \
- pkg/polycyclic-* \
- pkg/resclasses-* \
- pkg/sophus-* \
- pkg/tomlib-* \
+ pkg/irredsol \
+ pkg/laguna \
+ pkg/packagemanager \
+ pkg/polenta \
+ pkg/polycyclic \
+ pkg/radiroot \
+ pkg/resclasses \
+ pkg/sophus \
+ pkg/tomlib \
+ pkg/utils \
"$GAP_ROOT"/pkg
-# Install the GAP startup script; ensure it is executable
-sdh_install -T ../gap "$SAGE_BIN/gap"
-chmod +x "$SAGE_DESTDIR$SAGE_BIN/gap"
-
-# Create symlinks under $GAP_ROOT for these executables, as they are expected
-# (especially when building kernel packages) to exist
-ln -sf "../../bin/gap-bin" "$DESTDIR_GAP_ROOT/gap"
-ln -sf "../../bin/gac" "$DESTDIR_GAP_ROOT/gac"
-
-# Fix the $GAP_ROOT/bin/<arch>/src symlink to be relative (otherwise it links
-# to the actual path of the sources GAP was compiled from)
-for srclink in "$DESTDIR_GAP_ROOT"/bin/*/src; do
- rm -f "$srclink"
- ln -s "../../src" "$srclink"
-done
-
-# Additional fixups for some files after they have been copied into their
-# destination directory. gac and sysinfo.gap are generated files that contain
-# in them hard-coded references to the GAP build directory, which will soon
-# be going away. This breaks the build toolchain for some compiled GAP
-# packages. We need to replace these paths with the final GAP_ROOT path. The
-# below will work so long as neither of these paths contain '|', and if they do
-# then god help you. https://trac.sagemath.org/ticket/27218
-sed -i -e "s|$GAP_BUILD_ROOT|$GAP_ROOT|g" \
- "$SAGE_DESTDIR$SAGE_BIN/gac" "$DESTDIR_GAP_ROOT/sysinfo.gap" \
- "$DESTDIR_GAP_ROOT/bin/gap.sh" "$DESTDIR_GAP_ROOT/doc/make_doc" || \
- sdh_die "Failed to fix up hard-coded paths in GAP build tools."
-
# TODO: This seems unnecessary--we are already installing all of doc/ to
# GAP_ROOT, which is necessary for some functionality in GAP to work. Do
# we need this? Maybe doc/gap could just be a symlink to gap/doc??
diff --git a/build/pkgs/gap/spkg-legacy-uninstall b/build/pkgs/gap/spkg-legacy-uninstall
index d17eb939eb7..a8e5c59e1fb 100755
--- a/build/pkgs/gap/spkg-legacy-uninstall
+++ b/build/pkgs/gap/spkg-legacy-uninstall
@@ -4,6 +4,8 @@ rm -rf "$SAGE_LOCAL/gap/gap-4."*
rm -rf "$SAGE_SHARE/gap"
rm -f "$SAGE_LOCAL/gap/latest"
rm -f "$SAGE_LOCAL/bin/gap"
+rm -f "$SAGE_LOCAL/bin/gac"
-# Remove old libgap headers
+# Remove old libgap headers and library
rm -rf "$SAGE_LOCAL/include/gap"
+rm -rf "$SAGE_LOCAL/lib/gap"
diff --git a/build/pkgs/gap/spkg-prerm.in b/build/pkgs/gap/spkg-prerm.in
deleted file mode 100644
index 661d92621fa..00000000000
--- a/build/pkgs/gap/spkg-prerm.in
+++ /dev/null
@@ -1,6 +0,0 @@
-# These generated files are placed in directory provided by the SPKG, so
-# delete the generated files first so that their parent directories can be
-# removed during installation
-GAP_ROOT="$SAGE_LOCAL/share/gap"
-rm -f "$GAP_ROOT/pkg/atlasrep/datagens/"*.*
-rm -f "$GAP_ROOT/pkg/atlasrep/dataword/"*.*
diff --git a/build/pkgs/gap_packages/patches/cohomolo-gcc10.patch b/build/pkgs/gap_packages/patches/cohomolo-gcc10.patch
deleted file mode 100644
index e45fe7d9c6f..00000000000
--- a/build/pkgs/gap_packages/patches/cohomolo-gcc10.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-diff --git a/pkg/cohomolo-1.6.8/standalone/progs.d/crp1.c b/pkg/cohomolo-1.6.8/standalone/progs.d/crp1.c
-index 3bbdc45..7df699f 100644
---- a/pkg/cohomolo-1.6.8/standalone/progs.d/crp1.c
-+++ b/pkg/cohomolo-1.6.8/standalone/progs.d/crp1.c
-@@ -8,9 +8,8 @@ extern short sp[],**mat[],*psp[],**imcos[],**cpco[],lorb[],
- short *cst,**cpst,***cdpst,**svptr,*cp,*rel;
- short *spst,**pspst,**pptr,**cpptr,npt,nb,nph,nph2,npg,npg2,
- rno,orno,coh_index,*invg;
--FILE *ip,*op;
-
--void seeknln (void) { while (getc(ip)!='\n'); }
-+void seeknln (FILE *ip) { while (getc(ip)!='\n'); }
-
- /* This program differs from most other permutation programs in that perms are
- all stored in the single array sp. Schreier vectors are stored in the short
-@@ -23,13 +22,14 @@ void seeknln (void) { while (getc(ip)!='\n'); }
- int
- crprog1 (void)
- { short *pc,*qc,ex,neg; int x;
-+ FILE *ip,*op;
- short i,j,k,l,m,n,cl,rl,*p,ocl,im,pt,pt1,pn,ipt;
- if ((ip=fopen(inf2,"r"))== 0)
- { fprintf(stderr,"Cannot open %s.\n",inf2); return(-1);}
- fscanf(ip,"%hd%hd%hd%hd",&npt,&nph,&nb,&k);
- if (nb>=mb) {fprintf(stderr,"nb too big. Increase MB.\n"); return(-1);}
- if (k<=2) {fprintf(stderr,"inf2 has illegal format.\n"); return(-1); }
-- seeknln(); seeknln();
-+ seeknln(ip); seeknln(ip);
- for (i=1;i<=nb;i++) fscanf(ip,"%hd",lorb+i);
- pptr=psp-1; pspst=psp+nph; svptr=cpsp-1; cpst=cpsp+nb;
- invg=sp; nph2=2*nph; spst=sp+nph2;
-@@ -37,7 +37,7 @@ crprog1 (void)
- { pptr[i]=spst+(i-1)*npt-1; p=pptr[i];
- for (j=1;j<=npt;j++) {fscanf(ip,"%hd",&k); p[k]=j; }
- invg[2*i-2]=2*i-1; invg[2*i-1]=2*i-2;
-- seeknln();
-+ seeknln(ip);
- }
- spst+=(npt*nph);
- for (i=1;i<=nb;i++)
-@@ -75,7 +75,7 @@ crprog1 (void)
- strcpy(inf1,inf0); strcat(inf1,".rel");
- if ((ip=fopen(inf1,"r"))==0)
- { fprintf(stderr,"Cannot open %s.\n",inf1); return(-1);}
-- fscanf(ip,"%hd%hd",&k,&rno); seeknln();
-+ fscanf(ip,"%hd%hd",&k,&rno); seeknln(ip);
- op=fopen(outft,"w");
- /* Now we have read everything in, and the computation can start */
- orno=0;
-diff --git a/pkg/cohomolo-1.6.8/standalone/progs.d/nq+chfns.c b/pkg/cohomolo-1.6.8/standalone/progs.d/nq+chfns.c
-index a7396b2..658496f 100644
---- a/pkg/cohomolo-1.6.8/standalone/progs.d/nq+chfns.c
-+++ b/pkg/cohomolo-1.6.8/standalone/progs.d/nq+chfns.c
-@@ -20,8 +20,6 @@ short mexp=MEXP,mcl=MCL,no,rel[RSP],wt[MEXP],exp,*rpf,*rpb,
- extern short prime,dim,*spv,**spm,mspace[],*vec[],**mat[],cp[],pinv[],opmats,
- mm,mv;
- extern int msp;
--FILE *ip,*op;
--
-
- int
- calcmats (void)
-@@ -59,7 +57,7 @@ calcmats (void)
- }
- for (i=1;i<=exp;i++) trans(mat[i+exp],mat[i]);
- if (opmats)
-- { op=fopen(outf,"w");
-+ { FILE *op=fopen(outf,"w");
- fprintf(op,"%4d%4d%4d\n",prime,dim,exp);
- for (i=1;i<=exp;i++) printmat(mat[i]);
- fclose(op);
-@@ -71,6 +69,7 @@ int
- rdmats (void)
- /* reads matrices of generators of P */
- { short i; int quot;
-+ FILE *ip;
- ip=fopen(inf4,"r");
- if (ip==0)
- { fprintf(stderr,"Cannot open %s\n ",inf4); return(-1); }
-@@ -90,12 +89,12 @@ rdmats (void)
- fclose(ip);
- return(0);
- }
--FILE *ip;
-
- int
- ingp (int inp)
- /* Read in output of respcrun -s */
- { short i,j,k,l,m,*orpf,**pcp;
-+ FILE *ip;
- ip=fopen(inf3,"r");
- if (ip==0) { fprintf(stderr,"Cannot open %s\n",inf3); return(-1); }
- fscanf(ip,"%hd%hd%hd%hd%hd%hd",&prime,&exp,&i,&no,&j,&m);
-diff --git a/pkg/cohomolo-1.6.8/standalone/progs.d/nqmfns.c b/pkg/cohomolo-1.6.8/standalone/progs.d/nqmfns.c
-index 0896551..6841bc8 100644
---- a/pkg/cohomolo-1.6.8/standalone/progs.d/nqmfns.c
-+++ b/pkg/cohomolo-1.6.8/standalone/progs.d/nqmfns.c
-@@ -9,7 +9,6 @@ extern short intexp,mexp,mng,wksp,
- spugen[],*tlintg[];
- extern int ptrsp,rsp;
- short fac;
--FILE *ip,*op;
-
- int
- ingp (void)
-@@ -18,6 +17,7 @@ ingp (void)
- of nqrun, and tails are also read in.
- */
- { short i,j,k,l,m,x,y,no,*orpf,*orpb,**pcp; char tails;
-+ FILE *ip;
- if ((ip=fopen(inf1,"r"))==0)
- { fprintf(stderr,"Cannot open %s.\n",inf1); return(-1); }
- fscanf(ip,"%hd%hd%hd%hd%hd%hd",&prime,&exp,&nng,&no,&class,&m);
-@@ -89,6 +89,7 @@ int
- outgp (void)
- /* The PCP is output, together with tails */
- { short i,k,l,**pcp,*b,*e,*c;
-+ FILE *op;
- op=fopen(outf,"w");
- fprintf(op,"%4d%4d%4d%4d%4d%4d\n",prime,exp,nng,exp,class,1);
- for (i=1;i<=exp;i++) fprintf(op,"%4d",wt[i]); fprintf(op,"\n");
-@@ -379,7 +380,7 @@ restart:
- nng--; mnng--; enexpnt--;
- if (nng==0)
- { if (gap)
-- { op=fopen(outfm,"w"); fprintf(op,"COHOMOLO.Multiplier:=[];\n");
-+ { FILE *op=fopen(outfm,"w"); fprintf(op,"COHOMOLO.Multiplier:=[];\n");
- fclose(op);
- printf("All new generators eliminated. Multiplier is trivial.\n");
- }
-diff --git a/pkg/cohomolo-1.6.8/standalone/progs.d/nqmp.c b/pkg/cohomolo-1.6.8/standalone/progs.d/nqmp.c
-index 01cf914..0144883 100644
---- a/pkg/cohomolo-1.6.8/standalone/progs.d/nqmp.c
-+++ b/pkg/cohomolo-1.6.8/standalone/progs.d/nqmp.c
-@@ -9,7 +9,6 @@ extern short intexp,mng,mexp,wksp,
- spugen[],*intg[],*imintg[],*tlintg[];
- extern int ptrsp,rsp;
- short *wf,*wc; char norm;
--FILE *ip,*op;
-
- /* The data structures for this program and for nqrun are similar.
- d1 and d2 contain definitions of generators. (Def. comes from commutator
-@@ -35,6 +34,7 @@ nqmprog (void)
- { short i,j,k,l,m,d,*gi,*gj,*ti,*tj,cl,def,*ps,*pf,**dp,*nrpb,*p,*orpf,*orpb,
- nb,np,k1,*rno,*covrel,**pgen,tdef,sgn;
- char nt;
-+ FILE *ip,*op;
- if (ingp() == -1) {fprintf(stderr,"Input error.\n"); return(-1); }
- eexpnt=expnt+exp; enexpnt=nexpnt+nng;
-
diff --git a/build/pkgs/gap_packages/patches/guava_leon_includes.patch b/build/pkgs/gap_packages/patches/guava_leon_includes.patch
deleted file mode 100644
index cdcd19cc3e8..00000000000
--- a/build/pkgs/gap_packages/patches/guava_leon_includes.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/pkg/guava-3.15/src/leon/src/generate.c Sat Feb 29 09:02:10 2020
---- b/pkg/guava-3.15/src/leon/src/generate.c Thu Sep 24 13:58:36 2020
-***************
-*** 115,120 ****
---- 115,122 ----
- #include "groupio.h"
- #include "enum.h"
- #include "storage.h"
-+ #include "chbase.h"
-+ #include "inform.h"
-
- #ifdef ALT_TIME_HEADER
- #include "cputime.h"
diff --git a/build/pkgs/gap_packages/spkg-install.in b/build/pkgs/gap_packages/spkg-install.in
index 168e6b11532..6dff182a48f 100644
--- a/build/pkgs/gap_packages/spkg-install.in
+++ b/build/pkgs/gap_packages/spkg-install.in
@@ -1,4 +1,4 @@
-GAP_ROOT="$SAGE_LOCAL/share/gap"
+GAP_ROOT="$SAGE_LOCAL/lib/gap"
PKG_DIR="$GAP_ROOT/pkg"
PKG_SRC_DIR="$(pwd)/src/pkg"
@@ -11,33 +11,31 @@ cd "$PKG_SRC_DIR"
# (GAP 4.8.6 still had it, but this is gone in 4.10)
sdh_install \
- aclib-* \
- AutoDoc-* \
- corelg-* \
- crime-* \
+ aclib \
+ corelg \
+ crime \
cryst \
crystcat \
- design-* \
+ design \
gbnp \
- genss-* \
- hap-* \
- hapcryst-* \
- hecke-* \
- images-* \
- liealgdb-* \
- liepring-* \
- liering-* \
- loops-* \
- MapClass-* \
- polymaking-* \
- qpa-* \
- quagroup-* \
- radiroot-* \
- repsn-* \
- sla-* \
- sonata-* \
- Toric-* \
- utils-* \
+ genss \
+ hap \
+ hapcryst \
+ hecke \
+ images \
+ liealgdb \
+ liepring \
+ liering \
+ loops \
+ mapclass \
+ polymaking \
+ qpa \
+ quagroup \
+ repsn \
+ singular \
+ sla \
+ sonata \
+ toric \
"$PKG_DIR"
install_compiled_pkg()
@@ -45,27 +43,23 @@ install_compiled_pkg()
local pkg="$1"
# Install the bin/ dir (where compiled modules should end up)
# under <prefix>/lib/gap; we then symlink to it later
- sdh_install bin "$SAGE_LOCAL/lib/gap/pkg/$pkg"
+ sdh_install * "$SAGE_LOCAL/lib/gap/pkg/$pkg"
+ # TODO:
# Clean up any build artificts before installing the rest of the package
# Also remove configure/Makefiles
# Note: None, if any of the packages really have a proper install target
- make clean # Works for some packages but not all
- rm -rf bin/
- rm -rf configure configure.* config.* autogen.sh *.m4 Makefile* m4/
+ #make clean # Works for some packages but not all
+ #rm -rf bin/
+ #rm -rf configure configure.* config.* autogen.sh *.m4 Makefile* m4/
- # Create the bin/ symlink
- ln -s "$SAGE_LOCAL/lib/gap/pkg/$pkg/bin" bin
-
- # Install the rest of the package files
- sdh_install * "$PKG_DIR/$pkg"
}
# Build and install compiled packages:
#
# These packages have an old ./configure that take the GAP_ROOT as a positional
# argument
-for pkg in cohomolo-* crypting-* grape-* guava-* orb-* datastructures-*
+for pkg in cohomolo crypting grape guava orb datastructures
do
echo "Building GAP package $pkg"
CFLAGS="$CFLAGS -Wno-implicit-function-declaration"
@@ -91,7 +85,7 @@ pararr=( " " " " "--with-external-planarity" "--with-external-libsemigroups" )
##############################################################################
parind=0
-for pkg in nq-* io-* digraphs-* semigroups-*
+for pkg in nq io digraphs semigroups
do
echo "Building GAP package $pkg"
cd "$PKG_SRC_DIR/$pkg"
diff --git a/build/pkgs/libsemigroups/checksums.ini b/build/pkgs/libsemigroups/checksums.ini
index 62c4268515f..4e13a36cb35 100644
--- a/build/pkgs/libsemigroups/checksums.ini
+++ b/build/pkgs/libsemigroups/checksums.ini
@@ -1,5 +1,5 @@
tarball=libsemigroups-VERSION.tar.gz
-sha1=2b16c095cc5ffd3f77a71dfbf48cce188e054c03
-md5=7082cadcf7a195ccb93175cd72b6db95
-cksum=1501022358
+sha1=86375824b47ce4b0e23570122e873f67136d0c0a
+md5=ff79ad5fbc8bfeb64d48faaf24106b98
+cksum=2845045455
upstream_url=https://github.com/libsemigroups/libsemigroups/releases/download/vVERSION/libsemigroups-VERSION.tar.gz
diff --git a/build/pkgs/libsemigroups/package-version.txt b/build/pkgs/libsemigroups/package-version.txt
index 9084fa2f716..f90b1afc082 100644
--- a/build/pkgs/libsemigroups/package-version.txt
+++ b/build/pkgs/libsemigroups/package-version.txt
@@ -1 +1 @@
-1.1.0
+2.3.2
diff --git a/build/pkgs/libsemigroups/spkg-install.in b/build/pkgs/libsemigroups/spkg-install.in
index 2aaf0e99043..128b54d2f99 100644
--- a/build/pkgs/libsemigroups/spkg-install.in
+++ b/build/pkgs/libsemigroups/spkg-install.in
@@ -1,4 +1,4 @@
cd src
-sdh_configure
+sdh_configure --disable-eigen
sdh_make
sdh_make_install
diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
index d4d145defe3..6a85631f624 100644
--- a/build/pkgs/singular/spkg-configure.m4
+++ b/build/pkgs/singular/spkg-configure.m4
@@ -9,52 +9,7 @@ SAGE_SPKG_CONFIGURE([singular], [
AC_MSG_CHECKING([that Singular's help is working])
AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
AC_MSG_RESULT(yes)
- dnl We have Singular. Now determine the shared library path on
- dnl platforms on which sage.libs.singular needs to reload the library with RTLD_GLOBAL.
- AS_CASE([$host_os],
- [cygwin*], [dnl Nothing to do
- ],
- [dnl Use pkg-config to get singular's libdir while we're at it. As a
- dnl moral compromise for using pkg-config, this ultimately allows us
- dnl to pass an absolute path to dlopen(), which is the only approach
- dnl that POSIX guarantees will work.
- PKG_CHECK_VAR([SINGULAR_LIB_DIR], [Singular], [libdir])
- dnl The acl_shlibext variable is set in the top-level configure.ac.
- AC_LANG_PUSH(C)
- ORIG_LIBS="${LIBS}"
- LIBS="${LIBS} -ldl"
- AC_MSG_CHECKING([if we can dlopen($LIBSINGULAR_PATH)])
- LIBSINGULAR_PATH="${SINGULAR_LIB_DIR}/libSingular.${acl_shlibext}"
-
- dnl if we can dlopen() it, substitute the name for sage_conf;
- dnl otherwise, fall back to using the SPKG.
- AC_RUN_IFELSE(
- [AC_LANG_PROGRAM(
- [[#include <dlfcn.h>]],
- [[void* h = dlopen("${LIBSINGULAR_PATH}", RTLD_LAZY | RTLD_GLOBAL);
- if (h == 0) { return 1; } else { return dlclose(h); }]]
- )], [
- AC_MSG_RESULT(yes)
- ], [
- dnl try Debian-specific name
- LIBSINGULAR_PATH="${SINGULAR_LIB_DIR}/libsingular-Singular.${acl_shlibext}"
- AC_RUN_IFELSE(
- [AC_LANG_PROGRAM(
- [[#include <dlfcn.h>]],
- [[void* h = dlopen("${LIBSINGULAR_PATH}", RTLD_LAZY | RTLD_GLOBAL);
- if (h == 0) { return 1; } else { return dlclose(h); }]]
- )], [
- AC_MSG_RESULT(yes)
- ], [
- AC_MSG_RESULT(no)
- sage_spkg_install_singular=yes
- ], [AC_MSG_RESULT(yes)])
- ], [AC_MSG_RESULT(yes)])
-
- AC_LANG_POP()
- LIBS="${ORIG_LIBS}"
- ]
- )], [
+ ], [
AC_MSG_RESULT(no)
sage_spkg_install_singular=yes
]
@@ -64,20 +19,4 @@ SAGE_SPKG_CONFIGURE([singular], [
])
])
])
-],[],[],[
- dnl Post-check phase
- dnl We make the sage_conf substitutions here, because the "default"
- dnl substitution needs to be made even if we skipped the system-Singular
- dnl checks themselves.
- AS_IF([test "x${sage_spkg_install_singular}" = "xyes"], [
- AS_CASE([$host_os],
- [cygwin*], [dnl Nothing to do
- ],
- [dnl Set shared library path, needed for reloading the library with RTLD_GLOBAL
- LIBSINGULAR_PATH="\$SAGE_LOCAL/lib/libSingular.${acl_shlibext}"
- ]
- )
- ])
-
- AC_SUBST(LIBSINGULAR_PATH, "${LIBSINGULAR_PATH}")
])
diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
index 6cd28f558a8..d66bdb3d264 100644
--- a/pkgs/sage-conf/_sage_conf/_conf.py.in
+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
@@ -55,9 +55,6 @@ THREEJS_DIR = SAGE_LOCAL + "/share/threejs-sage"
OPENMP_CFLAGS = "@OPENMP_CFLAGS@"
OPENMP_CXXFLAGS = "@OPENMP_CXXFLAGS@"
-# The full absolute path to the main Singular library.
-LIBSINGULAR_PATH = "@LIBSINGULAR_PATH@".replace('$SAGE_LOCAL', SAGE_LOCAL)
-
# Installation location of wheels. This is determined at configuration time
# and does not depend on the installation location of sage-conf.
SAGE_SPKG_WHEELS = "@SAGE_VENV@".replace('${SAGE_LOCAL}', SAGE_LOCAL) + "/var/lib/sage/wheels"
diff --git a/src/doc/en/thematic_tutorials/lie/weyl_groups.rst b/src/doc/en/thematic_tutorials/lie/weyl_groups.rst
index c917338e444..182e74aad20 100644
--- a/src/doc/en/thematic_tutorials/lie/weyl_groups.rst
+++ b/src/doc/en/thematic_tutorials/lie/weyl_groups.rst
@@ -139,12 +139,12 @@ string, which you can print::
X.1 1 1 1 1 1 1 1 1 1 1 1 1 1
X.2 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1
X.3 2 . 2 -1 . 2 2 . . . -1 2 2
- X.4 3 -1 -1 . 1 -1 3 -1 1 -1 . -1 3
- X.5 3 -1 -1 . 1 3 -1 -1 -1 1 . -1 3
- X.6 3 1 -1 . -1 -1 3 1 -1 1 . -1 3
- X.7 3 1 -1 . -1 3 -1 1 1 -1 . -1 3
- X.8 3 -1 3 . -1 -1 -1 -1 1 1 . -1 3
- X.9 3 1 3 . 1 -1 -1 1 -1 -1 . -1 3
+ X.4 3 -1 -1 . 1 3 -1 -1 -1 1 . -1 3
+ X.5 3 1 -1 . -1 3 -1 1 1 -1 . -1 3
+ X.6 3 -1 3 . -1 -1 -1 -1 1 1 . -1 3
+ X.7 3 -1 -1 . 1 -1 3 -1 1 -1 . -1 3
+ X.8 3 1 3 . 1 -1 -1 1 -1 -1 . -1 3
+ X.9 3 1 -1 . -1 -1 3 1 -1 1 . -1 3
X.10 4 -2 . -1 . . . 2 . . 1 . -4
X.11 4 2 . -1 . . . -2 . . 1 . -4
X.12 6 . -2 . . -2 -2 . . . . 2 6
diff --git a/src/sage/coding/codecan/autgroup_can_label.pyx b/src/sage/coding/codecan/autgroup_can_label.pyx
index de5db985e0b..c83b9264e44 100644
--- a/src/sage/coding/codecan/autgroup_can_label.pyx
+++ b/src/sage/coding/codecan/autgroup_can_label.pyx
@@ -76,7 +76,7 @@ columns do share the same coloring::
((1,),
(2,),
(3, 5, 4),
- (6, 19, 16, 9, 21, 10, 8, 15, 14, 11, 20, 13, 12, 7, 17, 18))
+ (6, 19, 16, 21, 9, 10, 15, 8, 20, 11, 14, 13, 7, 12, 18, 17))
We can also restrict the group action to linear isometries::
diff --git a/src/sage/coding/linear_code.py b/src/sage/coding/linear_code.py
index a3ac3ca1547..bfb9f8696e8 100644
--- a/src/sage/coding/linear_code.py
+++ b/src/sage/coding/linear_code.py
@@ -465,27 +465,27 @@ def automorphism_group_gens(self, equivalence="semilinear"):
0
sage: C = codes.HammingCode(GF(4, 'z'), 3)
sage: C.automorphism_group_gens()
- ([((1, 1, 1, 1, 1, z + 1, z, z + 1, z, z, z, 1, 1, z + 1, z + 1, z, z + 1, z, z + 1, z + 1, z + 1); (1,14,6,7,4,10,11,19)(2,8,16,13,3,17,21,15)(9,12,18,20), Ring endomorphism of Finite Field in z of size 2^2
+ ([((1, 1, 1, z, z + 1, 1, 1, 1, 1, z + 1, z, z, z + 1, z + 1, z + 1, 1, z + 1, z, z, 1, z); (1,13,14,20)(2,21,8,18,7,16,19,15)(3,10,5,12,17,9,6,4), Ring endomorphism of Finite Field in z of size 2^2
+ Defn: z |--> z + 1),
+ ((z, 1, z, z, z, z + 1, z, z, z, z, z, z, z + 1, z, z, z, z, z + 1, z, z, z); (1,11,5,12,3,19)(2,8)(6,18,13)(7,17,15)(9,10,14,16,20,21), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z + 1),
- ((z + 1, 1, 1, z, z + 1, z, z, z + 1, z + 1, z + 1, 1, z + 1, z, z, 1, z + 1, 1, z, z + 1, z + 1, z); (1,18,6,19,2,9,17,10,13,14,21,11,4,5,12)(3,20,7,16,8), Ring endomorphism of Finite Field in z of size 2^2
- Defn: z |--> z),
((z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z); (), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z)],
362880)
sage: C.automorphism_group_gens(equivalence="linear")
- ([((z + 1, 1, z + 1, z + 1, z + 1, z, 1, z, 1, 1, 1, 1, z + 1, z + 1, z + 1, z, z, 1, z, z, z); (1,15,2,8,16,18,3)(4,9,12,13,20,10,11)(5,21,14,6,7,19,17), Ring endomorphism of Finite Field in z of size 2^2
+ ([((z, 1, z + 1, z + 1, 1, z + 1, z, 1, z + 1, z + 1, 1, z, 1, z + 1, z, 1, z, 1, z + 1, 1, 1); (1,12,11,10,6,8,9,20,13,21,5,14,3,16,17,19,7,4,2,15,18), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z),
- ((z + 1, z + 1, z + 1, z + 1, z + 1, 1, z, 1, z, z, z, 1, z, 1, 1, 1, z + 1, z + 1, z + 1, 1, z); (1,15,21,8,9)(2,18,5,3,11,16,7,10,19,13,12,4,17,6,20), Ring endomorphism of Finite Field in z of size 2^2
+ ((z + 1, z + 1, z + 1, z, 1, 1, z, z, 1, z + 1, z, 1, 1, z, 1, z + 1, z, z + 1, z + 1, 1, z); (1,3,18,2,17,6,19)(4,15,13,20,7,14,16)(5,11,8,21,12,9,10), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z),
((z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1); (), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z)],
181440)
sage: C.automorphism_group_gens(equivalence="permutational")
- ([((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (1,19)(3,17)(4,21)(5,20)(7,14)(9,12)(10,16)(11,15), Ring endomorphism of Finite Field in z of size 2^2
+ ([((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (1,11)(3,10)(4,9)(5,7)(12,21)(14,20)(15,19)(16,17), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z),
- ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (1,11)(3,10)(4,9)(5,7)(12,21)(14,20)(15,19)(16,17), Ring endomorphism of Finite Field in z of size 2^2
+ ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (2,18)(3,19)(4,10)(5,16)(8,13)(9,14)(11,21)(15,20), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z),
- ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (1,17)(2,8)(3,14)(4,10)(7,12)(9,19)(13,18)(15,20), Ring endomorphism of Finite Field in z of size 2^2
+ ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (1,19)(3,17)(4,21)(5,20)(7,14)(9,12)(10,16)(11,15), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z),
((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (2,13)(3,14)(4,20)(5,11)(8,18)(9,19)(10,15)(16,21), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z)],
@@ -691,10 +691,10 @@ def _canonize(self, equivalence):
sage: C_iso == aut_group_can_label.get_canonical_form()
True
sage: aut_group_can_label.get_autom_gens()
- [((1, 1, 1, 1, 1, z + 1, z, z + 1, z, z, z, 1, 1, z + 1, z + 1, z, z + 1, z, z + 1, z + 1, z + 1); (1,14,6,7,4,10,11,19)(2,8,16,13,3,17,21,15)(9,12,18,20), Ring endomorphism of Finite Field in z of size 2^2
+ [((1, 1, 1, z, z + 1, 1, 1, 1, 1, z + 1, z, z, z + 1, z + 1, z + 1, 1, z + 1, z, z, 1, z); (1,13,14,20)(2,21,8,18,7,16,19,15)(3,10,5,12,17,9,6,4), Ring endomorphism of Finite Field in z of size 2^2
+ Defn: z |--> z + 1),
+ ((z, 1, z, z, z, z + 1, z, z, z, z, z, z, z + 1, z, z, z, z, z + 1, z, z, z); (1,11,5,12,3,19)(2,8)(6,18,13)(7,17,15)(9,10,14,16,20,21), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z + 1),
- ((z + 1, 1, 1, z, z + 1, z, z, z + 1, z + 1, z + 1, 1, z + 1, z, z, 1, z + 1, 1, z, z + 1, z + 1, z); (1,18,6,19,2,9,17,10,13,14,21,11,4,5,12)(3,20,7,16,8), Ring endomorphism of Finite Field in z of size 2^2
- Defn: z |--> z),
((z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z, z); (), Ring endomorphism of Finite Field in z of size 2^2
Defn: z |--> z)]
"""
diff --git a/src/sage/combinat/posets/posets.py b/src/sage/combinat/posets/posets.py
index 2836d59d960..8c882d5ac3b 100644
--- a/src/sage/combinat/posets/posets.py
+++ b/src/sage/combinat/posets/posets.py
@@ -8813,7 +8813,7 @@ def _libgap_(self):
sage: libgap(P) # optional - gap_packages
<A poset on 5 points>
sage: A = libgap(GF(2)).PosetAlgebra(P); A # optional - gap_packages
- <GF(2)[<quiver with 5 vertices and 5 arrows>]/<two-sided ideal in <GF(2)[<quiver with 5 vertices and 5 arrows>]>, (1 generators)>>
+ <GF(2)[<quiver with 5 vertices and 5 arrows>]/<two-sided ideal in <GF(2)[<quiver with 5 vertices and 5 arrows>]>, (1 generator)>>
sage: A.Dimension() # optional - gap_packages
13
"""
diff --git a/src/sage/combinat/root_system/hecke_algebra_representation.py b/src/sage/combinat/root_system/hecke_algebra_representation.py
index 6b756bafc30..8ac99319bec 100644
--- a/src/sage/combinat/root_system/hecke_algebra_representation.py
+++ b/src/sage/combinat/root_system/hecke_algebra_representation.py
@@ -357,7 +357,7 @@ def Tw(self, word, signs=None, scalar=None):
sage: q1, q2 = K.gens()
sage: KW = W.algebra(K)
sage: x = KW.an_element(); x
- 123 + 3*32 + 2*3 + e
+ 123 + 3*2312 + 2*31 + e
sage: T = KW.demazure_lusztig_operators(q1,q2)
sage: T12 = T.Tw( (1,2) )
diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py
index b8a0bebab44..9bccba124c8 100644
--- a/src/sage/combinat/symmetric_group_algebra.py
+++ b/src/sage/combinat/symmetric_group_algebra.py
@@ -101,7 +101,7 @@ def SymmetricGroupAlgebra(R, W, category=None):
sage: SGA.group()
Weyl Group of type ['A', 3] (as a matrix group acting on the ambient space)
sage: SGA.an_element()
- s1*s2*s3 + 3*s3*s2 + 2*s3 + 1
+ s1*s2*s3 + 3*s2*s3*s1*s2 + 2*s3*s1 + 1
The preferred way to construct the symmetric group algebra is to
go through the usual ``algebra`` method::
diff --git a/src/sage/env.py b/src/sage/env.py
index 911f34b1bc6..5f7aca8599c 100644
--- a/src/sage/env.py
+++ b/src/sage/env.py
@@ -197,7 +197,8 @@ def var(key: str, *fallbacks: Optional[str], force: bool = False) -> Optional[st
GRAPHS_DATA_DIR = var("GRAPHS_DATA_DIR", join(SAGE_SHARE, "graphs"))
ELLCURVE_DATA_DIR = var("ELLCURVE_DATA_DIR", join(SAGE_SHARE, "ellcurves"))
POLYTOPE_DATA_DIR = var("POLYTOPE_DATA_DIR", join(SAGE_SHARE, "reflexive_polytopes"))
-GAP_ROOT_DIR = var("GAP_ROOT_DIR", join(SAGE_SHARE, "gap"))
+GAP_LIB_DIR = var("GAP_LIB_DIR", join(SAGE_LOCAL, "lib", "gap"))
+GAP_SHARE_DIR = var("GAP_SHARE_DIR", join(SAGE_SHARE, "gap"))
THEBE_DIR = var("THEBE_DIR", join(SAGE_SHARE, "thebe"))
COMBINATORIAL_DESIGN_DATA_DIR = var("COMBINATORIAL_DESIGN_DATA_DIR", join(SAGE_SHARE, "combinatorial_designs"))
CREMONA_MINI_DATA_DIR = var("CREMONA_MINI_DATA_DIR", join(SAGE_SHARE, "cremona"))
@@ -229,12 +230,6 @@ def var(key: str, *fallbacks: Optional[str], force: bool = False) -> Optional[st
LIE_INFO_DIR = var("LIE_INFO_DIR", join(SAGE_LOCAL, "lib", "LiE"))
SINGULAR_BIN = var("SINGULAR_BIN") or "Singular"
-# The path to libSingular, to be passed to dlopen(). This will
-# typically be set to an absolute path in sage_conf, but the relative
-# fallback path here works on systems where dlopen() searches the
-# system's library locations.
-LIBSINGULAR_PATH = var("LIBSINGULAR_PATH", "libSingular.so")
-
# OpenMP
OPENMP_CFLAGS = var("OPENMP_CFLAGS", "")
OPENMP_CXXFLAGS = var("OPENMP_CXXFLAGS", "")
@@ -255,81 +250,6 @@ def var(key: str, *fallbacks: Optional[str], force: bool = False) -> Optional[st
SAGE_GAP_COMMAND = var('SAGE_GAP_COMMAND', _gap_cmd)
-def _get_shared_lib_path(*libnames: str) -> Optional[str]:
- """
- Return the full path to a shared library file installed in
- ``$SAGE_LOCAL/lib`` or the directories associated with the
- Python sysconfig.
-
- This can also be passed more than one library name (e.g. for cases where
- some library may have multiple names depending on the platform) in which
- case the first one found is returned.
-
- This supports most *NIX variants (in which ``lib<libname>.so`` is found
- under ``$SAGE_LOCAL/lib``), macOS (same, but with the ``.dylib``
- extension), and Cygwin (under ``$SAGE_LOCAL/bin/cyg<libname>.dll``,
- or ``$SAGE_LOCAL/bin/cyg<libname>-*.dll`` for versioned DLLs).
-
- For distributions like Debian that use a multiarch layout, we also try the
- multiarch lib paths (i.e. ``/usr/lib/<arch>/``).
-
- This returns ``None`` if no matching library file could be found.
-
- EXAMPLES::
-
- sage: from sage.env import _get_shared_lib_path
- sage: "gap" in _get_shared_lib_path("gap")
- True
- sage: _get_shared_lib_path("an_absurd_lib") is None
- True
-
- """
-
- for libname in libnames:
- search_directories: List[Path] = []
- patterns: List[str] = []
- if sys.platform == 'cygwin':
- # Later down we take the first matching DLL found, so search
- # SAGE_LOCAL first so that it takes precedence
- if SAGE_LOCAL:
- search_directories.append(Path(SAGE_LOCAL) / 'bin')
- search_directories.append(Path(sysconfig.get_config_var('BINDIR')))
- # Note: The following is not very robust, since if there are multible
- # versions for the same library this just selects one more or less
- # at arbitrary. However, practically speaking, on Cygwin, there
- # will only ever be one version
- patterns = [f'cyg{libname}.dll', f'cyg{libname}-*.dll']
- else:
- if sys.platform == 'darwin':
- ext = 'dylib'
- else:
- ext = 'so'
-
- if SAGE_LOCAL:
- search_directories.append(Path(SAGE_LOCAL) / 'lib')
- libdir = sysconfig.get_config_var('LIBDIR')
- if libdir is not None:
- libdir = Path(libdir)
- search_directories.append(libdir)
-
- multiarchlib = sysconfig.get_config_var('MULTIARCH')
- if multiarchlib is not None:
- search_directories.append(libdir / multiarchlib),
-
- patterns = [f'lib{libname}.{ext}']
-
- for directory in search_directories:
- for pattern in patterns:
- path = next(directory.glob(pattern), None)
- if path is not None:
- return str(path.resolve())
-
- # Just return None if no files were found
- return None
-
-# locate libgap shared object
-GAP_SO = var("GAP_SO", _get_shared_lib_path("gap", ""))
-
# post process
if DOT_SAGE is not None and ' ' in DOT_SAGE:
if UNAME[:6] == 'CYGWIN':
diff --git a/src/sage/groups/abelian_gps/abelian_group_gap.py b/src/sage/groups/abelian_gps/abelian_group_gap.py
index a4b047113c5..86090b43535 100644
--- a/src/sage/groups/abelian_gps/abelian_group_gap.py
+++ b/src/sage/groups/abelian_gps/abelian_group_gap.py
@@ -338,7 +338,7 @@ def _element_constructor_(self, x, check=True):
if isinstance(x, AbelianGroupElement_gap):
try:
if x in self._cover:
- x = self.gap().NaturalHomomorphism().Image(x.gap())
+ x = self._cover.gap().NaturalHomomorphismByNormalSubgroup(self._relations).Image(x.gap())
else:
x = x.gap()
except AttributeError:
@@ -1043,7 +1043,7 @@ def natural_homomorphism(self):
From: Abelian group with gap, generator orders (4,)
To: Quotient abelian group with generator orders (2,)
"""
- phi = self.gap().NaturalHomomorphism()
+ phi = self._cover.gap().NaturalHomomorphismByNormalSubgroup(self._relations)
Hom = self._cover.Hom(self)
return Hom(phi)
diff --git a/src/sage/groups/finitely_presented.py b/src/sage/groups/finitely_presented.py
index 8d6e443683c..1beb01af87f 100644
--- a/src/sage/groups/finitely_presented.py
+++ b/src/sage/groups/finitely_presented.py
@@ -596,9 +596,9 @@ def gap(self):
sage: k = G.rewriting_system()
sage: k.gap()
Knuth Bendix Rewriting System for Monoid( [ a, A, b, B ] ) with rules
- [ [ a^2, <identity ...> ], [ a*A, <identity ...> ],
- [ A*a, <identity ...> ], [ b^2, <identity ...> ],
- [ b*B, <identity ...> ], [ B*b, <identity ...> ] ]
+ [ [ a*A, <identity ...> ], [ A*a, <identity ...> ],
+ [ b*B, <identity ...> ], [ B*b, <identity ...> ],
+ [ a^2, <identity ...> ], [ b^2, <identity ...> ] ]
"""
return self._gap
diff --git a/src/sage/groups/fqf_orthogonal.py b/src/sage/groups/fqf_orthogonal.py
index 7fc4dbe7548..e5eccd45942 100644
--- a/src/sage/groups/fqf_orthogonal.py
+++ b/src/sage/groups/fqf_orthogonal.py
@@ -143,7 +143,7 @@ class FqfOrthogonalGroup(AbelianGroupAutomorphismGroup_subgroup):
[2/3 0 0]
[ 0 2/3 0]
[ 0 0 4/3]
- generated by 2 elements
+ generated by 3 elements
sage: q = matrix.diagonal(QQ, [3/2, 1/4, 1/4])
sage: T = TorsionQuadraticForm(q)
sage: T.orthogonal_group().order()
diff --git a/src/sage/groups/libgap_wrapper.pyx b/src/sage/groups/libgap_wrapper.pyx
index d25121aa792..dc81b71635b 100644
--- a/src/sage/groups/libgap_wrapper.pyx
+++ b/src/sage/groups/libgap_wrapper.pyx
@@ -25,7 +25,7 @@ Note how we call the constructor of both superclasses to initialize
its output via LibGAP::
sage: FooGroup()
- <pc group of size 3 with 1 generators>
+ <pc group of size 3 with 1 generator>
sage: type(FooGroup().gap())
<class 'sage.libs.gap.element.GapElement'>
@@ -106,7 +106,7 @@ class ParentLibGAP(SageObject):
....: ParentLibGAP.__init__(self, lg)
....: Group.__init__(self)
sage: FooGroup()
- <pc group of size 3 with 1 generators>
+ <pc group of size 3 with 1 generator>
"""
def __init__(self, libgap_parent, ambient=None):
@@ -461,7 +461,7 @@ cdef class ElementLibGAP(MultiplicativeGroupElement):
....: ParentLibGAP.__init__(self, lg)
....: Group.__init__(self)
sage: FooGroup()
- <pc group of size 3 with 1 generators>
+ <pc group of size 3 with 1 generator>
sage: FooGroup().gens()
(f1,)
"""
diff --git a/src/sage/groups/matrix_gps/finitely_generated.py b/src/sage/groups/matrix_gps/finitely_generated.py
index a6d3dc02513..63956ad5f10 100644
--- a/src/sage/groups/matrix_gps/finitely_generated.py
+++ b/src/sage/groups/matrix_gps/finitely_generated.py
@@ -563,9 +563,6 @@ def as_permutation_group(self, algorithm=None, seed=None):
21499084800
sage: P = G.as_permutation_group()
sage: Psmaller = G.as_permutation_group(algorithm="smaller", seed=6)
- sage: P == Psmaller # see the note below
- True
- sage: Psmaller = G.as_permutation_group(algorithm="smaller")
sage: P == Psmaller
False
sage: P.cardinality()
diff --git a/src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx b/src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx
index f2ccca042ac..47d6862333c 100644
--- a/src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx
+++ b/src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx
@@ -427,7 +427,7 @@ cdef class LabelledBranching:
sage: from sage.groups.perm_gps.partn_ref2.refinement_generic import LabelledBranching
sage: L = LabelledBranching(3)
sage: L.small_generating_set()
- []
+ [()]
sage: L.add_gen(libgap.eval('(1,2,3)'))
sage: L.small_generating_set()
[(1,2,3)]
diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py
index ebdf7c4c6eb..fb14008c8e0 100644
--- a/src/sage/groups/perm_gps/permgroup.py
+++ b/src/sage/groups/perm_gps/permgroup.py
@@ -926,7 +926,7 @@ def _coerce_map_from_(self, G):
sage: f = PG._coerce_map_from_(MG)
sage: mg = MG.an_element()
sage: p = f(mg); p
- (2,33,32,23,31,55)(3,49,38,44,40,28)(4,17,59,62,58,46)(5,21,47,20,43,8)(6,53,50)(7,37,12,57,14,29)(9,41,56,34,64,10)(11,25,19)(13,61,26,51,22,15)(16,45,36)(18,27,35,48,52,54)(24,63,42)(30,39,60)
+ (1,2,6,19,35,33)(3,9,26,14,31,23)(4,13,5)(7,22,17)(8,24,12)(10,16,32,27,20,28)(11,30,18)(15,25,36,34,29,21)
sage: PG(p._gap_()) == p
True
@@ -972,12 +972,12 @@ def _coerce_map_from_(self, G):
sage: P = G.as_permutation_group(algorithm='smaller', seed=5)
sage: P1 = G.as_permutation_group()
sage: P == P1
- False
+ True
sage: g1, g2, g3 = G.gens()
sage: P(g1*g2)
- (1,3,7,12)(2,4,8,10)(5,11)(6,9)
+ (1,4,13,11)(2,5,14,18)(3,15,8,16)(6,7)(9,20,19,12)(10,17)
sage: P1(g1*g2)
- (2,29,25,68)(3,57,13,54)(4,11,72,37)(5,39,60,23)(6,64,75,63)(7,21,50,73)(8,46,38,32)(9,74,35,18)(10,44,49,48)(12,16,34,71)(14,79,27,40)(15,26)(17,62,59,76)(19,78,70,65)(20,22,58,51)(24,33,36,43)(28,81,80,52)(30,53,56,69)(31,61)(41,42,67,55)(45,77)(47,66)
+ (1,4,13,11)(2,5,14,18)(3,15,8,16)(6,7)(9,20,19,12)(10,17)
Another check for :trac:`5583`::
@@ -1302,7 +1302,7 @@ def gens_small(self):
sage: G.gens_small() # random
[('b','c'), ('a','c','b')] ## (on 64-bit Linux)
[('a','b'), ('a','c','b')] ## (on Solaris)
- sage: len(G.gens_small()) == 2
+ sage: len(G.gens_small()) == 2 # random
True
"""
gens = self._libgap_().SmallGeneratingSet()
@@ -4370,17 +4370,23 @@ def is_transitive(self, domain=None):
::
- sage: G = PermutationGroup([[(1,2,3,4,5)],[(1,2)]]) #S_5 on [1..5]
- sage: G.is_transitive([1,4,5])
+ sage: G = PermutationGroup([[(1,2,3,4,5)],[(1,2)],[(6,7)]])
+ sage: G.is_transitive([1,2,3,4,5])
True
- sage: G.is_transitive([2..6])
+ sage: G.is_transitive([1..7])
False
sage: G.is_transitive(G.non_fixed_points())
- True
+ False
sage: H = PermutationGroup([[(1,2,3)],[(4,5,6)]])
sage: H.is_transitive(H.non_fixed_points())
False
+ If `G` does not act on the domain, it always returns ``False``::
+
+ sage: G = PermutationGroup([[(1,2,3,4,5)],[(1,2)]]) #S_5 on [1..5]
+ sage: G.is_transitive([1,4,5])
+ False
+
Note that this differs from the definition in GAP, where
``IsTransitive`` returns whether the group is transitive on the
set of points moved by the group.
@@ -4436,12 +4442,16 @@ def is_primitive(self, domain=None):
sage: G = PermutationGroup([[(1,2,3,4)],[(2,4)]])
sage: G.is_primitive([1..4])
False
- sage: G.is_primitive([1,2,3])
- True
sage: G = PermutationGroup([[(3,4,5,6)],[(3,4)]]) #S_4 on [3..6]
sage: G.is_primitive(G.non_fixed_points())
True
+ If `G` does not act on the domain, it always returns ``False``::
+
+ sage: G = PermutationGroup([[(1,2,3,4)],[(2,4)]])
+ sage: G.is_primitive([1,2,3])
+ False
+
"""
#If the domain is not a subset of self.domain(), then the
#action isn't primitive.
diff --git a/src/sage/interfaces/gap.py b/src/sage/interfaces/gap.py
index 7ae1792e9de..ecaa9fd2341 100644
--- a/src/sage/interfaces/gap.py
+++ b/src/sage/interfaces/gap.py
@@ -1512,6 +1512,8 @@ def gap_reset_workspace(max_workspace_size=None, verbose=False):
"""
# Create new workspace with filename WORKSPACE
g = Gap(use_workspace_cache=False, max_workspace_size=None)
+ g.eval('ColorPrompt(false)')
+ g.eval('SetUserPreference("UseColorPrompt", false)')
g.eval('SetUserPreference("HistoryMaxLines", 30)')
from sage.tests.gap_packages import all_installed_packages
for pkg in all_installed_packages(gap=g):
diff --git a/src/sage/interfaces/gap_workspace.py b/src/sage/interfaces/gap_workspace.py
index 33a87dd5076..03b40be6856 100644
--- a/src/sage/interfaces/gap_workspace.py
+++ b/src/sage/interfaces/gap_workspace.py
@@ -16,7 +16,8 @@
import os
import time
import hashlib
-from sage.env import DOT_SAGE, GAP_SO
+import subprocess
+from sage.env import DOT_SAGE, HOSTNAME, GAP_LIB_DIR, GAP_SHARE_DIR
def gap_workspace_file(system="gap", name="workspace", dir=None):
@@ -59,11 +60,13 @@ def gap_workspace_file(system="gap", name="workspace", dir=None):
if dir is None:
dir = os.path.join(DOT_SAGE, 'gap')
- if GAP_SO:
- h = hashlib.sha1(GAP_SO.encode('utf-8')).hexdigest()
- else:
- h = 'unknown'
- return os.path.join(dir, '%s-%s-%s' % (system, name, h))
+ data = f'{GAP_LIB_DIR}:{GAP_SHARE_DIR}'
+ for path in GAP_LIB_DIR, GAP_SHARE_DIR:
+ sysinfo = os.path.join(path, "sysinfo.gap")
+ if os.path.exists(sysinfo):
+ data += subprocess.getoutput(f'. "{sysinfo}" && echo ":$GAP_VERSION:$GAParch"')
+ h = hashlib.sha1(data.encode('utf-8')).hexdigest()
+ return os.path.join(dir, f'{system}-{name}-{HOSTNAME}-{h}')
def prepare_workspace_dir(dir=None):
diff --git a/src/sage/libs/gap/element.pyx b/src/sage/libs/gap/element.pyx
index c555ea0333c..e3db3934baf 100644
--- a/src/sage/libs/gap/element.pyx
+++ b/src/sage/libs/gap/element.pyx
@@ -130,6 +130,7 @@ cdef char *capture_stdout(Obj func, Obj obj):
"""
cdef Obj s, stream, output_text_string
cdef UInt res
+ cdef TypOutputFile output
# The only way to get a string representation of an object that is truly
# consistent with how it would be represented at the GAP REPL is to call
# ViewObj on it. Unfortunately, ViewObj *prints* to the output stream,
@@ -145,12 +146,12 @@ cdef char *capture_stdout(Obj func, Obj obj):
output_text_string = GAP_ValueGlobalVariable("OutputTextString")
stream = CALL_2ARGS(output_text_string, s, GAP_True)
- if not OpenOutputStream(stream):
+ if not OpenOutputStream(&output, stream):
raise GAPError("failed to open output capture stream for "
"representing GAP object")
CALL_1ARGS(func, obj)
- CloseOutput()
+ CloseOutput(&output)
return CSTR_STRING(s)
finally:
GAP_Leave()
diff --git a/src/sage/libs/gap/gap_includes.pxd b/src/sage/libs/gap/gap_includes.pxd
index 6d22e32540b..6111d18a5c7 100644
--- a/src/sage/libs/gap/gap_includes.pxd
+++ b/src/sage/libs/gap/gap_includes.pxd
@@ -76,8 +76,10 @@ cdef extern from "gap/intobj.h" nogil:
cdef extern from "gap/io.h" nogil:
- UInt OpenOutputStream(Obj stream)
- UInt CloseOutput()
+ ctypedef struct TypOutputFile:
+ pass
+ UInt OpenOutputStream(TypOutputFile* output, Obj stream)
+ UInt CloseOutput(TypOutputFile* output)
cdef extern from "gap/libgap-api.h" nogil:
diff --git a/src/sage/libs/gap/libgap.pyx b/src/sage/libs/gap/libgap.pyx
index b1a64e57939..6a36613aa8c 100644
--- a/src/sage/libs/gap/libgap.pyx
+++ b/src/sage/libs/gap/libgap.pyx
@@ -695,7 +695,7 @@ class Gap(Parent):
sage: libgap.List
<Gap function "List">
sage: libgap.GlobalRandomSource
- <RandomSource in IsGlobalRandomSource>
+ <RandomSource in IsGAPRandomSource>
"""
if name in dir(self.__class__):
return getattr(self.__class__, name)
diff --git a/src/sage/libs/gap/saved_workspace.py b/src/sage/libs/gap/saved_workspace.py
index ad5adec36d0..7636707f557 100644
--- a/src/sage/libs/gap/saved_workspace.py
+++ b/src/sage/libs/gap/saved_workspace.py
@@ -8,7 +8,7 @@
import os
import glob
-from sage.env import GAP_ROOT_DIR
+from sage.env import GAP_LIB_DIR
from sage.interfaces.gap_workspace import gap_workspace_file
@@ -31,7 +31,7 @@ def timestamp():
"""
libgap_dir = os.path.dirname(__file__)
libgap_files = glob.glob(os.path.join(libgap_dir, '*'))
- gap_packages = glob.glob(os.path.join(GAP_ROOT_DIR, 'pkg', '*'))
+ gap_packages = glob.glob(os.path.join(GAP_LIB_DIR, 'pkg', '*'))
files = libgap_files + gap_packages
if len(files) == 0:
print('Unable to find LibGAP files.')
diff --git a/src/sage/libs/gap/util.pyx b/src/sage/libs/gap/util.pyx
index 344ab88c42a..eaa659d64c7 100644
--- a/src/sage/libs/gap/util.pyx
+++ b/src/sage/libs/gap/util.pyx
@@ -13,7 +13,7 @@ Utility functions for GAP
#*****************************************************************************
from libc.signal cimport signal, SIGCHLD, SIG_DFL
-from posix.dlfcn cimport dlopen, dlclose, RTLD_NOW, RTLD_GLOBAL
+from posix.dlfcn cimport dlopen, dlclose, dlerror, RTLD_LAZY, RTLD_GLOBAL
from cpython.exc cimport PyErr_Fetch, PyErr_Restore
from cpython.object cimport Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE
@@ -164,33 +164,6 @@ cdef void gasman_callback() with gil:
### Initialization of GAP ##################################################
############################################################################
-def gap_root():
- """
- Find the location of the GAP root install which is stored in the gap
- startup script.
-
- EXAMPLES::
-
- sage: from sage.libs.gap.util import gap_root
- sage: gap_root() # random output
- '/home/vbraun/opt/sage-5.3.rc0/local/gap/latest'
- """
- if os.path.exists(sage.env.GAP_ROOT_DIR):
- return sage.env.GAP_ROOT_DIR
-
- # Attempt to figure out the appropriate GAP_ROOT by reading the
- # local/bin/gap shell script; this is an ugly hack that exists for
- # historical reasons; the best approach to setting where Sage looks for
- # the appropriate GAP_ROOT is to set the GAP_ROOT_DIR variable
- SAGE_LOCAL = sage.env.SAGE_LOCAL
- with open(os.path.join(SAGE_LOCAL, 'bin', 'gap')) as f:
- gap_sh = f.read().splitlines()
- gapdir = next(x for x in gap_sh if x.strip().startswith('GAP_ROOT'))
- gapdir = gapdir.split('"')[1]
- gapdir = gapdir.replace('$SAGE_LOCAL', SAGE_LOCAL)
- return gapdir
-
-
# To ensure that we call initialize_libgap only once.
cdef bint _gap_is_initialized = False
@@ -232,12 +205,12 @@ cdef initialize():
# this isn't portable
cdef void* handle
- libgapname = str_to_bytes(sage.env.GAP_SO)
- handle = dlopen(libgapname, RTLD_NOW | RTLD_GLOBAL)
+ # reload the current module to force reload of libgap (see #33446)
+ lib = str_to_bytes(__loader__.path, FS_ENCODING, "surrogateescape")
+ handle = dlopen(lib, RTLD_GLOBAL|RTLD_LAZY)
if handle is NULL:
- raise RuntimeError(
- "Could not dlopen() libgap even though it should already "
- "be loaded!")
+ err = dlerror()
+ raise RuntimeError(f"Could not reload gap library with RTLD_GLOBAL ({err})")
dlclose(handle)
# Define argv variable, which we will pass in to
@@ -245,7 +218,7 @@ cdef initialize():
cdef char* argv[16]
argv[0] = "sage"
argv[1] = "-l"
- s = str_to_bytes(gap_root(), FS_ENCODING, "surrogateescape")
+ s = str_to_bytes(sage.env.GAP_LIB_DIR + ";" + sage.env.GAP_SHARE_DIR, FS_ENCODING, "surrogateescape")
argv[2] = s
argv[3] = "-m"
@@ -362,15 +335,9 @@ cdef Obj gap_eval(str gap_string) except? NULL:
GAPError: Error, Variable: 'Complex' must have a value
Syntax error: ; expected in stream:1
Complex Field with 53 bits of precision;;
- ^^^^^^^^^^^^
+ ^^^^^
Error, Variable: 'with' must have a value
- Syntax error: ; expected in stream:1
- Complex Field with 53 bits of precision;;
- ^^^^^^^^^^^^^^^^^^^^
Error, Variable: 'bits' must have a value
- Syntax error: ; expected in stream:1
- Complex Field with 53 bits of precision;;
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error, Variable: 'precision' must have a value
Test that on a subsequent attempt we get the same message (no garbage was
diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx
index d8ea7b07f3c..4beb1774df9 100644
--- a/src/sage/libs/singular/singular.pyx
+++ b/src/sage/libs/singular/singular.pyx
@@ -1705,14 +1705,7 @@ cdef object si2sa_intvec(intvec *v):
cdef extern from *: # hack to get at cython macro
int unlikely(int)
-cdef extern from "dlfcn.h":
- void *dlopen(char *, long)
- char *dlerror()
- void dlclose(void *handle)
-
-cdef extern from "dlfcn.h":
- cdef long RTLD_LAZY
- cdef long RTLD_GLOBAL
+from posix.dlfcn cimport dlopen, dlclose, dlerror, RTLD_LAZY, RTLD_GLOBAL
cdef int overflow_check(unsigned long e, ring *_ring) except -1:
"""
@@ -1762,8 +1755,6 @@ cdef init_libsingular():
cdef void *handle = NULL
- from sage.env import LIBSINGULAR_PATH
- lib = str_to_bytes(LIBSINGULAR_PATH, FS_ENCODING, "surrogateescape")
# This is a workaround for https://github.com/Singular/Singular/issues/1113
# and can be removed once that fix makes it into release of Singular that
@@ -1780,10 +1771,12 @@ cdef init_libsingular():
import platform
if not platform.system().startswith("CYGWIN"):
+ # reload the current module to force reload of libSingular (see #33446)
+ lib = str_to_bytes(__loader__.path, FS_ENCODING, "surrogateescape")
handle = dlopen(lib, RTLD_GLOBAL|RTLD_LAZY)
if not handle:
err = dlerror()
- raise ImportError(f"cannot load Singular library from {LIBSINGULAR_PATH} ({err})")
+ raise RuntimeError(f"Could not reload Singular library with RTLD_GLOBAL ({err})")
# load SINGULAR
siInit(lib)
diff --git a/src/sage/tests/gap_packages.py b/src/sage/tests/gap_packages.py
index 2e4518ca226..c302b169b8a 100644
--- a/src/sage/tests/gap_packages.py
+++ b/src/sage/tests/gap_packages.py
@@ -103,7 +103,7 @@ def all_installed_packages(ignore_dot_gap=False, gap=None):
sage: from sage.tests.gap_packages import all_installed_packages
sage: all_installed_packages()
- (...'GAPDoc'...)
+ (...'gapdoc'...)
sage: all_installed_packages(ignore_dot_gap=True) == all_installed_packages(gap=gap, ignore_dot_gap=True)
True
"""