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: Peter Johansson
Subject: Re: [Bug-gsl] [bug #33040] libgsl should be linked against libgslcblas
Date: Sun, 10 Apr 2011 19:27:41 -0400
User-agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9

Hi Christoph,

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 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.

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]

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




reply via email to

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