[Top][All Lists]
[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