Cython on Ubuntu 24.04
I'm running SageMath 10.4, which was installed using mamba. When trying the example of load("power2.spyx") in Coding in Cython documentation on the SageMath website, I get the following error. I tried to avoid the error by installing libgd3 and libgd-dev via apt, but the error remains.
$ sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 10.4, Release Date: 2024-07-19 │
│ Using Python 3.10.15. Type "help()" for help. │
└────────────────────────────────────────────────────────────────────┘
sage: load("power2.spyx")
Compiling power2.spyx...
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/misc/cachefunc.pyx:1010, in sage.misc.cachefunc.CachedFunction.__call__ (build/cythonized/sage/misc/cachefunc.c:8371)()
1009 try:
-> 1010 return self.cache[k]
1011 except TypeError: # k is not hashable
KeyError: ((), ())
During handling of the above exception, another exception occurred:
PackageNotFoundError Traceback (most recent call last)
Cell In[1], line 1
----> 1 load("power2.spyx")
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/misc/persist.pyx:176, in sage.misc.persist.load (build/cythonized/sage/misc/persist.c:4564)()
174
175 if sage.repl.load.is_loadable_filename(filename):
--> 176 sage.repl.load.load(filename, globals())
177 return
178
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/repl/load.py:282, in load(filename, globals, attach)
280 if attach:
281 add_attached_file(fpath)
--> 282 exec(load_cython(fpath), globals)
283 elif ext in ['.f', '.f90']:
284 from sage.misc.inline_fortran import fortran
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/repl/load.py:73, in load_cython(name)
60 """
61 Helper function to load a Cython file.
62
(...)
70 module.
71 """
72 from sage.misc.cython import cython
---> 73 mod, dir = cython(str(name), compile_message=True, use_cache=True)
74 import sys
75 sys.path.append(dir)
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/misc/cython.py:317, in cython(filename, verbose, compile_message, use_cache, create_local_c_file, annotate, sage_namespace, create_local_so_file)
313 shutil.copy(filename, pyxfile)
315 # Add current working directory to includes. This is needed because
316 # we cythonize from a different directory. See Issue #24764.
--> 317 standard_libs, standard_libdirs, standard_includes, aliases = _standard_libs_libdirs_incdirs_aliases()
318 includes = [os.getcwd()] + standard_includes
320 # Now do the actual build, directly calling Cython and distutils
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/misc/cachefunc.pyx:1015, in sage.misc.cachefunc.CachedFunction.__call__ (build/cythonized/sage/misc/cachefunc.c:8499)()
1013 return self.cache[k]
1014 except KeyError:
-> 1015 w = self.f(*args, **kwds)
1016 self.cache[k] = w
1017 return w
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/misc/cython.py:51, in _standard_libs_libdirs_incdirs_aliases()
37 @cached_function
38 def _standard_libs_libdirs_incdirs_aliases():
39 r"""
40 Return the list of libraries and library directories.
41
(...)
49 {...})
50 """
---> 51 aliases = cython_aliases()
52 standard_libs = [
53 'mpfr', 'gmp', 'gmpxx', 'pari', 'm',
54 'ec', 'gsl',
55 ] + aliases["CBLAS_LIBRARIES"] + [
56 'ntl']
57 standard_libdirs = []
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/sage/env.py:442, in cython_aliases(required_modules, optional_modules)
440 else:
441 try:
--> 442 aliases[var + "CFLAGS"] = pkgconfig.cflags(lib).split()
443 pc = pkgconfig.parse(lib)
444 libs = pkgconfig.libs(lib)
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/pkgconfig/pkgconfig.py:144, in cflags(package)
138 def cflags(package):
139 """
140 Return the CFLAGS string returned by pkg-config.
141
142 If ``pkg-config`` is not on path, raises ``EnvironmentError``.
143 """
--> 144 _raise_if_not_exists(package)
145 return _query(package, '--cflags')
File ~/mambaforge/envs/sage104/lib/python3.10/site-packages/pkgconfig/pkgconfig.py:103, in _raise_if_not_exists(package)
101 def _raise_if_not_exists(package):
102 if not exists(package):
--> 103 raise PackageNotFoundError(package)
PackageNotFoundError: gdlib not found
FWIW, the command
works in SageMath 10.4 built from source (*) on Ubuntu 24.04
(*) according to these instructions