(address . bug-guix@gnu.org)
Hi y'all,
I'm working on Guile bindings for GNU Scientific Library (GSL), and I
encountered a bug: GSL cannot find CBLAS functions when invoked directly
from Guile.
I'm attaching a script, gslcblas.scm, ran (given that you replace the
path to libgsl.so in it with a machine-specific one) with
guile gslcblas.scm
(use-modules (system foreign)
(system foreign-library))
(define libgsl
(load-foreign-library "/gnu/store/zfxs8xbh68nb8smvsdf9i6aj6hbzgix4-profile/lib/libgsl.so"))
(define gsl-vector-alloc
(foreign-library-function libgsl
"gsl_vector_alloc"
#:return-type '*
#:arg-types (list size_t)))
(define gsl-vector-set
(foreign-library-function libgsl
"gsl_vector_set"
#:return-type void
#:arg-types (list '* size_t double)))
(define gsl-vector-get
(foreign-library-function libgsl
"gsl_vector_get"
#:return-type double
#:arg-types (list '* size_t)))
(define gsl-blas-dscal
(foreign-library-function libgsl
"gsl_blas_dscal"
#:return-type void
#:arg-types (list double '*)))
(let* ((n 3)
(x (gsl-vector-alloc n)))
(for-each (lambda (i)
(gsl-vector-set x i i))
(iota n))
(gsl-blas-dscal 10 x))
It errors out with
guile: symbol lookup error: [...]/libgsl.so: undefined symbol: cblas_dscal
Loading libgslcblas.so into the Scheme image doesn't help, it errors out
the same. That's why I'm thinking it's not a Guile Scheme problem, but a
library one: GSL C code breaks with no knowledge of CBLAS.
The suggested fix is to link libgsl.so against libgslcblas.so (or any
other CBLAS library?), so that the functions from the latter are
available in the former. that seems to be what Arch package does
(https://archlinux.org/packages/extra/x86_64/gsl/),at least. Although I
admit this is a strange circular behavior, it makes sense too: CBLAS is
an implementation detail for BLAS support in GSL, and should be linked
as such.
I'm not knowledgeable enough in the ways of building GSL (or any complex
C software really), so I cannot come up with a proper patch. Hopefully
that's enough info for someone to act on.
Acknowledgements: Huge thanks to Arun Isaac who helped me debug this
problem!
Thanks,
--
Artyom Bologov.