bug-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-gsl] [bug #33040] libgsl should be linked against libgslcblas


From: Christoph Junghans
Subject: Re: [Bug-gsl] [bug #33040] libgsl should be linked against libgslcblas
Date: Mon, 11 Apr 2011 15:38:26 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9 ThunderBrowse/3.3.5

Hi Peter,

thanks for the quick reply.
Am 04/11/2011 01:27 AM, schrieb Peter Johansson:
On 4/10/11 8:05 AM, Christoph Junghans wrote:
Details:

$cat main.c
int gsl_linalg_QR_decomp();
int main() {
return 0;
}
$gcc main.c -lgsl
/usr/lib64/gcc/x86_64-suse-linux/4.4/../../../../lib64/libgsl.so:
undefined
reference to `cblas_csyrk'
(and more)

In gentoo the problem is fixed. (see patch)


IMHO, this is not a problem - it's a feature that allows me as a user to
choose at build time of my application which cblas to use. GSL documents
that the way to link against GSL is via

gcc main.c -lgsl -lgslcblas -lm

On one of my systems at work I have no control over how GSL is installed
and find it useful that GSL by default does not hardwire a specific
cblas into `libgsl.la'. With your patch the default behavior will be
different and it will be less flexible in terms of choosing cblas for
the end user (not for the sysadm who installs GSL).

I have never seen it this way around and actually it makes a lot of sense, so it is a feature.

We came across the problem, when checking for libgsl in our code, but after the above explanation we just added an additional check for cblas with failback to gslcblas.
<http://code.google.com/p/votca/source/detail?r=87dcd2781419e617fbd6e7aeb0e7dafaafb84d0d&repo=tools>

I think it'd be good if the patch could be modified so the default
behavior is as it is now, i.e., no cblas is hardwired into `libgsl.la'
et cetera.
Well, I prefer pkg-config flags over libtool's magic. However, in the case of cmake the la files are not used at all.


What stops you from hardwire a specific cblas into libgsl as it is now?
Wouldn't
./configure LIBS=-lcblas
accomplish what you want? [honest question]
I think the result would be the same, but we have no control about how GSL was built on the systems of our users ;-)

From my side the issue is fixed, I leave it to you GSL pros if this patch is considered useful or not.

Cheers,

Christoph

If the GSL maintainers accept the patch, I have a few suggestions diff
-Nur gsl-1.14.orig/acx_cblas.m4 gsl-1.14/acx_cblas.m4
--- gsl-1.14.orig/acx_cblas.m4 1970-01-01 01:00:00.000000000 +0100
+++ gsl-1.14/acx_cblas.m4 2010-04-09 02:19:59.000000000 +0100
@@ -0,0 +1,60 @@
+AC_DEFUN([ACX_CBLAS],[
+ use_cblas=no
+ use_cblas_libs="-lcblas -lblas"
+ use_cblas_cflags=""
+
+ AC_ARG_WITH(cblas,
+ [AS_HELP_STRING([--with-cblas], [use external CBLAS library (default
is no)])])
+
underquoted:

s/cblas/[cblas]/

+ case $with_cblas in
+ yes) use_cblas=yes ;;
+ no | "" ) use_cblas=no ;;
+ -* | */* | *.a | *.so | *.so.* | *.o) use_cblas_libs="$with_cblas" ;;
+ *) use_cblas_libs="-l$with_cblas" ;;
+ esac
+
+ AC_ARG_WITH(cblas-libs,
likewise

+ [AS_HELP_STRING([--with-cblas-libs=<libs>],
+ [external cblas libraries to link with (default is
"$use_cblas_libs")])],
+ [use_cblas_libs=$withval], [])
+
+ AC_ARG_WITH(cblas-cflags,
likewise
+ [AS_HELP_STRING([--with-cblas-cflags=<flags>],
+ [extra cflags to compile with external cblas ("-I<dir>")])],
+ [use_cblas_cflags=$withval], [])
+
+ if test x$use_cblas != xno; then
+ if test "x$CBLAS_LIBS" = x; then
+ CBLAS_LIBS="$use_cblas_libs"
+ fi
+ if test "x$CBLAS_FLAGS" = x; then
+ CBLAS_CFLAGS="$use_cblas_cflags"
+ fi
+
+ CFLAGS_sav="$CFLAGS"
+ CFLAGS="$CFLAGS $CBLAS_CFLAGS"
+ AC_CHECK_HEADER(cblas.h, ,
likewise
+ [AC_MSG_ERROR([
+ *** Header file cblas.h not found.
+ *** If you installed cblas header in a non standard place,
+ *** specify its install prefix using the following option
+ *** --with-cblas-cflags="-I<include_dir>"])
+ ])
+ CFLAGS="$CFLAGS_sav"
+
+ LIBS_sav="$LIBS"
+ LIBS="$LIBS $CBLAS_LIBS -lm"
+ AC_MSG_CHECKING([for cblas_sgemm in $CBLAS_LIBS])
+ AC_TRY_LINK_FUNC(cblas_sgemm, [use_cblas=yes],
likewise
+ [AC_MSG_ERROR([
+ *** Linking with cblas with $LIBS failed.
+ *** If you installed cblas library in a non standard place,
+ *** specify its install prefix using the following option
+ *** --with-cblas-libs="-L<lib_dir> -l<lib>"])
+ ])
+ AC_MSG_RESULT($use_cblas)
likewise

+ LIBS="$LIBS_sav"
+ AC_SUBST(CBLAS_CFLAGS)
+ AC_SUBST(CBLAS_LIBS)
+ fi
+])
diff -Nur gsl-1.14.orig/bspline/Makefile.am gsl-1.14/bspline/Makefile.am
--- gsl-1.14.orig/bspline/Makefile.am 2010-04-09 02:04:47.000000000 +0100
+++ gsl-1.14/bspline/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -12,6 +12,6 @@

TESTS = $(check_PROGRAMS)

-test_LDADD = libgslbspline.la ../linalg/libgsllinalg.la
../permutation/libgslpermutation.la ../blas/libgslblas.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
../utils/libutils.la ../statistics/libgslstatistics.la
+test_LDADD = libgslbspline.la ../linalg/libgsllinalg.la
../permutation/libgslpermutation.la ../blas/libgslblas.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la @CBLAS_LINK_LIBS@
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
../statistics/libgslstatistics.la

I prefer $(CBLAS_LINK_LIBS) over @CBLAS_LINK_LIBS@ so Automake has a
chance to pick up dependencies et cetera.

test_SOURCES = test.c
diff -Nur gsl-1.14.orig/configure.ac gsl-1.14/configure.ac
--- gsl-1.14.orig/configure.ac 2010-04-09 02:04:47.000000000 +0100
+++ gsl-1.14/configure.ac 2010-04-09 02:19:59.000000000 +0100
@@ -185,6 +185,16 @@
AC_CHECK_LIB(m, cos)
fi

+sinclude(acx_cblas.m4)
This is not needed as GSL uses aclocal, which will create this include
in `aclocal.m4'.

+ACX_CBLAS
+if test "x$CBLAS_LIBS" != "x"; then
+ CBLAS_LINK_LIBS="$CBLAS_LIBS"
+else
+ CBLAS_LINK_LIBS="\$(top_builddir)/cblas/libgslcblas.la"
+ CBLAS_LIBS="-lgslcblas"
+fi
+AC_SUBST(CBLAS_LINK_LIBS)
+
dnl Remember to put a definition in acconfig.h for each of these
AC_CHECK_DECLS(feenableexcept,,,[#define _GNU_SOURCE 1
#include <fenv.h>])
diff -Nur gsl-1.14.orig/eigen/Makefile.am gsl-1.14/eigen/Makefile.am
--- gsl-1.14.orig/eigen/Makefile.am 2010-04-09 02:04:46.000000000 +0100
+++ gsl-1.14/eigen/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -11,7 +11,7 @@

TESTS = $(check_PROGRAMS)

-test_LDADD = libgsleigen.la ../test/libgsltest.la
../linalg/libgsllinalg.la ../permutation/libgslpermutation.la
../blas/libgslblas.la ../cblas/libgslcblas.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../sys/libgslsys.la
../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la
../sort/libgslsort.la
+test_LDADD = libgsleigen.la ../test/libgsltest.la
../linalg/libgsllinalg.la ../permutation/libgslpermutation.la
../blas/libgslblas.la @CBLAS_LINK_LIBS@ ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la
../rng/libgslrng.la ../sort/libgslsort.la

likewise prefer $(foo) over @foo@ when possible
test_SOURCES = test.c

diff -Nur gsl-1.14.orig/gsl-config.in gsl-1.14/gsl-config.in
--- gsl-1.14.orig/gsl-config.in 2010-04-09 02:04:47.000000000 +0100
+++ gsl-1.14/gsl-config.in 2010-04-09 02:19:59.000000000 +0100
@@ -58,11 +58,11 @@
;;

--cflags)
- echo @GSL_CFLAGS@
+ echo @GSL_CFLAGS@ @CBLAS_CFLAGS@
;;

--libs)
- : ${GSL_CBLAS_LIB=-lgslcblas}
+ : address@hidden@}
echo @GSL_LIBS@ $GSL_CBLAS_LIB -lm
;;

diff -Nur gsl-1.14.orig/gsl.pc.in gsl-1.14/gsl.pc.in
--- gsl-1.14.orig/gsl.pc.in 2010-04-09 02:04:46.000000000 +0100
+++ gsl-1.14/gsl.pc.in 2010-04-09 02:19:59.000000000 +0100
@@ -6,5 +6,5 @@
Name: GSL
Description: GNU Scientific Library
Version: @VERSION@
-Libs: @GSL_LIBS@ -lgslcblas @LIBS@
-Cflags: @GSL_CFLAGS@
+Libs: @GSL_LIBS@ @CBLAS_LIBS@ @LIBS@
+Cflags: @GSL_CFLAGS@ @CBLAS_CFLAGS@
diff -Nur gsl-1.14.orig/interpolation/Makefile.am
gsl-1.14/interpolation/Makefile.am
--- gsl-1.14.orig/interpolation/Makefile.am 2010-04-09
02:04:47.000000000 +0100
+++ gsl-1.14/interpolation/Makefile.am 2010-04-09 02:19:59.000000000
+0100
@@ -10,7 +10,7 @@

TESTS = $(check_PROGRAMS)

-test_LDADD = libgslinterpolation.la ../poly/libgslpoly.la
../linalg/libgsllinalg.la ../permutation/libgslpermutation.la
../blas/libgslblas.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../cblas/libgslcblas.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_LDADD = libgslinterpolation.la ../poly/libgslpoly.la
../linalg/libgsllinalg.la ../permutation/libgslpermutation.la
../blas/libgslblas.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la @CBLAS_LINK_LIBS@
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la


likewise
test_SOURCES = test.c

diff -Nur gsl-1.14.orig/linalg/Makefile.am gsl-1.14/linalg/Makefile.am
--- gsl-1.14.orig/linalg/Makefile.am 2010-04-09 02:04:46.000000000 +0100
+++ gsl-1.14/linalg/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -12,7 +12,7 @@

check_PROGRAMS = test

-test_LDADD = libgsllinalg.la ../blas/libgslblas.la
../cblas/libgslcblas.la ../permutation/libgslpermutation.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_LDADD = libgsllinalg.la ../blas/libgslblas.la @CBLAS_LINK_LIBS@
../permutation/libgslpermutation.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
../utils/libutils.la


likewise
test_SOURCES = test.c

diff -Nur gsl-1.14.orig/Makefile.am gsl-1.14/Makefile.am
--- gsl-1.14.orig/Makefile.am 2010-04-09 02:04:46.000000000 +0100
+++ gsl-1.14/Makefile.am 2010-04-09 02:20:13.000000000 +0100
@@ -19,13 +19,12 @@

lib_LTLIBRARIES = libgsl.la
libgsl_la_SOURCES = version.c
-libgsl_la_LIBADD = $(SUBLIBS)
+libgsl_la_LIBADD = $(SUBLIBS) @CBLAS_LINK_LIBS@
likewise

libgsl_la_LDFLAGS = -version-info $(GSL_LT_VERSION)
noinst_HEADERS = templates_on.h templates_off.h build.h

MINGW32_HOST = @MINGW32_HOST@
if MINGW32_HOST
-libgsl_la_LIBADD += cblas/libgslcblas.la
libgsl_la_LDFLAGS += -no-undefined
endif

@@ -35,10 +34,10 @@
bin_PROGRAMS = gsl-randist gsl-histogram

gsl_randist_SOURCES = gsl-randist.c
-gsl_randist_LDADD = libgsl.la cblas/libgslcblas.la
+gsl_randist_LDADD = libgsl.la

gsl_histogram_SOURCES = gsl-histogram.c
-gsl_histogram_LDADD = libgsl.la cblas/libgslcblas.la
+gsl_histogram_LDADD = libgsl.la

check_SCRIPTS = test_gsl_histogram.sh
TESTS = test_gsl_histogram.sh
@@ -56,6 +55,8 @@
-e 's|@address@hidden|$(includedir)|g' \
-e 's|@address@hidden|$(GSL_CFLAGS)|g' \
-e 's|@address@hidden|$(GSL_LIBS)|g' \
+ -e 's|@address@hidden|$(CBLAS_CFLAGS)|g' \
+ -e 's|@address@hidden|$(CBLAS_LIBS)|g' \
-e 's|@address@hidden|$(LIBS)|g' \
-e 's|@address@hidden|$(VERSION)|g'

diff -Nur gsl-1.14.orig/multifit/Makefile.am
gsl-1.14/multifit/Makefile.am
--- gsl-1.14.orig/multifit/Makefile.am 2010-04-09 02:04:47.000000000
+0100
+++ gsl-1.14/multifit/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -13,8 +13,8 @@
TESTS = $(check_PROGRAMS)

test_SOURCES = test.c
-test_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la
../permutation/libgslpermutation.la ../blas/libgslblas.la
../cblas/libgslcblas.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la
../sys/libgslsys.la
+test_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la
../permutation/libgslpermutation.la ../blas/libgslblas.la
@CBLAS_LINK_LIBS@ ../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la

likewise
#demo_SOURCES = demo.c
-#demo_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la
../permutation/libgslpermutation.la ../blas/libgslblas.la
../cblas/libgslcblas.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../randist/libgslrandist.la ../rng/libgslrng.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la
../sys/libgslsys.la
+#demo_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la
../permutation/libgslpermutation.la ../blas/libgslblas.la
@CBLAS_LINK_LIBS@ ../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../randist/libgslrandist.la
../rng/libgslrng.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
likewise

diff -Nur gsl-1.14.orig/multimin/Makefile.am
gsl-1.14/multimin/Makefile.am
--- gsl-1.14.orig/multimin/Makefile.am 2010-04-09 02:04:47.000000000
+0100
+++ gsl-1.14/multimin/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -13,8 +13,8 @@
TESTS = $(check_PROGRAMS)

test_SOURCES = test.c test_funcs.c test_funcs.h
-test_LDADD = libgslmultimin.la ../min/libgslmin.la
../poly/libgslpoly.la ../blas/libgslblas.la ../cblas/libgslcblas.la
../linalg/libgsllinalg.la ../permutation/libgslpermutation.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_LDADD = libgslmultimin.la ../min/libgslmin.la
../poly/libgslpoly.la ../blas/libgslblas.la @CBLAS_LINK_LIBS@
../linalg/libgsllinalg.la ../permutation/libgslpermutation.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la

likewise
#demo_SOURCES = demo.c
-#demo_LDADD = libgslmultimin.la ../min/libgslmin.la
../blas/libgslblas.la ../cblas/libgslcblas.la
../linalg/libgsllinalg.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
../utils/libutils.la
+#demo_LDADD = libgslmultimin.la ../min/libgslmin.la
../blas/libgslblas.la @CBLAS_LINK_LIBS@ ../linalg/libgsllinalg.la
../matrix/libgslmatrix.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la

likewise
diff -Nur gsl-1.14.orig/multiroots/Makefile.am
gsl-1.14/multiroots/Makefile.am
--- gsl-1.14.orig/multiroots/Makefile.am 2010-04-09 02:04:46.000000000
+0100
+++ gsl-1.14/multiroots/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -15,5 +15,5 @@
TESTS = $(check_PROGRAMS)

test_SOURCES = test.c test_funcs.c test_funcs.h
-test_LDADD = libgslmultiroots.la ../linalg/libgsllinalg.la
../blas/libgslblas.la ../cblas/libgslcblas.la
../permutation/libgslpermutation.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
../utils/libutils.la
+test_LDADD = libgslmultiroots.la ../linalg/libgsllinalg.la
../blas/libgslblas.la @CBLAS_LINK_LIBS@
../permutation/libgslpermutation.la ../matrix/libgslmatrix.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
../utils/libutils.la
likewise

diff -Nur gsl-1.14.orig/ode-initval/Makefile.am
gsl-1.14/ode-initval/Makefile.am
--- gsl-1.14.orig/ode-initval/Makefile.am 2010-04-09
02:04:47.000000000 +0100
+++ gsl-1.14/ode-initval/Makefile.am 2010-04-09 02:19:59.000000000 +0100
@@ -12,7 +12,7 @@

TESTS = $(check_PROGRAMS)

-test_LDADD = libgslodeiv.la ../linalg/libgsllinalg.la
../blas/libgslblas.la ../cblas/libgslcblas.la
../matrix/libgslmatrix.la ../permutation/libgslpermutation.la
../vector/libgslvector.la ../block/libgslblock.la
../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la
../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
../utils/libutils.la
+test_LDADD = libgslodeiv.la ../linalg/libgsllinalg.la
../blas/libgslblas.la @CBLAS_LINK_LIBS@ ../matrix/libgslmatrix.la
../permutation/libgslpermutation.la ../vector/libgslvector.la
../block/libgslblock.la ../complex/libgslcomplex.la
../ieee-utils/libgslieeeutils.la ../err/libgslerr.la
../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la


likewise

Cheers,
Peter


--
Dr. Christoph Junghans
Max Planck Institute for Polymer Research
Theory Group
POBox 3148
D 55021 Mainz, Germany

Phone: +49 6131 379 335
Web: http://www.mpip-mainz.mpg.de/~junghans




reply via email to

[Prev in Thread] Current Thread [Next in Thread]