https://wiki.octave.org/wiki/api.php?action=feedcontributions&user=Ederag&feedformat=atomOctave - User contributions [en]2024-03-28T23:06:02ZUser contributionsMediaWiki 1.39.2https://wiki.octave.org/wiki/index.php?title=Talk:Octave_and_separate_toolchain&diff=12573Talk:Octave and separate toolchain2020-01-20T15:29:39Z<p>Ederag: </p>
<hr />
<div>Isn't [[MXE]] Octave doing the job of compiling the whole toolchain, even if there exists one on a Linux distribution? At least this was the point I found annoying and decided to create a more "lightweight" solution especially for the 64 bit indexing. https://github.com/siko1056/GNU-Octave-enable-64<br />
<br />
- The page needs transposition to current versions, but nothing changed much.<br />
This page shows how to build any gcc toolchain, with perfect control of any details, which is not covered by mxe IIURC.<br />
Agreed that mxe looks simpler and should be recommended. [Ederag]<br />
<br />
:The talk function of this wiki is hardly used. Consider using the Octave mailing-lists if you want more feedback than only by me ;-) Sure, I just marked the page as outdated, that no one gets the idea it actually builds a state-of-the art Octave. If you want to maintain this page, feel free to do so and remove the badge of the top of the page. [[User:Siko1056|Siko1056]] ([[User talk:Siko1056|talk]]) 07:04, 20 January 2020 (PST)<br />
<br />
:: Thanks, I fully agree with keeping the warning. The wording has just been [[Special:Diff/12571|edited]]. [[User:Ederag|Ederag]] ([[User talk:Ederag|talk]]) 07:29, 20 January 2020 (PST)</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=12571Octave and separate toolchain2020-01-20T13:11:22Z<p>Ederag: </p>
<hr />
<div>{{Warning|This page is outdated (October 2019). For a simpler approach on building GNU Octave using a separate toolchain, see [[MXE]].}}<br />
<br />
Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though. Or use [[MXE]].<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the latest version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2_Makeconf.patch<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
The following - facultative - command avoids warnings like {{codeline|libtool: warning: '/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgomp.la' seems to be moved}}<br />
<br />
sudo find /usr/local/gcc-6.2.0_binutils-2.27_isl -name "*.la" -exec sed -i 's:/lib64/../lib64:/lib64:g' {} \; -print<br />
<br />
which will replace all unnecessary {{codeline|/lib64/../lib64}} by {{codeline|/lib64}}.<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/octave/octave-4.2.0.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0.tar.lz<br />
cd octave-4.2.0<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
Done.<br />
<br />
[[Category:Outdated pages]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Talk:Octave_and_separate_toolchain&diff=12570Talk:Octave and separate toolchain2020-01-20T13:06:50Z<p>Ederag: </p>
<hr />
<div>Isn't [[MXE]] Octave doing the job of compiling the whole toolchain, even if there exists one on a Linux distribution? At least this was the point I found annoying and decided to create a more "lightweight" solution especially for the 64 bit indexing. https://github.com/siko1056/GNU-Octave-enable-64<br />
<br />
- The page needs transposition to current versions, but nothing changed much.<br />
This page shows how to build any gcc toolchain, with perfect control of any details, which is not covered by mxe IIURC.<br />
Agreed that mxe looks simpler and should be recommended. [Ederag]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=GraphicsMagick&diff=10577GraphicsMagick2017-12-14T18:16:34Z<p>Ederag: clarify not for plots; keep the most frequent warning message, to bring searches here.</p>
<hr />
<div>Octave will use [http://www.graphicsmagick.org/ GraphicsMagick] for reading and writing your images (not for plots, only used for image processing). This means that the GraphicsMagick configuration you have on you system will determine what your Octave installation can do. Most systems will have it on their own repositories. Unfortunately, their configuration is not always the best for image analysis as it can limit the bit depth when reading and writing of images.<br />
<br />
To solve the problem, GraphicsMagick needs to be rebuilt with the appropriate settings. See below for tracking dependencies and the reasoning behind each flag. Once done, the following commands should work to build GraphicsMagick.<br />
<pre><br />
./configure --with-quantum-depth=16 --enable-shared --disable-static --with-magick-plus-plus=yes<br />
make<br />
make check<br />
sudo make install<br />
</pre><br />
{{Note|if after the build, you get "''error while loading shared libraries: libGraphicsMagick.so.3: cannot open shared object file: No such file or directory''" you need to run ldconfig. For security and performance reasons, Linux maintains a cache of the shared libraries installed in "approved" locations and this command will update it.}}<br />
<br />
== Quantum depth ==<br />
The most common problem is the following warning when using {{Codeline|imread()}} or {{Codeline|imwrite()}}:<br />
<pre>warning: your version of GraphicsMagick limits images to <N> bits per pixel</pre><br />
...where {{codeline|N}} can be 8, 16 or 32. <br />
For instance:<br />
<pre>warning: your version of GraphicsMagick limits images to 8 bits per pixel</pre><br />
This warning means that GraphicsMagick was compiled with {{Codeline|--with-quantum-depth <N>}}, which implements that limitation. The [http://www.graphicsmagick.org/INSTALL-unix.html INSTALL-unix page] of GraphicsMagick documentation explains the rationale of this option.<br />
<br />
There are several bug reports requesting package maintainers to compile GraphicsMagick with higher values. You should not create a new bug; instead look for open bugs for your system, and leave a comment there. For convenience, here are the links for the bugs reported against [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557879 Debian], [https://bugs.launchpad.net/ubuntu/+source/graphicsmagick/+bug/696215 Ubuntu], and [https://bugzilla.redhat.com/show_bug.cgi?id=996411 Fedora].<br />
<br />
As versions with higher values are not available on the repositories, there are two ways to address this. The easiest is to suppress the warning, as suggested in the [https://savannah.gnu.org/bugs/?45662 relevant bug report], if you know it won't affect your code. To do this, add the following command to your script:<br />
<br />
<pre>warning('off', 'Octave:GraphicsMagic-Quantum-Depth');</pre><br />
<br />
The proper solution is to compile GraphicsMagick yourself, to pass the desired value to {{codeline|--with-quantum-depth}}. You will also need to recompile Octave to use the freshly compiled Magick++ library.<br />
<br />
{{warning|Increasing quantum depth may have a dramatic increase in memory usage. If you use QuantumDepth 32, all images will be read with that precision, even if they were saved with 8bit. This means that a 100MB 8bit image will temporarily take 400MB memory, or more if the image was compressed (and they usually are), before Octave resizes it back down to 100MB. Because of this, because images using 32 bit integers are rare, and because GraphicsMagick does not handle floating point, it's recommended to use QuantumDepth of 16.}}<br />
<br />
== Magick++ ==<br />
Magick++ is the C++ application programming interface to GraphicsMagick. This is what Octave uses so you will need this when compiling GraphicsMagick. This will be enabled by default but if you don't have a C++ compiler installed (such as g++) GraphicsMagick will build just fine without a warning, just a small note during the run of configure.<br />
<br />
== Shared libraries ==<br />
The default is to disable shared libraries but that won't work with Octave. You will need to pass the {{Codeline|--enable-shared}} option. If you do not, Octave will give the following warning when running configure:<br />
<pre>GraphicsMagick++ library fails tests. The imread function for reading image files will not be fully functional.</pre><br />
<br />
== Dependencies ==<br />
Compiling from source means tracking the dependencies yourself which may be a kind of painful. There's no wiki for GraphicsMagick so the following table hopes to makes things easier. Note however that this is the list of all dependencies and suggestions. For Octave purposes only, you definetely will not need all of these.<br />
<br />
To start with you will obviously need the following<br />
* a C compiler such as gcc<br />
* a C++ compiler such as g++<br />
* make<br />
<br />
=== Main dependencies ===<br />
These are the ones which support being enabled or disabled via the configure script options and are shown in the summary status at the end of the configure script run. You will need them at compile time.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Dependency !! Debian Wheezy !! Ubuntu Precise !! OpenSUSE 13.2<br />
|-<br />
| BZLIB || libbz2-dev || libbz2-dev || libbz2-devel<br />
|-<br />
| FlashPIX || || ||<br />
|-<br />
| FreeType 2.0 || libfreetype6-dev || libfreetype6-dev || freetype2-devel<br />
|-<br />
| Ghostscript || ghostscript || ghostscript ||<br />
|-<br />
| Ghostscript-fonts || gsfonts || gsfonts ||<br />
|-<br />
| JBIG || libjbig-dev || || libjbig-devel<br />
|-<br />
| JPEG v1 || libjpeg8-dev || libjpeg-dev || libjpeg62-devel<br />
|-<br />
| JPEG-2000 || libjasper-dev || libjasper-dev || libjasper-devel<br />
|-<br />
| LCMS v2 || liblcms2-dev || liblcms2-dev || liblcms2-devel<br />
|-<br />
| ltdl || libltdl-dev || libltdl-dev || libtool<br />
|-<br />
| LZMA || liblzma-dev || liblzma-dev || xz-devel<br />
|-<br />
| PNG || libpng12-dev || libpng12-dev || libpng12-devel<br />
|-<br />
| TIFF || libtiff5-dev || libtiff5-dev || libtiff-devel<br />
|-<br />
| WEBPD || libwebp-dev || || libwebp-devel<br />
|-<br />
| WMF || libwmf-dev || libwmf-dev || libwmf-devel<br />
|-<br />
| X11 || libx11-dev libxext-dev libsm-dev || || <br />
|-<br />
| XML || libxml2-dev || libxml2-dev || libxml2-devel<br />
|-<br />
| ZLIB || zlib1g-dev || zlib1g-dev || zlib-devel<br />
|-<br />
|}<br />
<br />
{{Note|the following libraries are not listed because:<br />
* Trio is only needed/useful on certain archaic systems which lack secure vsnprintf variants.<br />
* DPS has been [http://dps.sourceforge.net/ deprecated] and should not be used.<br />
* Ghostscript library support is not recommended by GraphicsMagick on Unix type systems. Read their README.txt file.<br />
* there are both v1 and v2 LCMSlibraries but GraphicsMagick only needs one of them.<br />
}}<br />
<br />
=== Other dependencies ===<br />
These other dependendies are easily added via a user-editable text file after building and installation. They are much more specific and most users will have no need for them.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Dependency !! Debian Wheezy !! Ubuntu Precise<br />
|-<br />
| dcraw || dcraw || dcraw<br />
|-<br />
| dvips || texlive-base || texlive-base<br />
|-<br />
| dot || graphviz || graphviz<br />
|-<br />
| fig2dev || transfig || transfig<br />
|-<br />
| gnuplot || gnuplot || gnuplot<br />
|-<br />
| hp2xx || hp2xx || hp2xx<br />
|-<br />
| html2ps || html2ps || html2ps<br />
|-<br />
| lp || cups-client || cups-client<br />
|-<br />
| lpr || cups-bsd || cups-bsd<br />
|-<br />
| mpeg2decode || ||<br />
|-<br />
| mpeg2encode || ||<br />
|-<br />
| pgpv || pgpgpg || pgpgpg<br />
|-<br />
| povray || ||<br />
|-<br />
| ra_ppm || radiance || radiance<br />
|-<br />
| rawtorle || ||<br />
|-<br />
| scanimage || sane-utils || sane-utils<br />
|-<br />
|}</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=10477Octave and separate toolchain2017-08-12T22:25:53Z<p>Ederag: /* qrupdate */ qrupdate-1.1.2.tar.gz => qrupdate-1.1.2_Makeconf.patch</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the latest version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2_Makeconf.patch<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
The following - facultative - command avoids warnings like {{codeline|libtool: warning: '/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgomp.la' seems to be moved}}<br />
<br />
sudo find /usr/local/gcc-6.2.0_binutils-2.27_isl -name "*.la" -exec sed -i 's:/lib64/../lib64:/lib64:g' {} \; -print<br />
<br />
which will replace all unnecessary {{codeline|/lib64/../lib64}} by {{codeline|/lib64}}.<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/octave/octave-4.2.0.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0.tar.lz<br />
cd octave-4.2.0<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
Done.<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=10476Octave and separate toolchain2017-08-12T21:08:31Z<p>Ederag: /* qrupdate */ typo</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the latest version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
The following - facultative - command avoids warnings like {{codeline|libtool: warning: '/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgomp.la' seems to be moved}}<br />
<br />
sudo find /usr/local/gcc-6.2.0_binutils-2.27_isl -name "*.la" -exec sed -i 's:/lib64/../lib64:/lib64:g' {} \; -print<br />
<br />
which will replace all unnecessary {{codeline|/lib64/../lib64}} by {{codeline|/lib64}}.<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/octave/octave-4.2.0.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0.tar.lz<br />
cd octave-4.2.0<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
Done.<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9673Octave and separate toolchain2016-11-18T17:42:45Z<p>Ederag: /* Octave itself */ update to octave-4.2.0</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
The following - facultative - command avoids warnings like {{codeline|libtool: warning: '/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgomp.la' seems to be moved}}<br />
<br />
sudo find /usr/local/gcc-6.2.0_binutils-2.27_isl -name "*.la" -exec sed -i 's:/lib64/../lib64:/lib64:g' {} \; -print<br />
<br />
which will replace all unnecessary {{codeline|/lib64/../lib64}} by {{codeline|/lib64}}.<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/octave/octave-4.2.0.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0.tar.lz<br />
cd octave-4.2.0<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
Done.<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9672Octave and separate toolchain2016-11-18T17:00:55Z<p>Ederag: /* Octave itself */ replace /lib64/../lib64 by /lib64</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
The following - facultative - command avoids warnings like {{codeline|libtool: warning: '/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgomp.la' seems to be moved}}<br />
<br />
sudo find /usr/local/gcc-6.2.0_binutils-2.27_isl -name "*.la" -exec sed -i 's:/lib64/../lib64:/lib64:g' {} \; -print<br />
<br />
which will replace all unnecessary {{codeline|/lib64/../lib64}} by {{codeline|/lib64}}.<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc4.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc4.tar.lz<br />
cd octave-4.2.0-rc4<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9666Octave and separate toolchain2016-11-17T19:41:01Z<p>Ederag: /* GraphicsMagick */ move -L... to LDFLAGS</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc4.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc4.tar.lz<br />
cd octave-4.2.0-rc4<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9665Octave and separate toolchain2016-11-17T19:34:55Z<p>Ederag: /* FFTW */ move -L... to LDFLAGS</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc4.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc4.tar.lz<br />
cd octave-4.2.0-rc4<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9664Octave and separate toolchain2016-11-17T18:08:08Z<p>Ederag: /* arpack-ng */ move -L... to LDFLAGS</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc4.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc4.tar.lz<br />
cd octave-4.2.0-rc4<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9663Octave and separate toolchain2016-11-17T18:02:33Z<p>Ederag: /* OpenBLAS */ move -L... to LDFLAGS</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native" CXXFLAGS="-O2 -march=native" FFLAGS="-O2 -march=native" LDFLAGS="-L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 -Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc4.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc4.tar.lz<br />
cd octave-4.2.0-rc4<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...<br />
<br />
[[Category:Building]]</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9642Octave and separate toolchain2016-11-11T12:34:26Z<p>Ederag: /* Octave itself */ rc3 => rc4</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc4.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc4.tar.lz<br />
cd octave-4.2.0-rc4<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Bug_Fix_List_-_4.2.0_Release&diff=9641Bug Fix List - 4.2.0 Release2016-11-10T10:38:05Z<p>Ederag: /* Patches reviewed by "non-committing" developers */ bug fixed</p>
<hr />
<div>The following bugs must be fixed prior to the next release. See also the [[4.2.0 Release Checklist]] .<br />
<br />
Sign up for a bug by filling in the Owner field so people won't duplicate each other's work.<br />
<br />
Use <pre><strike> ... </strike></pre> to cross an item off the list when it has been done. Add <pre>WON'T FIX</pre> and the strike through tag for any bugs that will not be fixed in this round.<br />
<br />
<div class="tocinline">__TOC__</div><br />
<br />
== Bugs marked as Crash ==<br />
<br />
(Some of these crashes seem to appear only on a few systems. Please check which your system(s) can reproduce.)<br />
<br />
* <strike>Owner: jwe {{bug|48574}} With GCC 6.x, an error in an onCleanup function causes Octave to crash</strike><br />
<br />
* <strike>Owner: ??? {{bug|45366}} Two objects not cleaning dynamically allocated widgets leading to crash at exit -- patch supplied</strike><br />
<br />
* <strike>Owner: ??? {{bug|47837}} Segmentation fault with missing warning state "all"</strike><br />
<br />
* Owner: ??? {{bug|47927}} Ctrl+C crashes Octave on MacOS<br />
<br />
* Owner: ??? {{bug|47914}} segfault with OpenGL patches and address sanitizer<br />
<br />
* <strike> Owner: ??? {{bug|47650}} octave crashed while plotting many functions </strike><br />
<br />
* <strike> {{bug|46501}} Crash running uimenu code under Qt </strike><br />
<br />
* Owner: ??? {{bug|46349}} dblquad/triplequad - periodic functions over the whole period [hang, not crash]<br />
<br />
* <strike> {{bug|46315}} Assertion Failed - profiler crash on every 2nd time execution halts </strike><br />
<br />
* <strike> Owner: ??? {{bug|45863}} Octave crashes when clicking on polar plot using OpenGL </strike><br />
<br />
* <strike> Owner: ??? {{bug|45577}} Solving systems using complex NaN causes crash </strike><br />
<br />
* WON'T FIX <strike>Owner: ??? {{bug|44823}} Segfault when using HD Graphics 6000 on Fedora 21</strike><br />
<br />
=== Windows ===<br />
<br />
* Owner: ??? {{bug|39000}} Can't override BLAS XERBLA handler on Windows<br />
<br />
* Owner: ??? {{bug|44470}} Pause does not detect Ctrl+C keystroke in Windows GUI<br />
<br />
* Owner: ??? {{bug|45860}} Many stacked uipanels crashes the qt gui in Windows 8<br />
<br />
* WON'T FIX <strike>Owner: ??? {{bug|47840}} exec segfaults on Windows</strike><br />
<br />
* <strike> Owner: ??? {{bug|46476}} Octave 4.0.0 crashes on plot </strike><br />
<br />
* <strike> Owner: ??? {{bug|45297}} GUI crash when calling scatter (x, y, [], color) with Windows 8.1 (Anyone with Win 8.1 to reproduce this? If not, skip it.) </strike><br />
<br />
* WON'T FIX <strike>Owner: ??? {{bug|47445}} Settng colours for too many plots causes Segmentation violation (Anyone with Win 8 to reproduce this? If not, skip it.)</strike><br />
<br />
* <strike>Owner: ??? {{bug|45634}} Octave 4.0.0 GUI crashes on first-time use</strike><br />
<br />
* <strike> Owner: ??? {{bug|45604}} Windows XP Octave 4.0.0 plot crashes </strike><br />
<br />
== Bugs marked Configuration and Build System ==<br />
<br />
* Owner: ??? {{bug|48380}} Binary versions of several Octave-Forge packages fail to build with MXE<br />
<br />
* NEED INFO {{bug|41574}} Current build approach causes mkoctfile to link to too many libraries on the Mac -- patch posted<br />
<br />
* Owner: ??? {{bug|44979}} check for osmesa is done at runtime and not configure -- Someone should check if this is easy<br />
<br />
* <strike> Owner: jwe {{bug|48139}} New warnings about deprecated functions when building liboctave -- minor but should be easy to fix </strike><br />
<br />
* <strike>Owner: ??? {{bug|45399}} build failure with multiple flex source files using gcc Link Time Optimization (LTO) -- patch submitted. Marked "minor", but easy fix. </strike><br />
<br />
* <strike>Owner: ??? {{bug|47971}} "make clean; make" fails on missing oct-conf-post.h</strike><br />
<br />
* <strike>Owner: ??? {{bug|47576}} mxe-octave: octave-4.0.1-installer.exe (32bit) does not install on Windows 10 -- ready for test </strike><br />
<br />
* <strike>Owner: ??? {{bug|47858}} Building with hdf5-1.10 fails due to changed variable type -- patch posted</strike><br />
<br />
* <strike>Owner: JWE {{bug|48319}} Development source build failure related to LONG_DOUBLE_ROUNDING in oct-inttypes.cc</strike><br />
<br />
* <strike>Owner: ??? {{bug|46063}} Build system re-makes certain files 2 or even 3 times</strike><br />
<br />
* WON'T FIX <strike> Owner: ??? {{bug|46758}} mxe-octave: octave-logo.ico is cropped not scaled due to rsvg-convert bug </strike><br />
<br />
* <strike>Owner: ??? {{bug|45646}} files in source distribution should not be deleted on "clean" or "distclean" -- is marked as "minor", but sounds important for a release</strike><br />
<br />
* <strike>Owner: ??? {{bug|47617}} mxe-octave: instrument-control package not installed correctly in official release -- this looks simple; is it?</strike><br />
<br />
* <strike>Owner: ??? {{bug|48340}} parallel package fails to build with dev octave</strike><br />
<br />
== Bugs with severity >= 4 ==<br />
* POSTPONED <strike> Owner: ??? {{bug|44916}} --softwareopengl option for performance </strike><br />
* Owner: ??? {{bug|37672}} CTRL+C interrupt processing causes segfaults -- patch posted<br />
* Owner: ??? {{bug|47400}} panic on Ctrl+c with multithreaded ATLAS or OpenBLAS -- patch posted<br />
* <strike> {{bug|41567}} error in qr -- patch posted </strike><br />
* <strike> Owner: ??? {{bug|43098}} "if (array)" should raise a warning, and give the same result for dense and sparse -- patch posted </strike><br />
* Owner: ??? {{bug|47676}} Cannot apply computed assignment to a variable defined after the code was parsed (e.g., in a script) -- workaround patch posted<br />
* Owner: ??? {{bug|39000}} Can't override BLAS XERBLA handler on Windows<br />
* POSTPONED {{bug|42469}} GUI crashes on international character after autocompletion -- upstream scintilla bug. Can we work around it?<br />
* <strike> {{bug|44335}} Use consistent wording for "contribute" vs "donate" -- patch posted </strike><br />
* <strike> Owner: [[User:siko1056]] {{bug|46330}} segfault with matrices containing Inf & NaN -- patch posted </strike><br />
* <strike> Owner: ??? {{bug|47543}} segfault with warnings disabled in subfunction when all warnings disabled globally -- patch posted </strike><br />
<br />
== Bugs marked as regressions ==<br />
* owner (???) {{bug|41574}} Current build approach causes mkoctfile to link to too many libraries on the Mac -- patch posted<br />
<br />
* owner (???) {{bug|44498}} isvector: Always returns true for objects from user defined classes -- patch submitted<br />
<br />
* owner (???) {{bug|47337}} [Windows] fltk toolkt: infinite loop "GL2PS warning: Unknown token in buffer" when printing -- infinite loop is almost as bad as a crash<br />
<br />
* <strike> owner (???) {{bug|47756}} [ode suit] integrate_adaptive fails with vertical tspan -- patch posted </strike><br />
<br />
* owner (???) {{bug|44152}} print("plot_file.pdf") generates warning message -- trivial fix<br />
<br />
* owner (???) {{bug|36743}} Octave:language-extension warning warns about Octave's own files -- old bug, but the inability to warn of automatic broadcast is a regression.<br />
<br />
* <strike>owner (???) {{bug|45507}} acos returns different results on big input values on gcc 4.8</strike><br />
<br />
* <strike>owner (???) {{bug|43559}} "hold on" causes "plot" to use incorrect series colouring -- patch posted</strike><br />
<br />
* <strike>owner (???) {{bug|46522}} clear all does not fix shadowed "help"</strike> -- (Three of us can no longer reproduce this.)<br />
<br />
* <strike> owner (???) {{bug|48296}} demo hangs with subplot and pager -- patch posted </strike><br />
<br />
* <strike>owner (???) {{bug|47571}} Problem with umlaut in command line</strike> -- I think no code change is needed; just compiling Windows binary of 4.2.0 in a UTF-8 environment<br />
<br />
* WONT'T FIX <strike> owner (???) {{bug|46645}} Can't load struct variables that use arbitrary fieldnames -- may be too hard </strike><br />
<br />
== Bugs marked GUI ==<br />
<br />
== Bugs related to Windows OS ==<br />
* Owner: ??? {{bug|42036}} Files and directories with non-ASCII characters not handled correctly on Windows<br />
* Owner: ??? {{bug|43099}} utf-8 files: editor, command windows issues, workspace pane shows correctly<br />
<br />
== Other Bugs with Patches ==<br />
<br />
=== Patches reviewed by "non-committing" developers ===<br />
* Reviewer: Lachlan {{bug|39014}} Wrong determinant for some (large) matrices<br />
* Reviewer: Lachlan {{bug|32756}} Ignore unknown datatypes in HDF5 files but load remainder of file correctly<br />
* Reviewer: Lachlan {{bug|45972}} Anonymous function handles with varargin are not correctly saved.<br />
* <strike>Reviewer: Lachlan {{bug|37613}} Octave precision/accuracy is much lower for quadgk</strike><br />
* Reviewer: Lachlan {{bug|40904}} WHAT function should return all available results for MATLAB compatibility<br />
<br />
=== Unreviewed patches that seem (to LA) worth reviewing ===<br />
* <strike> Owner: ??? {{bug|46136}} error messages for stacks of anonymous functions not informative enough </strike><br />
* <strike> Owner: ??? {{bug|47756}} [ode suit] integrate_adaptive fails with vertical tspan -- One-line patch. Who knows the ode suite? </strike><br />
* Owner: ??? {{bug|46008}} Help function fails to return help header for subfunctions and nested functions<br />
* Owner: ??? {{bug|36646}} Statistics tests produce errors and warnings when var(sample) == 0 -- patch only fixes some functions, but better than none.<br />
* Owner: ??? {{bug|46852}} smarter diagnostic message when a user variable shadows a function definition<br />
* <strike> {{bug|46912}} qr not working as described && related {{bug|41567}} qr fails with two matrix inputs </strike><br />
* Owner: ??? {{bug|45969}} Inner scopes of nested anonymous function definitions are not saved.<br />
* Owner: ??? {{bug|45903}} pkg rebuild -global fails if package directory does not exist<br />
* Owner: ??? {{bug|42561}} gnuplot error on "demo trimesh"<br />
* Owner: ??? {{bug|41742}} The rand function occasionally returns unexpected results.<br />
* Owner: ??? {{bug|39036}} line(X, Y) draws no lines<br />
* Owner: ??? {{bug|38483}} qp() fails with empty inequality constraints<br />
* POSTPONED <strike> Owner: ??? {{bug|46236}} GUI Workspace - use same column headings as Matlab '''Reviewed by: jwe''' </strike><br />
* Owner: ??? {{bug|47800}} gammainc(x,a,"upper") rounds down to zero if output is below eps<br />
* Owner: ??? {{bug|42671}} [PATCH] corr() does not have p-values output, returns 1.0 with one observation.<br />
<br />
=== Feature requests ===<br />
<br />
* Owner: ??? {{bug|45497}} missing function: repelem && dependent patch {{bug|46385}} Can't Repmat Structure Arrays -- The second bug could be fixed without the first, but the proposed patch uses repelem.<br />
* Owner: Lachlan {{bug|41215}} Request for a "pkg test" feature && related {{bug|41298}} pkg install: automatically extract %!tests and install both extracted and fixed test files<br />
* Owner: ??? {{bug|47824}} No Matlab-compatible corrcoef<br />
* Owner: ??? {{bug|36372}} Improved ranks.m included<br />
<br />
=== Lachlan's patches -- someone impartial can triage these :) ===<br />
* <strike>Owner: ??? {{bug|46458}} tab completion does not work for the elements of a struct when that struct is a cell of a cell array</strike><br />
* <strike>Owner: ??? {{bug|48317}} tab autocomplete doesn't complete local functions</strike><br />
* <strike>Owner: ??? {{bug|47950}} glob and dir functions are unable to escape square bracket characters in Windows</strike><br />
* <strike>Owner: ??? {{bug|47414}} Folding editor text breaks cursor movement</strike><br />
* Owner: ??? {{bug|46859}} floating point error in range results in non-integer value -- patch warns of error, rather than fixing it.<br />
* <strike> Owner: ??? {{bug|48315}} cov.m: Incorrect result </strike><br />
* Owner: ??? {{bug|46660}} object array writing into class member alters another class member<br />
* <strike>Owner: ??? {{bug|48044}} Searching for markers does not wrap</strike><br />
* <strike>Owner: ??? {{bug|48292}} dbstop marker obscures bookmarks</strike><br />
* Owner: ??? {{bug|47173}} mtimes allows arguments with >= 3 dimensions -- a patch deep in core, so it needs careful review.<br />
* <strike> Owner: ??? {{bug|39349}} funny output from help .' </strike><br />
* <strike> {{bug|46632}} Breakpoints and program counter arrow aren't cleared in some cases </strike><br />
* Owner: ??? {{bug|43925}} isscalar behaves incorrectly for some user-defined classes<br />
* <strike> Owner: ??? {{bug|36015}} unexpected sqp error </strike><br />
<br />
=== Other bug reports tagged as "patch submitted" ===<br />
* Owner: ??? {{bug|40095}} Clearvar function not implemented (LA vote: unsure)<br />
* <strike> Owner: ??? {{bug|44336}} warning ("error", "all") changes "matlab-compatible" warnings if there's an "all" status before </strike><br />
* Owner: ??? {{bug|32839}} pkg build/install does not work with directories<br />
* Owner: ??? {{bug|32008}} sqp: Don't set upper/lower bound unless specified -- clarification requested<br />
* <strike> Owner: ??? {{bug|44727}} editor: breakpoints are confused after file is changed -- will be fixed by patch for {{bug|46332}}. </strike><br />
* Owner: ??? {{bug|45542}} griddatan unable to perform 4-dimensional interpolation. -- diff requested<br />
* Owner: ??? {{bug|44503}} 'set (gca, camera.......)' doesn't update 3D plots<br />
<br />
== Other Bugs ==<br />
<br />
<br />
<br />
== Potentially excluded bugs ==<br />
These bugs have been provisionally decided not to be blockers for 4.2.0. That doesn't mean they can't be fixed, if someone wants to fix them.<br />
<br />
=== Bugs marked as Crash ===<br />
<br />
=== Other bugs marked as crash in Savannah ===<br />
* POSTPONED <strike> Owner: ??? {{bug|47958}} GUI freezes when starting debug with a partly drawn Qt figure (LA vote: unsure) </strike><br />
* WON'T FIX <strike> Owner: ??? {{bug|42118}} COW memory issues when extracting small slices from large arrays (LA vote: unsure) </strike><br />
* Owner: ??? {{bug|40044}} *** glibc detected *** gnuplot: double free or corruption (fasttop): 0x08d72878 *** (LA vote: not necessary)<br />
* WON'T FIX <strike> Owner: ??? {{bug|40608}} MinGW: crashes with JIT (LA vote: not necessary) </strike><br />
* POSTPONED <strike> Owner: ??? {{bug|41213}} JIT segfaults on non-x86 processors (LA vote: not necessary) </strike><br />
* Owner: ??? {{bug|42429}} @ftp/dir crashes Octave (LA vote: not necessary)<br />
* Owner: ??? {{bug|44478}} test __osmesa_print__.cc-tst crashes with Nvidia drivers (LA vote: not necessary)<br />
* POSTPONED <strike> Owner: ??? {{bug|46192}} JIT compiler fails in jit.tst and aborts Octave (LA vote: not necessary) </strike><br />
* <strike> Owner: ??? {{bug|46926}} saveas() crashes Octave (LA vote: not necessary) </strike><br />
* Owner: ??? {{bug|47620}} segfault when using eval and anoymous function (LA vote: not necessary)<br />
* WON'T FIX <strike> Owner: ??? {{bug|47827}} "Ctrl+1" shortcut crashes the GUI (LA vote: not necessary) </strike><br />
* Owner: ??? {{bug|48078}} signal package: crash in remez with close frequency band values + differentiator (LA vote: not necessary)<br />
* WON'T FIX <strike> Owner: ??? {{bug|48219}} Crash at end of execution of openEMS script (LA vote: not necessary) </strike><br />
* <strike> Owner: ??? {{bug|48284}} Can't make the graphics work on new installation </strike><br />
* <strike> Owner: ??? {{bug|48323}} interval package: segmentation fault in qr function (LA vote: not necessary) </strike><br />
* POSTPONED <strike> Owner: ??? {{bug|41652}} Octave builds but crashes when trying to use gcj for java support (LA vote: not necessary) </strike><br />
<br />
=== Bugs marked configuration and build system in Savannah ===<br />
<br />
'''The following three bugs are minor, but closely related and two go back to 2012'''<br />
* Owner: ??? {{bug|35392}} /etc/octaverc (LA vote: not necessary, but desirable)<br />
* Owner: ??? {{bug|36477}} use XDG dirs instead of HOME (LA vote: not necessary, but desirable)<br />
* Owner: ??? {{bug|40444}} On Windows, config & history files etc. should go to %APPDATA% (LA vote: not necessary, but desirable)<br />
* Owner: ??? {{bug|47886}} Do not link against libraries without OpenGL (LA vote: unsure)<br />
* <strike> Owner: ??? {{bug|41027}} config.h is too generic (LA vote: up to JWE) </strike><br />
* Owner: ??? {{bug|38776}} Tests in private functions cannot be tested directly (LA vote: unnecessary)<br />
* Owner: ??? {{bug|41298}} pkg install: automatically extract %!tests and install both extracted and fixed test files (LA vote: unnecessary; useful for development, not release)<br />
* Owner: ??? {{bug|43298}} llvm libc++ 3.5 fails to resolve the pow(octave_int<int>, octave_Int<int>) function overload (LA vote: unnecessary; old compiler)<br />
* Owner: ??? {{bug|43908}} Some OF packages won't install with 64-bit indexing Octave (unnecessary -- bugs are in Forge, not core)<br />
* Owner: ??? {{bug|45082}} mxe native build fails at gmp (LA vote: unnecessary)<br />
* Owner: ??? {{bug|45188}} MXE: problems installing different Octave versions side by side (LA vote: unnecessary)<br />
* Owner: ??? {{bug|45578}} build failure due to no dependency on libgnu (LA vote: unnecessary)<br />
* Owner: ??? {{bug|45644}} Build system distributes .cc files in include/octave directory (LA vote: relevant to release, but low priority)<br />
* Owner: ??? {{bug|46863}} mxe-octave: build_packages.m not up to date (LA vote: not necessary)<br />
* <strike>Owner: ??? {{bug|47817}} mxe-octave: error while building documentation of dev Octave (not necessary, as docs are pre-built)</strike><br />
* <strike>Owner: ??? {{bug|48172}} doc build fails with texi2dvi/texi2pdf errors on Ubuntu 14.04 (not necessary, as docs are pre-built) </strike><br />
* <strike> Owner: ??? {{bug|39446}} MXE-Octave: LAPACK build mixes MinGW and MSVC (LA vote: not necessary) </strike><br />
* Owner: ??? {{bug|40111}} Support runtime selection of Java version on Linux and Unix systems (LA vote: not necessary)<br />
* <strike> Owner: ??? {{bug|40252}} Make GUI compatible with both Qt4 and Qt5 (LA vote: not necessary) </strike><br />
* Owner: ??? {{bug|41652}} Octave builds but crashes when trying to use gcj for java support (LA vote: not necessary)<br />
* Owner: ??? {{bug|44359}} Save and restore user FFLAGS, add additional options to AM_FFLAGS (LA vote: not necessary)<br />
* Owner: ??? {{bug|34301}} Can't compile oct files using gcc -fvisibility=hidden option (LA vote: not necessary)<br />
* Owner: ??? {{bug|41061}} building with --enable-jit with libllvm 3.5 fails to compile (LA vote: not necessary)<br />
* Owner: ??? {{bug|43343}} Associate .m files to open in Octave editor in macOS (LA vote: not necessary)<br />
* Owner: ??? {{bug|47831}} mercurial build writes files to source tree doc/{interpreter,liboctave} (LA vote: not necessary)<br />
<br />
=== Bugs marked as regression in Savannah ===<br />
* owner (???) {{bug|46047}} Large number of axes ticks for big logarithmic plots (LA vote: unsure)<br />
* owner (???) {{bug|43585}} rectangle wrong axis calculation (LA vote: unsure)<br />
* owner (???) {{bug|38236}} invoking script in demo block to define variables causes errors (LA vote: not necessary)<br />
* owner (???) {{bug|40333}} print with legend modifies axis position (LA vote: not necessary -- didn't block 4.0)<br />
* owner (???) {{bug|44245}} need configurable warning when sprintf format contains integer code, but value is real number (LA vote: not necessary)<br />
* owner (???) {{bug|44829}} Multiple legends not working anymore with plotyy (LA vote: not necessary)<br />
* owner (???) {{bug|45494}} A recent change has broken hist (randn (10000, 1), 30); (LA vote: not necessary)<br />
* owner (???) {{bug|45710}} grid minor and axis tight fail to plot all minor grid lines (LA vote: not necessary)<br />
* owner (???) {{bug|45823}} Empty plot after figure command (FLTK only) (LA vote: not necessary)<br />
* owner (???) {{bug|46011}} Can't warn of automatic broadcasting without triggering {{bug|36743}} (LA vote: not necessary)<br />
* <strike>owner (???) {{bug|46496}} Problems with legend background and labels spacing</strike><br />
* owner (???) {{bug|46516}} Qt plotting, plot overlay ignores plot order -- Windows only (LA vote: not necessary)<br />
* owner (???) {{bug|47415}} out of memory negating a permutation matrix (LA vote: not necessary)<br />
* owner (???) {{bug|47755}} Access to object arrays (LA vote: not necessary -- not sure it is a regression)<br />
* owner (???) {{bug|44934}} classdef parser prints extra newline when failing to parse bad classdef file (LA vote: not necessary)<br />
<br />
=== Patch submitted ===<br />
* Owner: ??? {{bug|41028}} warning off shouldn't affect lastwarn -- (LA vote: not necessary)<br />
* Owner: ??? {{bug|31626}} lsode: patch to make Jacobian types of dlsode.f accessible -- (LA vote: not necessary)<br />
* Owner: ??? {{bug|48095}} GUI configuration files are undocumented (LA vote: not necessary)<br />
* Owner: ??? {{bug|41428}} Add an &~ binary operator (LA vote: note necessary)<br />
* Owner: ??? {{bug|47919}} Error messages for mismatched struct fields is not informative (LA vote: not necessary)<br />
* Owner: ??? {{bug|41088}} add a splash screen (loading is non-instantaneous) (LA vote: not necessary)<br />
* Owner: ??? {{bug|41818}} Fixed up "find" function with templates and fourth parameter (LA vote: not necessary)<br />
<br />
== Patches from Savannah patch collection ==<br />
* Owner: ??? {{patch|9026}} Automatically close if, for, while etc.<br />
* Owner: ??? {{patch|9023}} Tell user about misaligned if/end pairs when an end-related error occurs<br />
* WON'T FIX <strike>Owner: ??? {{patch|9022}} Allow paging of some but not all commands</strike><br />
* <strike> Owner: ??? {{patch|8956}} F3 for "Find Next", shift+F3 for "Find Prev" </strike><br />
* Owner: ??? {{patch|8656}} Variable Editor (expanded from Patch {{patch|8316}})<br />
* Owner: ??? {{patch|9011}} Tests for corefcn/sparse.cc<br />
* Owner: ??? {{patch|8801}} add support for the histogram and histcounts functions -- useful as Matlab is deprecating hist<br />
<br />
* Owner: ??? {{patch|8696}} Use unicode utf-8 rather than Symbol font for gnuplot when possible -- Check, because printing non-ASCII with gnuplot is a known bug<br />
* Owner: ??? {{patch|8367}} Doxygen comments for input.h and cleanup of input.cc<br />
* Owner: ??? {{patch|8303}} vectorized parcellfun and pararrayfun<br />
* Owner: ??? {{patch|8913}} remove zlib from public API<br />
* Owner: ??? {{patch|8491}} Make pkg handle and display (in textmode) package documentation in info format<br />
* Owner: ??? {{patch|8640}} Comments for translators<br />
* Owner: ??? {{patch|8073}} Remove redundant function calls in sqp<br />
* Owner: ??? {{patch|8077}} Alter colloc to handle Laguerre polynomials (see Numerical, items 5,6 on Projects page)<br />
* Owner: ??? {{patch|8607}} New module h5read to read/write HDF5 files<br />
* Owner: Carlo {{patch|8979}} Add two functions to check and set ODE options<br />
<br />
=== Matlab functions, by regular devs ===<br />
* <strike>Owner: ??? {{patch|9048}} Matlab compatible publish function</strike><br />
* <strike> Owner: ??? {{patch|9014}} Add "camlight" function </strike><br />
* <strike> Owner: ??? {{patch|9013}} New function "material" </strike><br />
* <strike> Owner: ??? {{patch|9040}} Add function "lighting" </strike><br />
* <strike> Owner: ??? {{patch|8856}} add function reducevolume </strike><br />
* <strike> Owner: ??? {{patch|8872}} add isocaps </strike><br />
* <strike> Owner: ??? {{patch|8864}} add smooth3 </strike><br />
* Owner: ??? {{patch|7924}} Added two functions: locale() and setlocale()<br />
* <strike> Owner: ??? {{patch|8912}} add function reducepatch </strike><br />
<br />
=== Matlab functions, needing major work ===<br />
* Owner: ??? {{patch|8962}} Working version of expmv<br />
* Owner: ??? {{patch|8541}} isdiag, istriu, istril, isbanded, and bandwidth functions<br />
<br />
=== Other open patches from Savannah ===<br />
* Owner: ??? {{patch|9027}} Allow evalin for arbitrary contexts<br />
* Owner: ??? {{patch|9025}} Concise output of filenames<br />
* Owner: ??? {{patch|9024}} Colour-coded output text<br />
* Owner: ??? {{patch|9012}} Abbreviations as Location input for the legend() command -- patch requested.<br />
* Owner: ??? {{patch|8988}} Adding to index.html of manual, installation/loading commands<br />
* Owner: ??? {{patch|8986}} CDF plot implementation<br />
* Owner: ??? {{patch|8974}} GSOC16 - Improve iterative methods for sparse linear systems<br />
* <strike>Owner: ??? {{patch|8943}} object class "light" for lighting effects on patches and surfaces</strike><br />
* Owner: ??? {{patch|8824}} added affine2d class<br />
* Owner: ??? {{patch|8722}} For image() and imagesc(), added value readout in status bar when mousing over a figure<br />
* Owner: ??? {{patch|8693}} Reimplement operator * (const SparseMatrix& m, const SparseMatrix& a) to use SuiteSparse<br />
* Owner: ??? {{patch|8690}} Alternative implementation of tcdf<br />
* <strike>Owner: ??? {{patch|8526}} avoid conflict with gnu99 stdbool.h -- JWE is cleaning the API. Is this worth it?</strike><br />
* Owner: ??? {{patch|8417}} Consolidate large conditional type decisions -- needs comments<br />
* Owner: ??? {{patch|8314}} Patch to build system to use @rpath for Mac liboctave/libinterp<br />
* Owner: ??? {{patch|8308}} Adds --minimal-dependencies flag to mkoctfile for more portable mex/oct files<br />
* Owner: ??? {{patch|7976}} Make PPKG_ADD and PKG_DEL see both m-file and oct-file directories of a package (2nd post)</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9640Octave and separate toolchain2016-11-01T14:46:14Z<p>Ederag: /* arpack-ng */ add qrupdate, before</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== qrupdate ==<br />
download the lastes version (1.1.2 as of this writing) to $downloads <br />
<br />
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz<br />
cd qrupdate-1.1.2/<br />
<br />
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch<br />
<br />
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre><br />
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200<br />
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200<br />
@@ -1,26 +1,26 @@<br />
# set this to your compiler's executable name (e.g. gfortran, g77)<br />
FC=gfortran<br />
# requested flags<br />
-FFLAGS=-fimplicit-none -O3 -funroll-loops <br />
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran<br />
# set if you need shared library<br />
FPICFLAGS=-fPIC<br />
<br />
# BLAS library (only required for tests)<br />
-BLAS=-lblas<br />
+BLAS=-lopenblas<br />
# LAPACK library (only required for tests)<br />
-LAPACK=-llapack<br />
+LAPACK=<br />
<br />
# Library version<br />
VERSION=1.1<br />
MAJOR=1<br />
<br />
# The default library dir<br />
-LIBDIR=lib<br />
+LIBDIR=lib64<br />
<br />
# Destination installation offset<br />
DESTDIR=<br />
<br />
# set default prefix to /usr/local<br />
ifeq ($(strip $(PREFIX)),)<br />
- PREFIX=/usr/local<br />
+ PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
endif<br />
</pre><br />
}}<br />
<br />
patch -p0 < $downloads/qrupdate-1.1.2.tar.gz<br />
make solib<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install-shlib<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc3.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc3.tar.lz<br />
cd octave-4.2.0-rc3<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9639Octave and separate toolchain2016-11-01T14:18:28Z<p>Ederag: /* Octave itself */ build_ => build-</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc3.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc3.tar.lz<br />
cd octave-4.2.0-rc3<br />
<br />
mkdir build-; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9638Octave and separate toolchain2016-11-01T14:17:24Z<p>Ederag: /* GraphicsMagick */ add fftw section, above</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== FFTW ==<br />
<br />
http://www.fftw.org/<br />
<br />
cd $downloads<br />
wget http://www.fftw.org/fftw-3.3.5.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz<br />
cd fftw-3.3.5/<br />
<br />
=== Single precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads --enable-float CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
=== Double precision ===<br />
./configure --enable-shared --enable-sse2 --enable-avx --enable-openmp --enable-threads CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
make -j6<br />
make check<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
exit<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc3.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc3.tar.lz<br />
cd octave-4.2.0-rc3<br />
<br />
mkdir build_; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9637Octave and separate toolchain2016-11-01T13:37:06Z<p>Ederag: octave itself</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
<br />
== Octave itself ==<br />
<br />
cd $downloads<br />
wget ftp://alpha.gnu.org/gnu/octave/octave-4.2.0-rc3.tar.lz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/octave-4.2.0-rc3.tar.lz<br />
cd octave-4.2.0-rc3<br />
<br />
mkdir build_; cd $_<br />
../configure --with-blas="/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so" CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig JAVA_HOME=/usr/lib64/jvm/java-1.8.0-openjdk-1.8.0/ --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
<br />
make check<br />
# or, for nvidia users,<br />
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9634Octave and separate toolchain2016-10-31T15:09:31Z<p>Ederag: /* GraphicsMagick */</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0<br />
<br />
./configure --without-webp --without-jbig --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
make -j6 check<br />
============================================================================<br />
Testsuite summary for GraphicsMagick 1.3.25<br />
============================================================================<br />
# TOTAL: 1215<br />
# PASS: 1169<br />
# SKIP: 46<br />
# XFAIL: 0<br />
# FAIL: 0<br />
# XPASS: 0<br />
# ERROR: 0<br />
<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9633Octave and separate toolchain2016-10-31T11:17:07Z<p>Ederag: GraphicsMagick</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
<br />
<br />
<br />
== GraphicsMagick ==<br />
<br />
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads<br />
<br />
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz<br />
cd GraphicsMagick-1.3.25<br />
<br />
./configure --enable-static=no --enable-shared=yes --with-quantum-depth=16 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 PKG_CONFIG_PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/pkgconfig --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]<br />
<br />
make -j 6<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9632Octave and separate toolchain2016-10-31T10:53:44Z<p>Ederag: /* SuiteSparse */ complete</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
<br />
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre><br />
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200<br />
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200<br />
@@ -27,9 +27,9 @@<br />
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \<br />
-I../../include<br />
<br />
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \<br />
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)<br />
<br />
libs: metis<br />
( cd ../../SuiteSparse_config ; $(MAKE) )<br />
( cd ../../AMD ; $(MAKE) library )<br />
<br />
</pre><br />
}}<br />
<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz<br />
mv SuiteSparse SuiteSparse-4.5.3<br />
cd SuiteSparse-4.5.3/<br />
<br />
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch<br />
# should get: "patching file UMFPACK/Demo/Makefile"<br />
<br />
If the following command<br />
<br />
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print<br />
<br />
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}}, <br />
then the patch sent upstream has not been applied,<br />
and we should do it here:<br />
<br />
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;<br />
<br />
Now we are ready to build SuiteSparse<br />
<br />
make -j6 LAPACK= CF="-march=native -O3 -fexceptions -fPIC -fopenmp" F77FLAGS="-march=native -O3" LDFLAGS="-L/usr/local/build/SuiteSparse-4.5.3/lib -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDLIBS="-lm -lrt -Wl,-rpath=/usr/local/build/SuiteSparse-4.5.3/lib:/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64"<br />
<br />
fix RUN_PATH and install<br />
<br />
cp -Rdp lib lib_chrpath<br />
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*<br />
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/<br />
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9631Octave and separate toolchain2016-10-31T09:31:10Z<p>Ederag: /* arpack-ng */ exits</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
To be continued...<br />
<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9630Octave and separate toolchain2016-10-31T09:26:59Z<p>Ederag: start SuiteSparse section</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
<br />
== SuiteSparse ==<br />
<br />
http://faculty.cse.tamu.edu/davis/suitesparse.html<br />
<br />
cd $downloads<br />
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz<br />
<br />
To be continued...<br />
<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9626Octave and separate toolchain2016-10-30T18:13:12Z<p>Ederag: </p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
sudo make install<br />
# see what has been installed<br />
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin<br />
<br />
<br />
== OpenBLAS ==<br />
<br />
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]<br />
<br />
cd $downloads<br />
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz<br />
cd OpenBLAS-0.2.19/<br />
<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
# check<br />
which gcc<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
# do not use threads <br />
# (because I use pararrayfun from the parallel package)<br />
make USE_THREAD=0 CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 <br />
<br />
One should get<br />
<br />
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)<br />
<br />
OS ... Linux <br />
Architecture ... x86_64 <br />
BINARY ... 64bit <br />
C compiler ... GCC (command line : gcc)<br />
Fortran compiler ... GFORTRAN (command line : gfortran)<br />
Library Name ... libopenblas_haswell-r0.2.19.a (Single threaded) <br />
<br />
Checking the runpath:<br />
<br />
ldd libopenblas.so<br />
linux-vdso.so.1 (0x00007fff961fc000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)<br />
<br />
Manual installation<br />
sudo cp libopenblas.a libopenblas_haswell-r0.2.19.a libopenblas_haswell-r0.2.19.so /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64<br />
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/<br />
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0<br />
sudo ln -s libopenblas.so.0 libopenblas.so<br />
<br />
== arpack-ng ==<br />
<br />
https://github.com/opencollab/arpack-ng/releases<br />
<br />
cd $downloads<br />
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz<br />
<br />
Start from a clean state<br />
<br />
exit<br />
bash<br />
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH<br />
which gfortran<br />
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz<br />
cd arpack-ng-3.4.0<br />
./bootstrap<br />
./configure CPPFLAGS="-I/usr/local/gcc-6.2.0_binutils-2.27_isl/include" CFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" CXXFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" FFLAGS="-O2 -march=native -L/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64" LDFLAGS=-Wl,-rpath,/usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl<br />
<br />
make -j 6<br />
make check<br />
# TOTAL: 12<br />
# PASS: 12<br />
<br />
# check libraries<br />
ldd ./SRC/.libs/libarpack.so<br />
linux-vdso.so.1 (0x00007fff1f38c000)<br />
libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)<br />
libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)<br />
libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)<br />
libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)<br />
libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)<br />
libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)<br />
/lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)<br />
<br />
as root ({{codeline|su}}, not {{codeline|sudo}}, because we want PATH to contain {{Path|/usr/local/gcc-6.2.0_binutils-2.27_isl/bin}})<br />
make install<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Octave_and_separate_toolchain&diff=9625Octave and separate toolchain2016-10-30T17:03:59Z<p>Ederag: gcc toolchain</p>
<hr />
<div>Building of octave together with a separate toolchain (custom built gcc/binutils/...).<br />
<br />
This is required mainly when the base linux distribution ships too old a version of gcc.<br />
Unexperienced users should upgrade their distribution, though.<br />
<br />
The main build directory will be called {{Path|/usr/local/build}}. <br />
It was first created by root, and then changed to be owned by the user who will perform compilations.<br />
You might want change this to another directory in your {{Path|$HOME}} for instance.<br />
<br />
export buildroot=/usr/local/build<br />
<br />
We will need a directory to hold downloaded files<br />
<br />
export downloads=$buildroot/downloads<br />
<br />
mkdir -p $buildroot/downloads<br />
<br />
<br />
== gcc toolchain ==<br />
<br />
This part is largely inspired by [http://stackoverflow.com/a/6228588/3565696 this answer]<br />
<br />
cd $buildroot<br />
# work in a subshell, to isolate mistakes<br />
bash<br />
# check that PATH and LD_RUN_PATH are normal<br />
echo $PATH<br />
echo $LD_RUN_PATH<br />
<br />
cd $downloads<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2<br />
wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.5.tar.xz<br />
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz<br />
wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz<br />
wget http://isl.gforge.inria.fr/isl-0.17.tar.xz<br />
<br />
cd $buildroot<br />
tar --no-same-owner -xvf $downloads/binutils-2.27.tar.bz2<br />
tar --no-same-owner -xvf $downloads/gcc-6.2.0.tar.bz2<br />
tar --no-same-owner -xvf $downloads/mpfr-3.1.5.tar.xz<br />
tar --no-same-owner -xvf $downloads/mpc-1.0.3.tar.gz<br />
tar --no-same-owner -xvf $downloads/gmp-6.1.1.tar.xz<br />
tar --no-same-owner -xvf $downloads/isl-0.17.tar.xz<br />
<br />
cd $buildroot/gcc-6.2.0<br />
ln -s ../mpfr-3.1.5 mpfr<br />
ln -s ../mpc-1.0.3 mpc<br />
ln -s ../gmp-6.1.1 gmp<br />
ln -s ../isl-0.17/ isl<br />
# Now symlink everything from the binutils dir which doesn't exist in the gcc dir,<br />
# so anything which already exists will take priority but the<br />
# binutils tools will look be visible to the build:<br />
for file in ../binutils-2.27/* ; do ln -s "${file}" ; done<br />
# errors ending with "File exists" are normal<br />
<br />
Now we are ready to build the toolchain<br />
<br />
cd $buildroot<br />
mkdir gcc-6.2.0_isl_build; cd $_<br />
../gcc-6.2.0/configure --prefix=/usr/local/gcc-6.2.0_binutils-2.27_isl --disable-nls --enable-languages=c,c++,fortran,java --disable-multilib<br />
make -j 6 bootstrap<br />
<br />
<br />
To be continued...</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=GNU_Octave_Wiki&diff=9624GNU Octave Wiki2016-10-30T15:02:02Z<p>Ederag: /* Installing */</p>
<hr />
<div>[https://www.gnu.org/software/octave/ GNU Octave] is a high-level interpreted language, primarily intended for numerical computations. It provides capabilities for the numerical solution of linear and nonlinear problems, and for performing other numerical experiments. It also provides extensive graphics capabilities for data visualization and manipulation. GNU Octave is normally used through its interactive interface ([https://en.wikipedia.org/wiki/Command-line_interface CLI] and [https://en.wikipedia.org/wiki/Graphical_user_interface GUI]), but it can also be used to write non-interactive programs. The GNU Octave language is quite similar to Matlab so that most programs are easily portable.<br />
<br />
== [[:Category:Installation|Installing]] ==<br />
<br />
Get installers and sources from http://octave.org/download ([[Octave_for_MacOS_X#Installing_a_Mac_OS_X_Bundle|Beta installer for Mac OS X]]). Some installation instructions given [[Octave_for_Debian_systems|here]].<br />
<br />
Building together with a separate toolchain (custom built gcc version) is described [[Octave_and_separate_toolchain|here]].<br />
<br />
{{Note|GNU Octave {{Release}} is the current stable release}}<br />
<br />
== News ==<br />
<br />
* The 4.2.0 release process has started. See [[4.2.0 Release Checklist]] and [[Bug Fix List - 4.2.0 Release]].<br />
<br />
* {{Release Date}} '''GNU Octave {{Release}}''' has been released (see above)!<br />
<br />
== Getting help with GNU Octave ==<br />
<br />
* Read the [https://www.gnu.org/software/octave/doc/interpreter GNU Octave documentation]<br />
* The [[FAQ|frequently asked questions (FAQ)]] list is good place to start with answers to questions regarding [[FAQ#General|what is Octave]], [[FAQ#Licensing_issues|licensing]], [[FAQ#What.27s_new_in_Octave|new features]], [[FAQ#What_documentation_exists_for_Octave.3F|documentation]], [[FAQ#Installation_issues_and_problems|installation]], [[FAQ#Coding|coding]], [[FAQ#How_can_I_get_involved_in_Octave_development.3F|contributing to Octave]], and more, are found there.<br />
* Continue reading this wiki and feel free to add further content (please check that it is not already part of, or belongs in, the documentation and read the [[Contribution guidelines]]).<br />
* [https://www.gnu.org/software/octave/support.html Other support options]<br />
<br><br />
<br />
__TOC__<br />
<br />
== Advanced topics ==<br />
<br />
Below is a temporary attempt to organize the "most wanted" pages of the Wiki. A list of all pages on the wiki can be seen [[Special:AllPages|here]]. To locate something specific, try the wiki's search box, or prepend {{Codeline|<nowiki>site:wiki.octave.org</nowiki>}} to a [https://www.google.com/search?&q=site%3Awiki.octave.org Google search]. Please read the [[Contribution guidelines]] first, if you want to contribute to this Wiki.<br />
<br />
=== [[:Category:Packages|Packages]] ===<br />
* [[OEP:pkg|Installing packages]]<br />
* [[Creating packages]]<br />
<br />
==== [[Octave-Forge]] ====<br />
<br />
See also the list of Forge Wiki pages: [[:Category:Octave-Forge]]<br />
<br />
* [[bim_package|bim package]] Solve Partial Differential Equaltions with a Finite Element method<br />
* [[Control_package|Control package]]<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/CGI_programming_with_Octave CGI] Common Gateway Interface for Octave<br />
* [[Dataframe_package|Dataframe package]] cell arrays on steroids<br />
* [[Dicom_package|Dicom package]]<br />
* [[Fem-fenics|fem-fenics]] Interface to [http://fenicsproject.org/ FEnics] FEM library<br />
* [[Geometry_package|Geometry package]]<br />
* [[Image_acquisition_package|Image acquisition package]] Capture images, for example from v4l2 hardware like webcams<br />
* [[Instrument_control__package|Instrument control package]]<br />
* [[Interval_package|Interval package]] Real-valued interval arithmetic<br />
* [[IO_package|I/O package]]<br />
* [[Java_package|Java package]]<br />
* [[Mechanics_package|Mechanics package]]<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/NcArray ncArray] High-level interface of accessing a single or a collection of NetCDF files as a multi-dimensional array<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/Octave-netcdf netcdf] matlab-compatible NetCDF package<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/NetCDF_toolbox_for_Octave octcdf] NetCDF package (old)<br />
* [[ocs_package|OCS package]] Octave Circuit Simulator<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/Optimal_interpolation_Fortran_module_with_Octave_interface optiminterp] Optimal interpolation<br />
* [[Parallel_package|Parallel package]]<br />
* [[Sockets_package|Sockets package]]<br />
* [[Symbolic package|Symbolic package]]<br />
* [[TISEAN_package|TISEAN package]]<br />
* [[Video_package|Video package]]<br />
* [[sci_cosim|Scilab co-simulation package]]<br />
<br />
=== [[:Category:Editors|Editors]] ===<br />
* [[Gedit]]<br />
* [[Emacs]]<br />
* [[Nano]]<br />
* [[Vim]]<br />
* [[Kate]]<br />
* [http://octclipse.sourceforge.net Octclipse] (Windows and GNU/Linux only. The Octclipse developers are seeking individuals to assist with MacOS X support.)<br />
* [https://sites.google.com/site/domainmathide/ DomainMath IDE] (Windows,GNU/Linux and Mac OS.)<br />
* [https://bitbucket.org/jgpallero/octave-sh GNU Octave syntax highlight files] (Syntax highlight definitions for some editors. Contibutions are welcome)<br />
<br />
=== [[:Category:Resources|Tutorials/Examples]] ===<br />
* [[Using Octave]] - For those just getting started.<br />
* [[Octave Basics]] - A short reference card to get started.<br />
* [https://staff.ti.bfh.ch/sha1/Labs/PWF/Documentation/OctaveAtBFH.pdf Octave introduction script]<br />
* [[Tips and tricks]] - Guidelines to improve your coding skills.<br />
* [[Cookbook]] - Several simple and useful examples.<br />
* [[Octave load]] - Use liboctave functions to load variables from a file in Octave's binary format. <br />
* [[Fortran]] - Accessing liboctave from a Fortran 2003 program.<br />
* [[Octave fun]] - Coding can be fun -- miscellaneous more or less funny scripts<br />
* [[Video tutorials]]<br />
* [[:Category:Plotting tutorials|Plotting tutorials]]<br />
* [http://www.amiq.com/consulting/2014/11/21/how-to-connect-systemverilog-with-octave/ How to Connect SystemVerilog with Octave]<br />
<br />
=== [[:Category:Development|Development]] ===<br />
In addition to these links, there is a longer list of links relevant to (especially novice) developers at the page [[Developers]].<br />
<br />
* [[4.2.0 Release Checklist]]<br />
* [[Bug Fix List - 4.2.0 Release]]<br />
<br />
* [[Doxygen]] - C++ code documentation<br />
* [[International Characters Support]] - Using Octave in your own language.<br />
* [[Octave for Microsoft Windows]]<br />
* [[Octave for MacOS X]]<br />
* [[Octave for GNU/Linux]] and [[Octave for other Unix systems|other Unix systems]]<br />
<br />
==== [[:Category:Building|Building]] ====<br />
* [[Building]]<br />
* [[Continuous Build]]<br />
* [[Enable large arrays: Build octave such that it can use arrays larger than 2Gb.|Building Octave to use large arrays]]<br />
<br />
==== [[:Category:Testing|Testing]] ====<br />
* [[Tests|Testing source code]]<br />
==== [[:Category:Packaging|Packaging]] ====<br />
* [[Create a MacOS X App Bundle Using MacPorts]]<br />
* [[Windows_Installer|Create a Windows Installer using MXE]]<br />
<br />
=== [[:Category:Academia|Academia]] ===<br />
* [[Publications using Octave]] - A compilation of scientific publications making reference to GNU Octave (add yours!).<br />
<br />
=== [[:Category:Project Ideas|Project Ideas]] ===<br />
* [[Projects]]<br />
* [[Summer of Code Project Ideas]]<br />
<br />
== External Links ==<br />
* [http://www.gnu.org/software/octave/ Octave Homepage]<br />
* [http://octave.sourceforge.net/ Octave Forge]<br />
* [https://savannah.gnu.org/bugs/?group=octave GNU Octave - Bug Tracker]<br />
* [https://savannah.gnu.org/task/?group=octave GNU Octave - Task Tracker]<br />
* [https://savannah.gnu.org/patch/?group=octave GNU Octave - Patch Tracker]<br />
* [https://savannah.gnu.org/hg/?group=octave GNU Octave - Mercurial Repositories]<br />
* [http://planet.octave.org Planet Octave] (collection of blog feeds featuring Octave developers and Summer of Code students)</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=GNU_Octave_Wiki&diff=9623GNU Octave Wiki2016-10-30T15:01:24Z<p>Ederag: /* Installing */</p>
<hr />
<div>[https://www.gnu.org/software/octave/ GNU Octave] is a high-level interpreted language, primarily intended for numerical computations. It provides capabilities for the numerical solution of linear and nonlinear problems, and for performing other numerical experiments. It also provides extensive graphics capabilities for data visualization and manipulation. GNU Octave is normally used through its interactive interface ([https://en.wikipedia.org/wiki/Command-line_interface CLI] and [https://en.wikipedia.org/wiki/Graphical_user_interface GUI]), but it can also be used to write non-interactive programs. The GNU Octave language is quite similar to Matlab so that most programs are easily portable.<br />
<br />
== [[:Category:Installation|Installing]] ==<br />
<br />
Get installers and sources from http://octave.org/download ([[Octave_for_MacOS_X#Installing_a_Mac_OS_X_Bundle|Beta installer for Mac OS X]]). Some installation instructions given [[Octave_for_Debian_systems|here]].<br />
<br />
Building together with a separate toolchain (custom built gcc version) is described [[Octave_with_separate_toolchain|here]].<br />
<br />
{{Note|GNU Octave {{Release}} is the current stable release}}<br />
<br />
== News ==<br />
<br />
* The 4.2.0 release process has started. See [[4.2.0 Release Checklist]] and [[Bug Fix List - 4.2.0 Release]].<br />
<br />
* {{Release Date}} '''GNU Octave {{Release}}''' has been released (see above)!<br />
<br />
== Getting help with GNU Octave ==<br />
<br />
* Read the [https://www.gnu.org/software/octave/doc/interpreter GNU Octave documentation]<br />
* The [[FAQ|frequently asked questions (FAQ)]] list is good place to start with answers to questions regarding [[FAQ#General|what is Octave]], [[FAQ#Licensing_issues|licensing]], [[FAQ#What.27s_new_in_Octave|new features]], [[FAQ#What_documentation_exists_for_Octave.3F|documentation]], [[FAQ#Installation_issues_and_problems|installation]], [[FAQ#Coding|coding]], [[FAQ#How_can_I_get_involved_in_Octave_development.3F|contributing to Octave]], and more, are found there.<br />
* Continue reading this wiki and feel free to add further content (please check that it is not already part of, or belongs in, the documentation and read the [[Contribution guidelines]]).<br />
* [https://www.gnu.org/software/octave/support.html Other support options]<br />
<br><br />
<br />
__TOC__<br />
<br />
== Advanced topics ==<br />
<br />
Below is a temporary attempt to organize the "most wanted" pages of the Wiki. A list of all pages on the wiki can be seen [[Special:AllPages|here]]. To locate something specific, try the wiki's search box, or prepend {{Codeline|<nowiki>site:wiki.octave.org</nowiki>}} to a [https://www.google.com/search?&q=site%3Awiki.octave.org Google search]. Please read the [[Contribution guidelines]] first, if you want to contribute to this Wiki.<br />
<br />
=== [[:Category:Packages|Packages]] ===<br />
* [[OEP:pkg|Installing packages]]<br />
* [[Creating packages]]<br />
<br />
==== [[Octave-Forge]] ====<br />
<br />
See also the list of Forge Wiki pages: [[:Category:Octave-Forge]]<br />
<br />
* [[bim_package|bim package]] Solve Partial Differential Equaltions with a Finite Element method<br />
* [[Control_package|Control package]]<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/CGI_programming_with_Octave CGI] Common Gateway Interface for Octave<br />
* [[Dataframe_package|Dataframe package]] cell arrays on steroids<br />
* [[Dicom_package|Dicom package]]<br />
* [[Fem-fenics|fem-fenics]] Interface to [http://fenicsproject.org/ FEnics] FEM library<br />
* [[Geometry_package|Geometry package]]<br />
* [[Image_acquisition_package|Image acquisition package]] Capture images, for example from v4l2 hardware like webcams<br />
* [[Instrument_control__package|Instrument control package]]<br />
* [[Interval_package|Interval package]] Real-valued interval arithmetic<br />
* [[IO_package|I/O package]]<br />
* [[Java_package|Java package]]<br />
* [[Mechanics_package|Mechanics package]]<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/NcArray ncArray] High-level interface of accessing a single or a collection of NetCDF files as a multi-dimensional array<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/Octave-netcdf netcdf] matlab-compatible NetCDF package<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/NetCDF_toolbox_for_Octave octcdf] NetCDF package (old)<br />
* [[ocs_package|OCS package]] Octave Circuit Simulator<br />
* [http://modb.oce.ulg.ac.be/mediawiki/index.php/Optimal_interpolation_Fortran_module_with_Octave_interface optiminterp] Optimal interpolation<br />
* [[Parallel_package|Parallel package]]<br />
* [[Sockets_package|Sockets package]]<br />
* [[Symbolic package|Symbolic package]]<br />
* [[TISEAN_package|TISEAN package]]<br />
* [[Video_package|Video package]]<br />
* [[sci_cosim|Scilab co-simulation package]]<br />
<br />
=== [[:Category:Editors|Editors]] ===<br />
* [[Gedit]]<br />
* [[Emacs]]<br />
* [[Nano]]<br />
* [[Vim]]<br />
* [[Kate]]<br />
* [http://octclipse.sourceforge.net Octclipse] (Windows and GNU/Linux only. The Octclipse developers are seeking individuals to assist with MacOS X support.)<br />
* [https://sites.google.com/site/domainmathide/ DomainMath IDE] (Windows,GNU/Linux and Mac OS.)<br />
* [https://bitbucket.org/jgpallero/octave-sh GNU Octave syntax highlight files] (Syntax highlight definitions for some editors. Contibutions are welcome)<br />
<br />
=== [[:Category:Resources|Tutorials/Examples]] ===<br />
* [[Using Octave]] - For those just getting started.<br />
* [[Octave Basics]] - A short reference card to get started.<br />
* [https://staff.ti.bfh.ch/sha1/Labs/PWF/Documentation/OctaveAtBFH.pdf Octave introduction script]<br />
* [[Tips and tricks]] - Guidelines to improve your coding skills.<br />
* [[Cookbook]] - Several simple and useful examples.<br />
* [[Octave load]] - Use liboctave functions to load variables from a file in Octave's binary format. <br />
* [[Fortran]] - Accessing liboctave from a Fortran 2003 program.<br />
* [[Octave fun]] - Coding can be fun -- miscellaneous more or less funny scripts<br />
* [[Video tutorials]]<br />
* [[:Category:Plotting tutorials|Plotting tutorials]]<br />
* [http://www.amiq.com/consulting/2014/11/21/how-to-connect-systemverilog-with-octave/ How to Connect SystemVerilog with Octave]<br />
<br />
=== [[:Category:Development|Development]] ===<br />
In addition to these links, there is a longer list of links relevant to (especially novice) developers at the page [[Developers]].<br />
<br />
* [[4.2.0 Release Checklist]]<br />
* [[Bug Fix List - 4.2.0 Release]]<br />
<br />
* [[Doxygen]] - C++ code documentation<br />
* [[International Characters Support]] - Using Octave in your own language.<br />
* [[Octave for Microsoft Windows]]<br />
* [[Octave for MacOS X]]<br />
* [[Octave for GNU/Linux]] and [[Octave for other Unix systems|other Unix systems]]<br />
<br />
==== [[:Category:Building|Building]] ====<br />
* [[Building]]<br />
* [[Continuous Build]]<br />
* [[Enable large arrays: Build octave such that it can use arrays larger than 2Gb.|Building Octave to use large arrays]]<br />
<br />
==== [[:Category:Testing|Testing]] ====<br />
* [[Tests|Testing source code]]<br />
==== [[:Category:Packaging|Packaging]] ====<br />
* [[Create a MacOS X App Bundle Using MacPorts]]<br />
* [[Windows_Installer|Create a Windows Installer using MXE]]<br />
<br />
=== [[:Category:Academia|Academia]] ===<br />
* [[Publications using Octave]] - A compilation of scientific publications making reference to GNU Octave (add yours!).<br />
<br />
=== [[:Category:Project Ideas|Project Ideas]] ===<br />
* [[Projects]]<br />
* [[Summer of Code Project Ideas]]<br />
<br />
== External Links ==<br />
* [http://www.gnu.org/software/octave/ Octave Homepage]<br />
* [http://octave.sourceforge.net/ Octave Forge]<br />
* [https://savannah.gnu.org/bugs/?group=octave GNU Octave - Bug Tracker]<br />
* [https://savannah.gnu.org/task/?group=octave GNU Octave - Task Tracker]<br />
* [https://savannah.gnu.org/patch/?group=octave GNU Octave - Patch Tracker]<br />
* [https://savannah.gnu.org/hg/?group=octave GNU Octave - Mercurial Repositories]<br />
* [http://planet.octave.org Planet Octave] (collection of blog feeds featuring Octave developers and Summer of Code students)</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=GraphicsMagick&diff=9582GraphicsMagick2016-09-20T19:21:37Z<p>Ederag: /* Main dependencies */ OpenSUSE 13.2 packages</p>
<hr />
<div>Octave will use [http://www.graphicsmagick.org/ GraphicsMagick] for reading and writing your images (not plots, only if you are actually doing image processing). This means that the GraphicsMagick configuration you have on you system will limit what your Octave installation can do. Most systems will have it on their own repositories. Unfortunately, their configuration is not always the best for image analysis as it limits reading of images to 8-bit.<br />
<br />
To solve the problem, GraphicsMagick needs to be rebuilt with the appropriate settings. See below for tracking dependencies and the reasoning behind each flag. Once done, the following commands should work to build GraphicsMagick.<br />
<pre><br />
./configure --with-quantum-depth=16 --enable-shared --disable-static --with-magick-plus-plus=yes<br />
make<br />
make check<br />
sudo make install<br />
</pre><br />
{{Note|if after the build, you get "''error while loading shared libraries: libGraphicsMagick.so.3: cannot open shared object file: No such file or directory''" you need to run ldconfig. For security and performance reasons, Linux maintains a cache of the shared libraries installed in "approved" locations and this command will update it.}}<br />
<br />
== Quantum depth ==<br />
The most common problem is the following warning when using {{Codeline|imread()}}:<br />
<pre>warning: your version of GraphicsMagick limits images to 8 bits per pixel</pre><br />
The reason for this is that GraphicsMagick was compiled with {{Codeline|--with-quantum-depth 8}}. Possible values are 8, 16 or 32, each implementing that limitation. See the {{Path|INSTALL}} [http://graphicsmagick.hg.sourceforge.net/hgweb/graphicsmagick/graphicsmagick/file/tip/INSTALL-unix.txt#l429 file] on GraphicsMagick sourcefor an explanantion of this. There are bug reports requesting package maintainers to compile it with higher values. You should not create a new bug, instead leave a comment on the already open bugs: [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557879 Debian], [https://bugs.launchpad.net/ubuntu/+source/graphicsmagick/+bug/696215 Ubuntu], [https://bugzilla.redhat.com/show_bug.cgi?id=996411 Fedora].<br />
<br />
As versions with higher values are not available on the repositories, the solution is to compile it. Octave needs then to be recompiled to use the freshly compiled Magick++ library.<br />
<br />
{{warning|Increasing quantum depth may have a dramatic increase in memory usage. If you use QuantumDepth 32, all images will be read with that precision even if they were saved with 8bit. This means that a 100MB 8bit image will temporarily take 400MB memory, or more if the image was compressed and they usually are, before Octave resizes it back down to 100MB. Because of this, because 32 bit integers images are rare, and because GraphicsMagick does not handle floating point, it's recommended to use QuantumDepth of 16.}}<br />
<br />
== Magick++ ==<br />
Magick++ is the C++ application programming interface to GraphicsMagick. This is what Octave uses so you will need this when compiling GraphicsMagick. This will be enabled by default but if you don't have a C++ compiler installed (such as g++) GraphicsMagick will build just fine without a warning, just a small note during the run of configure.<br />
<br />
== Shared libraries ==<br />
The default is to disable shared libraries but that won't work with Octave. You will need to pass the {{Codeline|--enable-shared}} option. If you do not, Octave will give the following warning when running configure:<br />
<pre>GraphicsMagick++ library fails tests. The imread function for reading image files will not be fully functional.</pre><br />
<br />
== Dependencies ==<br />
Compiling from source means tracking the dependencies yourself which may be a kind of painful. There's no wiki for GraphicsMagick so the following table hopes to makes things easier. Note however that this is the list of all dependencies and suggestions. For Octave purposes only, you definetely will not need all of these.<br />
<br />
To start with you will obviously need the following<br />
* a C compiler such as gcc<br />
* a C++ compiler such as g++<br />
* make<br />
<br />
=== Main dependencies ===<br />
These are the ones which support being enabled or disabled via the configure script options and are shown in the summary status at the end of the configure script run. You will need them at compile time.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Dependency !! Debian Wheezy !! Ubuntu Precise !! OpenSUSE 13.2<br />
|-<br />
| BZLIB || libbz2-dev || libbz2-dev || libbz2-devel<br />
|-<br />
| FlashPIX || || ||<br />
|-<br />
| FreeType 2.0 || libfreetype6-dev || libfreetype6-dev || freetype2-devel<br />
|-<br />
| Ghostscript || ghostscript || ghostscript ||<br />
|-<br />
| Ghostscript-fonts || gsfonts || gsfonts ||<br />
|-<br />
| JBIG || libjbig-dev || || libjbig-devel<br />
|-<br />
| JPEG v1 || libjpeg8-dev || libjpeg-dev || libjpeg62-devel<br />
|-<br />
| JPEG-2000 || libjasper-dev || libjasper-dev || libjasper-devel<br />
|-<br />
| LCMS v2 || liblcms2-dev || liblcms2-dev || liblcms2-devel<br />
|-<br />
| ltdl || libltdl-dev || libltdl-dev || libtool<br />
|-<br />
| LZMA || liblzma-dev || liblzma-dev || xz-devel<br />
|-<br />
| PNG || libpng12-dev || libpng12-dev || libpng12-devel<br />
|-<br />
| TIFF || libtiff5-dev || libtiff5-dev || libtiff-devel<br />
|-<br />
| WEBPD || libwebp-dev || || libwebp-devel<br />
|-<br />
| WMF || libwmf-dev || libwmf-dev || libwmf-devel<br />
|-<br />
| X11 || libx11-dev libxext-dev libsm-dev || || <br />
|-<br />
| XML || libxml2-dev || libxml2-dev || libxml2-devel<br />
|-<br />
| ZLIB || zlib1g-dev || zlib1g-dev || zlib-devel<br />
|-<br />
|}<br />
<br />
{{Note|the following libraries are not listed because:<br />
* Trio is only needed/useful on certain archaic systems which lack secure vsnprintf variants.<br />
* DPS has been [http://dps.sourceforge.net/ deprecated] and should not be used.<br />
* Ghostscript library support is not recommended by GraphicsMagick on Unix type systems. Read their README.txt file.<br />
* there are both v1 and v2 LCMSlibraries but GraphicsMagick only needs one of them.<br />
}}<br />
<br />
=== Other dependencies ===<br />
These other dependendies are easily added via a user-editable text file after building and installation. They are much more specific and most users will have no need for them.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Dependency !! Debian Wheezy !! Ubuntu Precise<br />
|-<br />
| dcraw || dcraw || dcraw<br />
|-<br />
| dvips || texlive-base || texlive-base<br />
|-<br />
| dot || graphviz || graphviz<br />
|-<br />
| fig2dev || transfig || transfig<br />
|-<br />
| gnuplot || gnuplot || gnuplot<br />
|-<br />
| hp2xx || hp2xx || hp2xx<br />
|-<br />
| html2ps || html2ps || html2ps<br />
|-<br />
| lp || cups-client || cups-client<br />
|-<br />
| lpr || cups-bsd || cups-bsd<br />
|-<br />
| mpeg2decode || ||<br />
|-<br />
| mpeg2encode || ||<br />
|-<br />
| pgpv || pgpgpg || pgpgpg<br />
|-<br />
| povray || ||<br />
|-<br />
| ra_ppm || radiance || radiance<br />
|-<br />
| rawtorle || ||<br />
|-<br />
| scanimage || sane-utils || sane-utils<br />
|-<br />
|}</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Plot_comparison&diff=9522Plot comparison2016-08-20T15:12:38Z<p>Ederag: /* gnuplot 4.6 */ autumn_01</p>
<hr />
<div>Visual comparison of plot files from http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html until compare_plot_demos_0_08.html<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html Page 1: annotation .. colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html Page 2: colorbar .. ezplot]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html Page 3: ezplot .. legend]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_04.html Page 4: legend .. meshz]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_05.html Page 5: meshz .. quiver]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_06.html Page 6: quiver .. slice]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html Page 7: slice .. trisurf]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_08.html Page 8: trisurf .. zoom]<br />
<br />
You can find the scripts which are used to create these plots in scripts/testfun/private.<br />
<br />
== Qt ==<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_09 axis_09,10,11,12, 13: No XAxisLocation zero] ({{bug |40588}} and {{bug |48562}}) since Matlab R2016a now supports "origin", this should be considered as an compatibility bug<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#copyobj_01 copyobj_01: Second line, legend and marker missing]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_19 colorbar_19: no colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#hold_06 hold_06: transparency?]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#imshow_07 imshow_07: ???, gnuplot does the same as matlab...]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#fill_01 fill_01: Hidden edge is visible]<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#stem_06 stem_06: Vertical lines to the marker missing]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#stem_07 stem_07: Vertical lines to the marker missing]<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_02 shrinkfaces_02: wrong zoom]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_04 shrinkfaces_04: wrong zoom]<br />
<br />
== gnuplot 4.6 ==<br />
<br />
There are a lot of gnuplot differences and it might be nice to fix those, but someone would have to take an interest. Octave is moving towards OpenGL for all plotting so most developers focuses on<br />
bug fixes for that toolkit.<br />
<br />
The monochrome prints with 4.6 (fine with 5.0) are reported here [https://savannah.gnu.org/bugs/index.php?48832 #48832]<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_02 annotation_02: gnuplot boxes are wrong]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_05 annotation_05: gnuplot uses dotted lines instead of solid line]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_06 annotation_06: annotation is shifted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#area_01 area_01: legend is cutted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_02 axis_02: xy plot yaxis inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#autumn_01 autumn_01: y-axis inverted + no color]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_01 colorbar_01: inverted colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_02 colorbar_02: horizontally swapped colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_07 colorbar_07: upper right colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_08 colorbar_08: right colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_12 colorbar_12: right colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_14 colorbar_14: upper colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_20 colorbar_20,21,22,23: inverted colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#fill_03 fill_03: no gradient]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#hot_01 hot_01: lower plot yaxis inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_02 shrinkfaces_02: wrong vertexes]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_04 shrinkfaces_04: wrong vertexes]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_08.html#trimesh_01 trimesh_01: invisible lines. Qt plot is fine.] {{ bug |42561}}<br />
<br />
== Qt and gnuplot (independent of the used graphics_toolkit)==<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_03 annotation_03: currently not all "headstyle" properties implemented which matlab has]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_04 annotation_04: ??? What's correct here?]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#area_01 area_01: Different colors, white vertical lines in FLTK/Qt]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#cmpermute_01 cmpermute_01: No plot]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_23 colorbar_23: xtick unreadable. It should check the text_extent and reduce xticks if the xlabels would overlap]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_01 colorbar_01: This is just a matter of taste but I (Andy1978) would prefer a smaller gap (only 40% of the current implementation?) between colorbar and the plot like matlab does]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#bar_01 bar_01: Bars heights difference between octave and matlab]<br />
<br />
== Matlab errors due to incompatibilities ==<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_03 axis_03: Error using axis (line 204). Unknown command option ticx.]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_04 axis_04: Error using plot. Error in color/linetype argument.]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#brighten_01 brighten_01: Error using axis (line 204). Unknown command option ticy.]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_19 colorbar_19: Error using matlab.graphics.illustration.ColorBar/set. There is no yscale property on the ColorBar class.]<br />
<br />
== won't fix or Octave only feature ==<br />
<br />
* matlab comet3_01, comet.png: Only the beginning of the animation is printed. Matlab implements comet in a completely different way which means printing isn't really possible for them.<br />
* matlab polar_03, polar_05: Modifying ticks for rho (rticks) and theta (tticks) is an Octave addition.<br />
* matlab polar_04: Modifying color and text properties in polar plot is an Octave addition.<br />
* Multiple Matlab plots with "Error in color/linetype argument". This is because adding legend keys with ";" in plot like "plot(1:10, "; a ramp;)" is an Octave only addition.</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Plot_comparison&diff=9521Plot comparison2016-08-20T15:04:55Z<p>Ederag: /* Qt and gnuplot (independent of the used graphics_toolkit) */</p>
<hr />
<div>Visual comparison of plot files from http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html until compare_plot_demos_0_08.html<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html Page 1: annotation .. colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html Page 2: colorbar .. ezplot]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html Page 3: ezplot .. legend]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_04.html Page 4: legend .. meshz]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_05.html Page 5: meshz .. quiver]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_06.html Page 6: quiver .. slice]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html Page 7: slice .. trisurf]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_08.html Page 8: trisurf .. zoom]<br />
<br />
You can find the scripts which are used to create these plots in scripts/testfun/private.<br />
<br />
== Qt ==<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_09 axis_09,10,11,12, 13: No XAxisLocation zero] ({{bug |40588}} and {{bug |48562}}) since Matlab R2016a now supports "origin", this should be considered as an compatibility bug<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#copyobj_01 copyobj_01: Second line, legend and marker missing]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_19 colorbar_19: no colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#hold_06 hold_06: transparency?]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#imshow_07 imshow_07: ???, gnuplot does the same as matlab...]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#fill_01 fill_01: Hidden edge is visible]<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#stem_06 stem_06: Vertical lines to the marker missing]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#stem_07 stem_07: Vertical lines to the marker missing]<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_02 shrinkfaces_02: wrong zoom]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_04 shrinkfaces_04: wrong zoom]<br />
<br />
== gnuplot 4.6 ==<br />
<br />
There are a lot of gnuplot differences and it might be nice to fix those, but someone would have to take an interest. Octave is moving towards OpenGL for all plotting so most developers focuses on<br />
bug fixes for that toolkit.<br />
<br />
The monochrome prints with 4.6 (fine with 5.0) are reported here [https://savannah.gnu.org/bugs/index.php?48832 #48832]<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_02 annotation_02: gnuplot boxes are wrong]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_05 annotation_05: gnuplot uses dotted lines instead of solid line]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_06 annotation_06: annotation is shifted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#area_01 area_01: legend is cutted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_02 axis_02: xy plot yaxis inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_01 colorbar_01: inverted colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_02 colorbar_02: horizontally swapped colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_07 colorbar_07: upper right colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_08 colorbar_08: right colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_12 colorbar_12: right colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_14 colorbar_14: upper colorbar is inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_20 colorbar_20,21,22,23: inverted colorbar]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#fill_03 fill_03: no gradient]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_03.html#hot_01 hot_01: lower plot yaxis inverted]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_02 shrinkfaces_02: wrong vertexes]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_07.html#shrinkfaces_04 shrinkfaces_04: wrong vertexes]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_08.html#trimesh_01 trimesh_01: invisible lines. Qt plot is fine.] {{ bug |42561}}<br />
<br />
== Qt and gnuplot (independent of the used graphics_toolkit)==<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_03 annotation_03: currently not all "headstyle" properties implemented which matlab has]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#annotation_04 annotation_04: ??? What's correct here?]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#area_01 area_01: Different colors, white vertical lines in FLTK/Qt]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#cmpermute_01 cmpermute_01: No plot]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_23 colorbar_23: xtick unreadable. It should check the text_extent and reduce xticks if the xlabels would overlap]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#colorbar_01 colorbar_01: This is just a matter of taste but I (Andy1978) would prefer a smaller gap (only 40% of the current implementation?) between colorbar and the plot like matlab does]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#bar_01 bar_01: Bars heights difference between octave and matlab]<br />
<br />
== Matlab errors due to incompatibilities ==<br />
<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_03 axis_03: Error using axis (line 204). Unknown command option ticx.]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#axis_04 axis_04: Error using plot. Error in color/linetype argument.]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_01.html#brighten_01 brighten_01: Error using axis (line 204). Unknown command option ticy.]<br />
* [http://josoansi.de/octave_plot_compare/compare_plot_demos_02.html#colorbar_19 colorbar_19: Error using matlab.graphics.illustration.ColorBar/set. There is no yscale property on the ColorBar class.]<br />
<br />
== won't fix or Octave only feature ==<br />
<br />
* matlab comet3_01, comet.png: Only the beginning of the animation is printed. Matlab implements comet in a completely different way which means printing isn't really possible for them.<br />
* matlab polar_03, polar_05: Modifying ticks for rho (rticks) and theta (tticks) is an Octave addition.<br />
* matlab polar_04: Modifying color and text properties in polar plot is an Octave addition.<br />
* Multiple Matlab plots with "Error in color/linetype argument". This is because adding legend keys with ";" in plot like "plot(1:10, "; a ramp;)" is an Octave only addition.</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=Parallel_package&diff=9063Parallel package2016-04-01T00:53:02Z<p>Ederag: /* calculation on a single array */ fix formatting (no newlines between <pre> and <code>)</p>
<hr />
<div>The Parallel execution package provides utilities to work with clusters, but also functions to parallelize work among cores of a single machine.<br />
<br />
To install: {{Codeline|pkg install -forge parallel}}<br />
<br />
And then, once on each octave session, {{Codeline|pkg load parallel}}<br />
<br />
== multicore parallelization (parcellfun, pararrayfun) ==<br />
<br />
<br />
See also the [[NDpar package]], for an extension of these functions to N-dimensional arrays<br />
<br />
=== calculation on a single array ===<br />
<br />
{{Code|simple|<pre><br />
# fun is the function to apply <br />
fun = @(x) x^2;<br />
<br />
vector_x = 1:10;<br />
<br />
vector_y = pararrayfun(nproc, fun, vector_x)<br />
</pre><br />
}}<br />
<br />
should output<br />
<br />
<code><pre><br />
parcellfun: 10/10 jobs done<br />
<br />
vector_y =<br />
<br />
1 4 9 16 25 36 49 64 81 100<br />
</pre></code><br />
<br />
{{Codeline|nproc}} returns the number of cpus available (number of cores or twice as much with hyperthreading). One can use {{Codeline|nproc - 1}} instead, in order to leave one cpu free for instance.<br />
<br />
{{Codeline|fun}} can be replaced by {{Codeline|@myfun}} if the function resides in the {{Codeline|myfun.m}} file.<br />
<br />
In the previous example, the function was executed once for each element of the input {{Codeline|vector_x}}.<br />
If the function is vectorized (can act on a vector and not just on scalar input), then it can be much more efficient to use the {{Codeline|"Vectorized", true}} option.<br />
<br />
{{Code|vectorized|<pre><br />
# fun is the function to apply, vectorized (see the dot)<br />
fun = @(x) x.^2;<br />
<br />
vector_x = 1:10;<br />
<br />
vector_y = pararrayfun(nproc, fun, vector_x, "Vectorized", true, "ChunksPerProc", 1)<br />
</pre><br />
}}<br />
should output<br />
<br />
<code><pre><br />
parcellfun: 4/4 jobs done<br />
vector_y =<br />
<br />
1 4 9 16 25 36 49 64 81 100<br />
</pre></code><br />
<br />
The {{Codeline|"ChunksPerProc"}} option is mandatory with {{Codeline|"Vectorized", true}}. {{Codeline|1}} means that each proc will do its job in one shot (chunk). This number can be increased to use less memory for instance. A higher number of {{Codeline|"ChunksPerProc"}} allows also more flexibility in case of long calculations on a busy machine. If one cpu has finished all its jobs, it can take over the pending jobs of another.<br />
<br />
[[Category:Octave-Forge]]<br />
<br />
=== Output in cell arrays ===<br />
<br />
The following sample code was an answer to [http://stackoverflow.com/questions/27422219/for-every-row-reshape-and-calculate-eigenvectors-in-a-vectorized-way this question]. The goal was to diagonalize 2x2 matrices contained as rows of a 2d array (each row of the array being a flattened 2x2 matrix).<br />
<br />
{{code|diagonalize NxN matrices contained in an array|<br />
<pre><br />
A = [0.6060168 0.8340029 0.0064574 0.7133187;<br />
0.6325375 0.0919912 0.5692567 0.7432627;<br />
0.8292699 0.5136958 0.4171895 0.2530783;<br />
0.7966113 0.1975865 0.6687064 0.3226548;<br />
0.0163615 0.2123476 0.9868179 0.1478827];<br />
<br />
N = 2;<br />
[eigenvectors, eigenvalues] = pararrayfun(nproc, <br />
@(row_idx) eig(reshape(A(row_idx, :), N, N)), <br />
1:rows(A), "UniformOutput", false)<br />
</pre><br />
}}<br />
<br />
With {{codeline|"UniformOutput", false}}, the outputs are contained in cell arrays (one cell per slice). In the sample above, both {{codeline|eigenvectors}} and {{codeline|eigenvalues}} are {{codeline|1x5}} cell arrays.<br />
<br />
== cluster operation ==<br />
<br />
Documentation can be found in the {{codeline|README.parallel}} or {{codeline|README.bw}} files, located inside the {{codeline|doc}} directory of the parallel package.</div>Ederaghttps://wiki.octave.org/wiki/index.php?title=FAQ&diff=9050FAQ2016-03-27T16:38:33Z<p>Ederag: /* What features are unique to Octave? */ Add broadcasting information</p>
<hr />
<div>This is a list of frequently asked questions (FAQ) for GNU Octave users.<br />
<br />
We are always looking for new questions (with answers), better answers, or both. Feel free to edit this page with your changes. If you have general questions about GNU Octave, or need help for something that is not covered by the Octave manual or the FAQ, please use the [https://mailman.cae.wisc.edu/listinfo/help-octave help@octave.org mailing list].<br />
<br />
This FAQ is intended to supplement, not replace, the GNU Octave manual. Before posting a question to the [https://mailman.cae.wisc.edu/listinfo/help-octave help@octave.org mailing list], you should first check to see if the topic is covered in the manual.<br />
<br />
=General=<br />
<br />
==What is Octave?==<br />
<br />
GNU Octave is a high-level interactive language, primarily intended for numerical computations, that is mostly compatible with Matlab.<br />
<br />
GNU Octave can do arithmetic for real, complex or integer-valued scalars and matrices, solve sets of nonlinear algebraic equations, integrate functions over finite and infinite intervals, and integrate systems of ordinary differential and differential-algebraic equations.<br />
<br />
GNU Octave uses the GNU readline library to handle reading and editing input. By default, the line editing commands are similar to the cursor movement commands used by GNU Emacs, and a vi-style line editing interface is also available. At the end of each session, the command history is saved, so that commands entered during previous sessions are not lost.<br />
<br />
The GNU Octave distribution includes a 650+ page Texinfo manual. Access to the complete text of the manual is available via the doc command at the GNU Octave prompt.<br />
<br />
==What is Octave-Forge?==<br />
[http://octave.sourceforge.net/ Octave-Forge] is a collection of packages for GNU Octave, something similar to the Matlab toolboxes. When talking about the two projects at the same time, GNU Octave is usually referred to as Octave core (or just ''core''). [http://octave.sourceforge.net/ Octave-Forge] also serves as a test bed for code that may eventually end up in the core, and distributes binaries for systems with a lack of developers tools (mainly Windows).<br />
<br />
==Who uses Octave?==<br />
<br />
Lots of people. It seems that universities use it for research and teaching, companies of all sizes, for development, individuals. This question comes often on Octave mailing lists, see [[Who Uses Octave?]] for a few answers<br />
<br />
==Who develops Octave?==<br />
<br />
Discussions about writing the software that would eventually become Octave started in about 1988 with James B. Rawlings and John W. Eaton at the University of Texas. John W. Eaton was the original author of Octave, starting full-time development in February 1992. He is still the primary maintainer. The community of users/developers has in addition contributed some code and fuels the discussion on the mailing lists help@octave.org (user forum), maintainers@octave.org (development issues).<br />
<br />
==Why "Octave"?==<br />
<br />
Octave's name has nothing to do with music. It's named after [http://en.wikipedia.org/wiki/Octave_Levenspiel Octave Levenspiel], a former professor of John who was famous for his ability to do quick back-of-the-envelope calculations. You can hear John pronounce the name "Octave" a few times [http://videolectures.net/mloss08_eaton_oct/ in this video]. We hope that GNU Octave will help perform computations with the same ease as Dr. Levenspiel.<br />
<br />
==Why <em>GNU</em> Octave?==<br />
<br />
The GNU Project was launched in 1984 to develop a complete Unix-like operating system which is free software: the GNU system.<br />
<br />
GNU is a recursive acronym for “GNU's Not Unix”; it is pronounced guh-noo, approximately like canoe.<br />
<br />
The Free Software Foundation (FSF) is the principal organizational sponsor of the GNU Project.<br />
<br />
Octave became GNU Octave in 1997 (beginning with version 2.0.6). This meant agreeing to consider Octave a part of the GNU Project and support the efforts of the FSF. A big part of this effort is to adhere to the [http://www.gnu.org/prep/standards/standards.html GNU coding standards] and to benefit from GNU's infrastructure (e.g. [http://hg.savannah.gnu.org/hgweb/octave/ code hosting] and [http://bugs.octave.org bug tracking]). Additionally, Octave receives [https://my.fsf.org/donate/working-together/octave sponsorship] from the FSF's Working Together fund. However, Octave is not and has never been developed by the FSF.<br />
<br />
For more information about the GNU project, see http://www.gnu.org.<br />
<br />
==What version should I use?==<br />
<br />
In general, you will find the latest version on http://www.octave.org/download.html. It is recommended to use the stable version of octave for general use, and the development version if you want the latest features and are willing to tolerate instability.<br />
<br />
A list of user-visible changes since the last release is available in the file NEWS. The file ChangeLog in the source distribution contains a more detailed record of changes made since the last release.<br />
<br />
==On what platforms does Octave run?==<br />
<br />
Octave runs on various Unices—at least Linux and Solaris, Mac OS X, Windows and anything you can compile it on. Binary distributions exist at least for Debian, SUSE, Fedora and RedHat Linuxes (Intel and AMD CPUs, at least), for Mac OS X and Windows' 98, 2000, XP, Vista, and 7.<br />
<br />
Two and three dimensional plotting is fully supported using gnuplot and an experimental OpenGL backend.<br />
<br />
The underlying numerical solvers are currently standard Fortran ones like LAPACK, LINPACK, ODEPACK, the BLAS, etc., packaged in a library of C++ classes. If possible, the Fortran subroutines are compiled with the system's Fortran compiler, and called directly from the C++ functions. If that's not possible, you can still compile Octave if you have the free Fortran to C translator f2c.<br />
<br />
Octave is also free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 3, as published by the Free Software Foundation, or at your option any later version.<br />
<br />
==Why are the developers planning to replace Gnuplot with an OpenGL backend?==<br />
<br />
The development of Octave is committed to being both compatible with Matlab and adding additional features. Toward those ends, the development community has chosen to introduce a native OpenGL backend that supports Matlab handle graphics and its uicontrols. Starting with the 3.8 release, Octave now uses OpenGL graphics by default with FLTK widgets. A Qt OpenGL toolkit is also [https://github.com/goffioul/QtHandles under development].<br />
<br />
There are no plans to remove the gnuplot backend. While a better backend may some day become the new default plotter, the gnuplot backend will still be available as long as our users find it useful.<br />
<br />
== How can I cite Octave? ==<br />
<br />
Octave is free software and does not legally bind you to cite it. However,<br />
we have invested a lot of time and effort in creating GNU Octave, and we<br />
would appreciate if you would cite if you used.<br />
<br />
Run {{codeline|citation}} at the Octave prompt for details on how to best<br />
cite the Octave version you are running. Certain Octave packages also have<br />
recommended citations in which case use {{codeline|citation package_name}}.<br />
<br />
Ideally, you should cite the software itself, not a book or manual, like so:<br />
<br />
@software{octave,<br />
author = {John W. Eaton and others},<br />
title = {GNU Octave},<br />
url = {http://www.octave.org},<br />
version = {4.0.0},<br />
date = {2015-05-27},<br />
}<br />
<br />
It is recommended to do so on a first draft submitted. However, some editors<br />
may disallow this, in which case you can still make a general reference<br />
to Octave in the text, such as:<br />
<br />
<blockquote><br />
This work made use of the free software package GNU Octave, and the authors are grateful for the support of the Octave development community.<br />
</blockquote><br />
<br />
If a more traditional reference is required, there is also a manual for each<br />
Octave release that can be cited:<br />
<br />
@book{,<br />
author = {John W. Eaton, David Bateman, S\oren Hauberg, and Rik Wehbring},<br />
title = {{GNU Octave} version 4.0.0 manual: a high-level interactive language for numerical computations},<br />
year = {2015},<br />
url = {http://www.gnu.org/software/octave/doc/interpreter},<br />
}<br />
<br />
Note that there are two reasons for citing the software used. One is giving<br />
recognition to the work done by others which we already addressed. The other<br />
is giving details on the system used so that experiments can be replicated.<br />
This is just as important, if not more.<br />
<br />
For this, you should cite the version of Octave and all packages used, as<br />
well as any details of your setup as part of your Methods. In addition,<br />
you should make your source available. See<br />
[http://software.ac.uk/so-exactly-what-software-did-you-use How to cite and describe software]<br />
for more details and an in depth discussion.<br />
<br />
==When will feature X be released or implemented?==<br />
When it's ready, sooner if you help. Send us patches if you can. We like patches. If you can't, some developers may be convinced to work on your specific problem for some money.<br />
<br />
==How can I get involved in Octave development?==<br />
<br />
Be around. Be social. Participate in the [https://mailman.cae.wisc.edu/listinfo/help-octave help]<br />
and [https://mailman.cae.wisc.edu/listinfo/octave-maintainers maintainers]<br />
mailing lists. Find things about Octave you don't like, and start thinking<br />
about how to fix them. Many people who now contribute to Octave first spent<br />
several years helping in the mailing list before they started to delve into<br />
the code. A good way to learn Octave is to understand the problems other<br />
people are having with it, so being helpful in the mailing lists not only<br />
helps Octave as a whole, but it also prepares you to be a better Octave<br />
contributor.<br />
<br />
If you feel ready to dive right into the code, read [[Hacking | here]]<br />
and [http://www.gnu.org/software/octave/get-involved.html here] for<br />
guidance. But do not send an email to the mailing lists listing your<br />
skills and offering to help. We won't just suggest things for you to do.<br />
We lack volunteers and we do need your help, but because of that, we also<br />
lack the time to provide good guidance and mentoring. If there is a<br />
specific short-term project you would like to work on, say so, and just<br />
do it. Then ask for help or advice when you're doing it. It is a lot<br />
more important that you do something that you're actually interested on<br />
than something we suggested because it only matches your skills.<br />
<br />
We also need help with this wiki and the<br />
[http://www.gnu.org/software/octave/doc/interpreter/ manual]. These are<br />
also important tasks. The documentation is easy to patch, and the help text<br />
for individual functions even more so. Editing this wiki is even easier.<br />
<br />
Accurate bug reporting is also very useful. Find and report<br />
[http://www.gnu.org/software/octave/bugs.html bugs], making an attempt to<br />
diagnose them. Eventually, you will also know how to fix them. If you want<br />
to help with bug reports or patches, subscribe to<br />
[https://savannah.gnu.org/mail/?group=octave the bug tracker mailing list].<br />
You'll get updates on all bug activity, and you can jump in when you see<br />
something you can help with.<br />
<br />
Look at our [[Projects]] and [[Summer of Code Project Ideas]] if you need<br />
specific inspiration for coding tasks that we would like to get done. See<br />
also the list of [[short projects]].<br />
<br />
=Licensing issues=<br />
<br />
==If I write code using Octave do I have to release it under the GPL?==<br />
<br />
The answer depends on precisely how the code is written and how it works.<br />
<br />
Code written entirely in the scripting language of Octave (interpreted code in .m files) may be released under the terms of whatever license you choose.<br />
<br />
Code written using Octave's native plug-in interface (also known as a .oct file) necessarily links with Octave internals and is considered a derivative work of Octave and therefore must be released under terms that are compatible with the GPL.<br />
<br />
Code written using Octave's implementation of the Matlab MEX interface may be released under the terms of whatever license you choose, provided that the following conditions are met:<br />
<br />
# The plugin should not use any bindings that are specific to Octave. In other words, the MEX file must use the MEX interface only, and not also call on other Octave internals. It should be possible in principle to use the MEX file with other programs that implement the MEX interface (e.g., Matlab).<br />
# The MEX file should not be distributed together with Octave in such a way that they effectively create a single work. For example, you should not distribute the MEX file and Octave together in a single package such that Octave automatically loads and runs the MEX file when it starts up. There are other possible ways that you might effectively create a single work; this is just one example.<br />
<br />
A program that embeds the Octave interpreter (e.g., by calling the "octave_main" function), or that calls functions from Octave's libraries (e.g., liboctinterp, liboctave, or libcruft) is considered a derivative work of Octave and therefore must be released under terms that are compatible with the GPL.<br />
<br />
==Since the MEX interface allows plugins to be distributed under terms that are incompatible with the GPL, does this mean that you are encouraging people to write non-free software for Octave?==<br />
<br />
No. The original reason for implementing the MEX interface for Octave was to allow Octave to run free software that uses MEX files (the particular goal was to run SundialsTB in Octave). The intent was to liberate that software from Matlab and increase the amount of free software available to Octave users, not to enable people to write proprietary code for Octave. For the good of the community, we strongly encourage users of Octave to release the code they write for Octave under terms that are compatible with the GPL.<br />
<br />
==I wrote a program that links with Octave libraries and I don't want to release it under the terms of the GPL. Will you change the license of the Octave libraries for me?==<br />
<br />
No. Instead of asking us to change the licensing terms for Octave, we recommend that you release your program under terms that are compatible with the GPL so that the free software community can benefit from your work the same as you have benefited from the work of all the people who have contributed to Octave.<br />
<br />
==Why can't I use code from File Exchange in Octave? It's released under a BSD license!==<br />
<br />
When one downloads code from File Exchange and use it on non Mathworks software (such as Octave), they are violating the Matlab central [http://www.mathworks.co.uk/matlabcentral/termsofuse.html Terms of Use]. While the [http://en.wikipedia.org/wiki/BSD_licenses BSD licenses] does allow one to use such code in Octave, it also allows others to further impose restrictions which Mathworks does through the MATLAB Central Terms of Use of their site:<br />
<br />
{{quote|text=Content submitted to File Exchange may only be used with MathWorks products.|sign=Matlab central|source=[http://www.mathworks.co.uk/matlabcentral/termsofuse.html#content Terms of Use 2iii]}}<br />
<br />
It should suffice -- although interpretations of this vary -- to contact the author directly and have them send you the code personally, or download the code from the author's own website, if available.<br />
<br />
If you need that code or think that the code is useful, please write the authors asking them to release under a free license. Some examples of letters/email sent to authors can be found in the page [[Asking_for_package_to_be_released_under_GPL:_examples|Asking for package to be released under GPL: examples]].<br />
<br />
Feel free to remix and reuse, just make sure you use your name!<br />
<br />
=What's new in Octave=<br />
<br />
Each new Octave release introduces many new features. The following are<br />
a distilled list of the major changes. A complete list of user visible<br />
changes can be seen by running {{codeline|news}} at the Octave prompt, and<br />
a full list of changes is on the {{Filepath|Changelog}} distributed with<br />
the Octave sources.<br />
<br />
==Coming in a future release==<br />
See [http://hg.savannah.gnu.org/hgweb/octave/file/tip/NEWS NEWS on the development branch]<br />
<br />
==What's new in version series 4.0.X of Octave==<br />
<br />
See the complete user-visible changes on the [https://www.gnu.org/software/octave/NEWS-4.0.html NEWS file].<br />
<br />
* First official release of the GUI.<br />
* Release of official windows binaries.<br />
* Experimental support for [[classdef]].<br />
* OpenGL graphics with Qt widgets.<br />
* Several functions for reading, writing, and recording of audio.<br />
<br />
==What's new in version series 3.8.X of Octave==<br />
<br />
See the complete user-visible changes on the [https://www.gnu.org/software/octave/NEWS-3.8.html NEWS file].<br />
<br />
* Experimental GUI interface.<br />
* OpenGL graphics with fltk widgets.<br />
* Support for nested functions.<br />
* Support for java packages in Octave core.<br />
* Reading and writing of image files vastly extended.<br />
<br />
==What's new in version series 3.6.X of Octave==<br />
<br />
See the complete user-visible changes on the [https://www.gnu.org/software/octave/NEWS-3.6.html NEWS file].<br />
<br />
* Perl compatible regular expressions<br />
* A profiler has been added.<br />
* Broadcasting enabled for all built-in binary element-wise operators.<br />
* Performance of all m-file string functions has been improved.<br />
<br />
==What's new in version series 3.4.X of Octave==<br />
<br />
See the complete user-visible changes on the [https://www.gnu.org/software/octave/NEWS-3.4.html NEWS file].<br />
<br />
* Many improvements to native OpenGL plotting<br />
* ARPACK now distributed with Octave<br />
* Indexing optimisations<br />
* FTP objects<br />
* Function handles aware of overloaded functions<br />
* bsxfun optimised for basic arithmetic functions<br />
* Matlab-style ignoring of output arguments using {{Codeline|~}}<br />
* Many optimisations of the accumarray function<br />
* Sparse matrix indexing has been rewritten for speed<br />
* The pkg command now accepts a -forge option to pull packages directly from Octave-forge<br />
<br />
==What's new in version series 3.2.X of Octave==<br />
<br />
See the complete user-visible changes on the [https://www.gnu.org/software/octave/NEWS-3.2.html NEWS file].<br />
<br />
* Single precision type<br />
* Experimental OpenGL graphics toolkit to replace gnuplot<br />
* Object orient programming via @class named directories<br />
* 64-bit compilation support<br />
* gzipped files and stream and consequently support of Matlab v7 files<br />
* a fully compatible MEX interface<br />
* imwrite and imread (based on the GraphicsMagick library)<br />
* Lazy transpose <br/> Special treatment in the parser of things like "a' * b", where the transpose is never explicitly formed but a flag is rather passed to the underlying LAPACK code.<br />
<br />
== Older releases ==<br />
<br />
For full details on older releases, see:<br />
<br />
* [http://hg.savannah.gnu.org/hgweb/octave/file/83792dd9bcc1/etc/NEWS.1 NEWS.1] for the 1.X.Y series<br />
* [http://hg.savannah.gnu.org/hgweb/octave/file/83792dd9bcc1/etc/NEWS.2 NEWS.2] for the 2.X.Y series<br />
* [http://hg.savannah.gnu.org/hgweb/octave/file/83792dd9bcc1/etc/NEWS.3 NEWS.3] for the 3.X.Y series<br />
<br />
=What documentation exists for Octave?=<br />
<br />
Besides the current wiki, there are other important sources of documentation and help for Octave.<br />
<br />
==What documentation exists for Octave?==<br />
<br />
The Octave distribution includes a 650+ page manual that is also distributed under the terms of the GNU GPL. It is available on the web at http://www.gnu.org/software/octave/doc/interpreter/ and you will also find there instructions on how to order a paper version.<br />
<br />
The complete text of the Octave manual is also available using the GNU Info system via the GNU Emacs, info, or xinfo programs, or by using the {{Codeline|doc}} command to start the GNU info browser directly from the Octave prompt.<br />
<br />
If you have problems using this documentation, or find that some topic is not adequately explained, indexed, or cross-referenced, please report it on http://bugs.octave.org.<br />
<br />
==Getting additional help==<br />
<br />
If you can't find an answer to your question, the help@octave.org mailing list is available for questions related to using, installing, and porting Octave that are not adequately answered by the Octave manual or by this document.<br />
<br />
==User community==<br />
<br />
To subscribe to the list, go to http://www.octave.org/archive.html and follow the link to the subscription page for the list.<br />
<br />
Please do not send requests to be added or removed from the mailing list, or other administrative trivia to the list itself.<br />
<br />
An archive of old postings to the help-octave mailing list is maintained on http://www.octave.org/archive.html.<br />
<br />
You will also find some user advice and code spread over the web. Good starting points are the Octave Wiki http://wiki.octave.org and Octave-Forge http://octave.sourceforge.net<br />
<br />
We also have [http://webchat.freenode.net?channels=octave&uio=d4 an IRC chat room], <code>#octave</code> in Freenode.<br />
<br />
==I think I have found a bug in Octave.==<br />
<br />
“I think I have found a bug in Octave, but I'm not sure. How do I know, and who should I tell?”<br />
<br />
First, see the section [http://www.octave.org/bugs.html on bugs and bug reports in the Octave manual]. When you report a bug, make sure to describe the type of computer you are using, the version of the operating system it is running, and the version of Octave that you are using. Also provide enough code and configuration details of your operating system so that the Octave maintainers can duplicate your bug.<br />
<br />
=How can I obtain Octave?=<br />
<br />
==Source code==<br />
<br />
Source code is available on the Octave development site, where you are sure to get the latest version.<br />
<br />
* http://www.octave.org/download.html<br />
* ftp://ftp.octave.org/pub/octave/<br />
<br />
Since Octave is distributed under the terms of the GPL, you can get Octave from a friend who has a copy, or from the Octave website.<br />
<br />
==Pre-compiled binaries ==<br />
:''See also: [[Build from source]]''<br />
<br />
The Octave project does not normally distribute its own binaries, but other projects do. <br />
For example, Linux and BSD distributions provide by their respective Octave binaries.<br />
Windows is a recent exception, in that binaries are available directly from the Octave project (starting from version 4.0).<br />
For an up-to-date listing, see:<br />
<br />
* http://www.octave.org/download.html<br />
<br />
As of today, Octave binaries are available at least on Debian, Ubuntu, RedHat, Suse, and Fedora GNU/Linux; Mac OS X; and Windows (versions 98, 2000, XP, Vista, 7 and 8).<br />
<br />
==How do I get a copy of Octave for (some other platform)?==<br />
<br />
Octave currently runs on Unix-like systems, Mac OS X, and Windows. It should be possible to make Octave work on other systems as well. If you are interested in porting Octave to other systems, please contact [mailto:maintainers@octave.org the maintainers' mailing list]<br />
.<br />
==How can I install Octave on Android? What is this Octave app in the Google Play store?==<br />
<br />
There is an unofficial Octave app available for Android in the Google Play store. Please see [[Android]] for more information.<br />
<br />
This version of Octave is no longer freely available and has become 'nagware'. This is a sad turn of events.<br />
<br />
=Installation issues and problems= <br />
<br />
Octave 3.4 requires approximately 1.3 GB of disk storage to unpack and compile from source (considerably less if you don't compile with debugging symbols). Once installed, Octave requires approximately 355 MB of disk space (again, considerably less if you don't compile with debugging symbols, approximately 50 MB).<br />
<br />
Check out the page [[Installation]] for more detailed information about installing Octave.<br />
<br />
==What else do I need?==<br />
<br />
To compile Octave, you will need a recent version of GNU Make. You will also need GCC 4.3 or later, although GCC 4.4 or later is recommended.<br />
<br />
'''You must have GNU Make to compile octave'''. Octave's Makefiles use features of GNU Make that are not present in other versions of make. GNU Make is very portable and easy to install.<br />
<br />
==Can I compile Octave with another C++ compiler?==<br />
<br />
Yes, but development is done primarily with GCC, so you may hit some incompatibilities. Octave is intended to be portable to any standard conforming compiler. If you have difficulties that you think are bugs, please report them to the http://bugs.octave.org bug tracker, or ask for help on the [mailto:help@octave.org mailing list].<br />
<br />
== How do I install ''all'' Octave packages? ==<br />
Do not do it! Really, there is no reason to do this. Octave Forge has many packages for different needs but it's unlikely that you need all of them. The common misconception is that the more packages one installs, the more complete and powerful its octave installation will be. However, in the same way one would ''never'' install all perl modules, ruby gems or python packages (because it simply makes no sense), one should not install all octave packages. This isn't desirable and it's not even possible.<br />
<br />
Packages should be installed and loaded selectively. Note that some packages are meant to shadow core functions changing the way Octave works, and different packages can have different implementations of a function with the same name, leading to unpredictable results. Others are just broken or crappy and will break your system. What's worse, some of the packages are even loaded automatically at startup so you may be screwing your octave installation without even realizing it.<br />
<br />
=Coding=<br />
<br />
==What features are unique to Octave?==<br />
<br />
Although most of the Octave language will be familiar to Matlab users, it has some unique features of its own.<br />
<br />
=== Functions defined on the command-line===<br />
Functions can be defined by entering code on the command line, a feature not supported by Matlab. For example, you may type:<br />
<br />
octave:1> function s = hello_string (to_who)<br />
> ## Say hello<br />
> if nargin<1, to_who = "World"; end<br />
> s = ["Hello ",\<br />
> to_who];<br />
> endfunction<br />
octave:2> hello_string ("Moon")<br />
ans = Hello Moon<br />
<br />
As a natural extension of this, functions can also be defined in script files (m-files whose first non-comment line isn't {{Codeline|function out &#61; foo (...)}})<br />
<br />
===Comments with #===<br />
<br />
The pound character, {{Codeline|#}}, may be used to start comments, in addition to {{Codeline|%}}. See the previous example. The major advantage of this is that as {{Codeline|#}} is also a comment character for unix script files, any file that starts with a string like {{Codeline|#! /usr/bin/octave -q}} will be treated as an octave script and be executed by octave.<br />
<br />
===Strings delimited by double quotes "===<br />
<br />
The double quote, {{Codeline|"}}, may be used to delimit strings, in addition to the single quote {{Codeline|'}}. See the previous example. Also, double-quoted strings include backslash interpretation (like C++, C, and Perl) while single quoted are uninterpreted (like Matlab and Perl).<br />
<br />
===Line continuation by backslash===<br />
<br />
Lines can be continued with a backslash, {{Codeline|\}}, in addition to three points {{Codeline|...}}. See the previous example.<br />
<br />
===Informative block closing===<br />
<br />
You may close function, for, while, if, ... blocks with endfunction, endfor, endwhile, ... keywords in addition to using end. As with Matlab, the end (or endfunction) keyword that marks the end of a function defined in a .m file is optional.<br />
<br />
===Coherent syntax===<br />
<br />
Indexing other things than variables is possible, as in:<br />
<br />
octave:1> [3 1 4 1 5 9](3)<br />
ans = 4<br />
octave:2> cos([0 pi pi/4 7])(3)<br />
ans = 0.70711<br />
<br />
In Matlab, it is for example necessary to assign the intermediate result {{Codeline|cos([0 pi pi/4 7])}} to a variable before it can be indexed again.<br />
<br />
===Exclamation mark as not operator===<br />
<br />
The exclamation mark {{Codeline|!}} (aka “Bang!”) is a negation operator, just like the tilde {{Codeline|~}}:<br />
<br />
octave:1> if ! strcmp (program_name, "octave"),<br />
> "It's an error"<br />
> else<br />
> "It works!"<br />
> end<br />
ans = It works!<br />
Note however that Matlab uses the {{Codeline|!}} operator for shell escapes, for which Octave requires using the system command.<br />
<br />
===Increment and decrement operators===<br />
<br />
If you like the {{Codeline|++}}, {{Codeline|+&#61;}} etc operators, rejoice! Octave includes the C-like increment and decrement operators {{Codeline|++}} and {{Codeline|--}} in both their prefix and postfix forms, in addition to {{Codeline|+&#61;}}, {{Codeline|-&#61;}}, {{Codeline|*&#61;}}, {{Codeline|/&#61;}}, {{Codeline|^&#61;}},{{Codeline|.+&#61;}},{{Codeline|.-&#61;}},{{Codeline|.*&#61;}}, {{Codeline|./&#61;}} and {{Codeline|.^&#61;}}.<br />
<br />
For example, to pre-increment the variable x, you would write {{Codeline|++x}}. This would add one to x and then return the new value of x as the result of the expression. It is exactly the same as the expression {{Codeline|x &#61; x + 1}}.<br />
<br />
To post-increment a variable x, you would write {{Codeline|x++}}. This adds one to the variable x, but returns the value that x had prior to incrementing it. For example, if x is equal to 2, the result of the expression x++ is 2, and the new value of x is 3.<br />
<br />
For matrix and vector arguments, the increment and decrement operators work on each element of the operand.<br />
<br />
===Unwind-protect===<br />
<br />
In addition to try-catch blocks, Octave supports an alternative form of exception handling modeled after the unwind-protect form of Lisp. The general form of an unwind_protect block looks like this:<br />
<br />
unwind_protect<br />
body<br />
unwind_protect_cleanup<br />
cleanup<br />
end_unwind_protect<br />
<br />
Where body and cleanup are both optional and may contain any Octave expressions or commands. The statements in cleanup are guaranteed to be executed regardless of how control exits body.<br />
<br />
The unwind_protect statement is often used to reliably restore the values of global variables that need to be temporarily changed.<br />
<br />
Matlab can be made to do something similar with their {{Codeline|onCleanup}} function that was introduced in 2008a. Octave also has {{Codeline|onCleanup}} since version 3.4.0.<br />
<br />
===Built-in ODE and DAE solvers===<br />
<br />
Octave includes LSODE, DASSL and DASPK for solving systems of stiff ordinary differential and differential-algebraic equations. These functions are built in to the interpreter.<br />
<br />
===Do-Until loop structure===<br />
<br />
Similar to the do-while loop in C and C++, Octave allows a do-until loop which does not exist in Matlab<br />
<br />
x = 0<br />
do<br />
x += 1;<br />
until (x == 10)<br />
<br />
===Broadcasting===<br />
<br />
Borrowed from [http://stackoverflow.com/q/26948776/3565696 other languages], [http://www.gnu.org/software/octave/doc/v4.0.1/Broadcasting.html octave broadcasting] allows easy and readable vectorialization.<br />
<br />
f = (1:0.1:2);<br />
# put angular frequencies on the first dimension to prepare broadcasting<br />
omega = 2 * pi * f(:);<br />
# time is already on the second dimension (row vector)<br />
t = 0:0.02:2;<br />
# the resulting s will be a 2-dimensional array<br />
s = sin(omega .* t);<br />
# which can be displayed as<br />
pcolor(t, f, s)<br />
xlabel("t (s)")<br />
ylabel("f (Hz)")<br />
<br />
==How does Octave solve linear systems?==<br />
<br />
In addition to consulting Octave's source for the precise details, you can read the Octave manual for a complete high-level description of the algorithm that Octave uses to decide how to solve a particular linear system, e.g. how the backslash operator {{Codeline|A\x}} will be interpreted. Sections [http://www.gnu.org/software/octave/doc/interpreter/Techniques-Used-for-Linear-Algebra.html#Techniques-Used-for-Linear-Algebra Techniques Used for Linear Algebra] and [http://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html Linear Algebra on Sparse Matrices] from the manual describe this procedure.<br />
<br />
=How do I...?=<br />
<br />
==How do I execute an Octave script?==<br />
<br />
First of all, make sure you understand [http://www.gnu.org/software/octave/doc/interpreter/Script-Files.html the difference between script files and function files]. If you want to execute a function defined in a file, just call the function like any other Octave function: <code>foo(arg1, arg2);</code><br />
<br />
To execute a script from within Octave, just type its name without the .m extension. Thus, if you have a script called <code>foo.m</code>, just type <code>foo</code> from within Octave to execute it. You have to make sure that the script is in your current path. Type <code>path</code> in Octave to see what this path is, and type <code>pwd</code> to print the working directory (where you're currently standing). The current working directory is referred to as "." in the <code>path</code>.<br />
<br />
If the script name has characters that are not valid for an Octave identifier, or if you do not want to use addpath to add the script's location to the current path, you can use the <code>run</code> function instead:<br />
<br />
octave> run("Script Name With Spaces.m")<br />
octave> run("/opt/local/foo.m")<br />
<br />
An alternative is to run the script from outside Octave by calling Octave from your operating system shell. Unlike calling the script from inside Octave, this also allows you to pass arguments from the shell into the script, which the script can access using the <code>argv</code> command:<br />
<br />
$ octave the-script.m arg1 arg2<br />
<br />
In a Unix environment, if the script has a [http://en.wikipedia.org/wiki/Shebang_%28Unix%29 shebang] (e.g. <code>#!/usr/bin/octave</code>) and executable permissions, you can call it like any other Unix program with arguments:<br />
<br />
$ ./the-script arg1 arg2<br />
<br />
If you call the script from the shell and it's plotting, please note [[#When I try plotting from a script, why am I not seeing anything?|how to plot when running a script from the shell]].<br />
<br />
==do xxxx?==<br />
<br />
You are probably looking for the function ''lookfor''. This function searches the help text of all functions for a specific string and returns a list of functions. Note that by default it will only search the first line of the help text (check ''help lookfor'' at the octave prompt for more). The following example helps to find the function to calculate correlation coefficient in a matrix:<br />
<br />
octave> lookfor correlation<br />
corr2 Returns the correlation coefficient between I and J.<br />
cor Compute correlation.<br />
corrcoef Compute correlation.<br />
spearman Compute Spearman's rank correlation coefficient RHO for each of the variables sp<br />
autocor Return the autocorrelations from lag 0 to H of vector X.<br />
<br />
Also, there's a high chance that the function name has a suggestive name, and so you can try auto-completion to get some hints. For the previous example, typing ''corr'' at the octave promp followed by pressing [Tab] twice would suggest the following:<br />
<br />
octave> corr<br />
corr2 corrcoef<br />
<br />
==How do I erase a figure?== <br />
<br />
closeplot(); <br />
closefig(number)<br />
<br />
==How do I set the number of displayed decimals?==<br />
<br />
octave:1> format long<br />
octave:2> pi<br />
pi = 3.14159265358979<br />
octave:3> format short<br />
octave:4> pi<br />
pi = 3.1416<br />
<br />
==How do I call an octave function from C++?==<br />
<br />
*Here is an untested code snippet for calling rand([9000,1]), modified from a post by HerberFarnsworth? to help-octave on 2003-05-01:<br />
<br />
#include <octave/oct.h><br />
...<br />
ColumnVector NumRands(2);<br />
NumRands(0) = 9000;<br />
NumRands(1) = 1;<br />
octave_value_list f_arg, f_ret;<br />
f_arg(0) = octave_value(NumRands);<br />
f_ret = feval("rand",f_arg,1);<br />
Matrix unis(f_ret(0).matrix_value());<br />
<br />
==How do I change colour/line definition in gnuplot postscript?==<br />
Here is a awk script to get a rainbow colour map<br />
<br />
#!/bin/awk -f<br />
<br />
BEGIN {<br />
split("0 4 6 7 5 3 1 2 8", rainbow, " ");<br />
split("7 3 1 0 2 4 6 5 8", invraim, " ");<br />
}<br />
<br />
$1 ~ /\/LT[0-8]/ {<br />
n = substr($1, 4, 1);<br />
if (n == 0)<br />
lt = "{ PL [] 0.9 0.1 0.1 DL } def";<br />
else if (n == 1)<br />
lt = "{ PL [4 dl 2 dl] 0.1 .75 0.1 DL } def";<br />
else if (n == 2)<br />
lt = "{ PL [2 dl 3 dl] 0.1 0.1 0.9 DL } def";<br />
else if (n == 3)<br />
lt = "{ PL [1 dl 1.5 dl] 0.9 0 0.8 DL } def";<br />
else if (n == 4)<br />
lt = "{ PL [5 dl 2 dl 1 dl 2 dl] 0.1 0.8 0.8 DL } def";<br />
else if (n == 5)<br />
lt = "{ PL [4 dl 3 dl 1 dl 3 dl] 0.9 0.8 0.2 DL } def";<br />
else if (n == 6)<br />
lt = "{ PL [2 dl 2 dl 2 dl 4 dl] 0.5 0.3 0.1 DL } def";<br />
else if (n == 7)<br />
lt = "{ PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.4 0 DL } def";<br />
else if (n == 8)<br />
lt = "{ PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def";<br />
$0 = sprintf("/LT%d %s", rainbow[n+1], lt);<br />
##$0 = sprintf("/LT%x %s", invraim[n+1], lt);<br />
##$0 = sprintf("/LT%x %s", n, lt);<br />
}<br />
<br />
{ print; }<br />
<br />
==How do I tell if a file exists?==<br />
<br />
Look at functions like exist, file_in_path.. and the other functions that their descriptions point to.<br />
<br />
<br />
==How do I create a plot without a window popping up (ie, a plot to a file)?==<br />
<br />
'''This only works with gnuplot as graphics_toolkit, NOT with fltk. See [https://savannah.gnu.org/bugs/?33180 Bug#33180]'''<br />
<br />
figure(1, "visible", "off");<br />
plot(sin(1:100));<br />
print -deps "/tmp/sin.eps"<br />
<br />
One can set that behaviour as default:<br />
<br />
set(0, 'defaultfigurevisible', 'off');<br />
<br />
== How do I make Octave use more precision? ==<br />
<br />
Octave's default numerical type is IEEE 754 doubles, a.k.a. hardware floats. This type has 52 bits of precision or about 16 decimal digits. It's implemented in your computer's hardware, in your CPU, so it's '''fast'''. This type is assumed throughout for Octave's calculations.<br />
<br />
You can use a few other built-in types. The int64 type will have 63 bits of precision. One bit is used for the sign, but if you don't want to lose that bit, uint64 can be used instead. These types, however, cannot represent numbers as large as the default double type, and can only represent integers. Furthermore, there is no way to represent integer literals, so if you do <br />
<br />
<syntaxhighlight lang="Octave">uint64(18446744073709551610);</syntaxhighlight><br />
<br />
the literal "18446744073709551610" first gets converted to a double precision type, so <code>uint64</code>'s additional precision is lost. Instead, initialise the <code>uint64</code> with smaller numbers and perform a computation to get the larger number you want. E.g., <br />
<br />
<syntaxhighlight lang="Octave">uint64(999999999999999) * 10000</syntaxhighlight><br />
<br />
would produce value 9999999999999990000, which is close to the maximum possible value for the uint64 type, but can't be at the moment input directly, doing uint64(9999999999999990000), due to the mentioned error of rounding.<br />
<br />
Alternatively, one may use arbitrary precision arithmetic, which has as much precision as is practical to hold in your computer's memory. The ''symbolic'' package has a vpa() function for arbitrary precision arithmetic. Note that arbitrary precision arithmetic must be implemented '''in software''' which makes it much slower than hardware floats.<br />
<br />
Consider carefully if your problem really needs more precision. Often if you're running out of precision the problem lies fundamentally in your methods being [http://en.wikipedia.org/wiki/Numerical_stability numerically unstable], so more precision will not help you here. If you absolutely must use arbitrary-precision arithmetic, you're at present better off using a CAS instead of Octave. An example of such a CAS is [http://sagemath.org Sage].<br />
<br />
=Common problems=<br />
<br />
==I am running a script that should produce output during execution but I don't see anything until it has finished==<br />
<br />
By default Octave is set to pass its screen output through a pager (usually the default pager is "less") which allows<br />
things such as navigating through the output with arrow keys or searching for text or regular expressions within the output.<br />
The pager only displays the output after it's finished receiving it, so when it is active you'll not be able to see anything until your script has terminated. To change this behavior temporarily or permanently you may want to use one of the options described [http://www.gnu.org/software/octave/doc/interpreter/Paging-Screen-Output.html here].<br />
<br />
==When I try plotting from a script, why am I not seeing anything?==<br />
<br />
If you are running an Octave script that includes a plotting command, the script and Octave may terminate immediately. So the plot window does show up, but immediately closes when Octave finishes execution. Alternatively, if using fltk, the plot window needs a readline loop to show up (the time when Octave is sitting around doing nothing waiting for interactive input).<br />
<br />
A common solution is to put a {{Codeline|pause}} command at the end of your script.<br />
<br />
==How do I get sound input or output in Windows?== <br />
Sound input from a sound card and output to a sound card is fully supported in Octave 4.0.0 and newer in all operating systems. Older versions of Octave had very limited audio support that was essentially Linux-specific. If you have problems with the audio I/O functions using Octave 4.0 or a newer version, please report them on the [http://bugs.octave.org bug tracker].<br />
<br />
==I cannot install a package. Octave complains about a missing mkoctfile.==<br />
<br />
You should normally use your distribution's packages. For Debian and Fedora, Octave package '''foo''' will be a deb or rpm called '''octave-foo''', and you should install that instead using apt or yum.<br />
<br />
If you really need to build Octave packages from source to install them, you'll need mkoctfile. Most distributions split Octave into several packages. The script mkoctfile is then part of a separate package:<br />
<br />
* Debian/Ubuntu: {{Codeline|octave-headers}} or {{Codeline|liboctave-dev}}<br />
<br />
* Fedora: {{Codeline|octave-devel}}<br />
<br />
== I'm having problem XXX using the latest Octave version ==<br />
<br />
Please be more specific. What is the latest version, according to you? If you mean the latest released version, be aware that you may still have an older version due to whatever distribution method you're using. There may be a newer version available that you're not aware of due to the distribution method you're using to get Octave, and in most cases, there is a way to get a newer version via your distribution method (see other wiki pages for [[Octave_for_GNU/Linux|GNU/Linux]], [[Octave_for_MacOS_X|Mac OSX]], and [[Octave_for_Windows|Windows]]).<br />
<br />
If you mean the latest Mercurial revision, please specify which one that is. "Latest tip" is not informative, because from the time you wrote "latest tip" to the time someone reads that message, "latest tip" might have changed meaning. Also, you might be standing on a different commit than what "hg tip" says. The tip may be on a different branch, or you might have updated to a different revision different from what "hg tip" says.<br />
<br />
Instead, report the output of "hg summary" or "hg id". Also please use hashes instead or in addition to revision numbers. Revision numbers are just a convenience and only make sense in your local repo, and might not coincide with what someone sees on their own repo. Hashes are globally unique across all repos.<br />
<br />
If your problem truly persists with the latest version, as indicated [http://www.gnu.org/software/octave/download.html here], then by all means report a bug or ask for help, but don't be surprised if volunteers are less inclined to help you with a problem that only exists in an older version of Octave.<br />
<br />
== Why is this floating point computation wrong? ==<br />
<br />
Floating point arithmetic is an approximation '''in binary''' to arithmetic on real or complex numbers. Just like you cannot represent 1/3 exactly in decimal arithmetic (0.333333 is only a rough approximation to 1/3), you cannot represent some fractions like <math>1/10</math> exactly in base 2. In binary, the representation to one tenth is <math>0.0\overline{0011}_b</math> where the bar indicates that it repeats infinitely (like how <math>1/6 = 0.1\overline{6}_d</math> in decimal). Because this infinite repetition cannot be represented exactly with a finite number of digits, rounding errors occur for values that appear to be exact in decimal but are in fact approximations in binary, such as for example how 0.3 - 0.2 - 0.1 is not equal to zero.<br />
<br />
In addition, some advanced operations are computed by approximation and are not guaranteed to be accurate, see [https://en.wikipedia.org/wiki/Rounding#Table-maker.27s_dilemma Table-maker's dilemma]. Their results are system-dependent.<br />
<br />
This isn't an Octave bug. It happens with any program that uses [http://en.wikipedia.org/wiki/IEEE_754 IEEE 754 floating point arithmetic]. To be fair, IEEE 754 also specifies decimal floating point arithmetic, which has never seen wide adoption. The reason why Octave and other programs use IEEE 754 binary floats is that they are ''fast'', because they are implemented in hardware or system libraries. Unless you are using very exotic hardware, Octave will use your computer's processor for basic floating point arithmetic.<br />
<br />
Like death and taxes, rounding errors are a fact of life. You cannot avoid them. You can only move a rounding error from one part of a computation to another, or you can use more precision and delay the rounding error. One way to delay the rounding error is to use arbitrary precision arithmetic, which is inevitably slower as it has to be implemented in software instead of hardware. You may use the vpa function from the symbolic package for this purpose.<br />
<br />
Another approach to the problem is interval arithmetic with the [[Interval package]]. Then, the exact result would always be enclosed by two binary floats. Again, this is slower since only the most basic interval arithmetic operations can be performed in hardware.<br />
<br />
To learn more about floating point arithmetic, consult [http://en.wikipedia.org/wiki/Floating_point_arithmetic its Wikipedia article] or the classical reference [http://floating-point-gui.de/ What Every Computer Scientist Should Know About Floating Point Arithmetic].<br />
<br />
== I have installed a package but still get a "foo undefined" error ==<br />
<br />
You have probably forgotten to load the package. Use {{Codeline|pkg load package-name}} to load it. Most packages are no longer loaded automatically to avoid surprises. See reasoning on related FAQ [[FAQ#How_do_I_install_all_Octave_packages.3F|how do I install all Octave packages]]. If you want a specific package to be loaded by default at startup, consider adding the {{Codeline|pkg load}} command on your {{path|[[.octaverc]]}} file.<br />
<br />
== Missing lines when printing under Windows with OpenGL toolkit and Intel integrated GPU ==<br />
<br />
Some windows users with integrated Intel GPUs have reported missing lines when printing with an OpenGL toolkit like FLTK or Qt. {{bug|42534}}<br />
<br />
Users with this kind of problem should try to install/update their Intel OpenGL drivers for Windows or consider installing Mesa drivers from http://qt-project.org/wiki/Cross-compiling-Mesa-for-Windows<br />
<br />
See also https://www.opengl.org/wiki/FAQ#Why_is_my_GL_version_only_1.4_or_lower.3F<br />
<br />
=Porting programs from Matlab to Octave=<br />
<br />
People often ask<br />
<br />
<blockquote><br />
I wrote some code for Matlab, and I want to get it running under Octave. Is there anything I should watch out for?<br />
</blockquote><br />
<br />
or alternatively<br />
<br />
<blockquote><br />
I wrote some code in Octave, and want to share it with Matlab users. Is there anything I should watch out for?<br />
</blockquote><br />
<br />
which is not quite the same thing. There are still a number of differences between Octave and Matlab, however in general differences between the two are considered as bugs. Octave might consider that the bug is in Matlab and do nothing about it, but generally functionality is almost identical. If you find an important functional difference between Octave behavior and Matlab, then you should send a description of this difference (with code illustrating the difference, if possible) to http://bugs.octave.org.<br />
<br />
Furthermore, Octave adds a few syntactical extensions to Matlab that might cause some issues when exchanging files between Matlab and Octave users.<br />
<br />
As both Octave and Matlab are under constant development, the information in this section is subject to change.<br />
<br />
You should also look at the pages http://octave.sourceforge.net/packages.php and http://octave.sourceforge.net/docs.html that have a function reference that is up to date. You can use this function reference to see the number of octave functions that are available and their Matlab compatibility.<br />
<br />
==How is Octave different from Matlab?==<br />
<br />
The major differences between Octave 3.4.N and Matlab R2010b are:<br />
<br />
===Nested Functions===<br />
Octave has limited support for nested functions. That is<br />
<br />
function y = foo (x)<br />
y = bar(x)<br />
function y = bar (x)<br />
y = ...;<br />
end<br />
end<br />
<br />
is equivalent to<br />
<br />
function y = foo (x)<br />
y = bar(x)<br />
end<br />
function y = bar (x)<br />
y = ...;<br />
end<br />
<br />
The main difference with Matlab is a matter of scope. While nested functions have access to the parent function's scope in Matlab, no such thing is available in Octave, due to how Octave essentially “un-nests” nested functions.<br />
<br />
The authors of Octave consider the nested function scoping rules of Matlab to be more problems than they are worth as they introduce difficult to find bugs as inadvertently modifying a variable in a nested function that is also used in the parent is particularly easy for those not attentive to detail.<br />
<br />
===Differences in core syntax===<br />
<br />
There are a few core Matlab syntaxes that are not accepted by Octave, these being<br />
<br />
* Some limitations on the use of function handles. The major difference is related to nested function scoping rules (as above) and their use with function handles.<br />
<br />
* Some limitations of variable argument lists on the LHS of an expression, though the most common types are accepted.<br />
<br />
* Matlab classdef object oriented programming is not yet supported, though work is underway in a branch of the development tree.<br />
<br />
===Differences in core functions===<br />
<br />
A large number of the Matlab core functions (ie those that are in the core and not a toolbox) are implemented, and certainly all of the commonly used ones. There are a few functions that aren't implemented, usually to do with specific missing Octave functionality (GUI, DLL, Java, ActiveX, DDE, web, and serial functions). Some of the core functions have limitations that aren't in the Matlab version. For example the sprandn function can not force a particular condition number for the matrix like Matlab can. Another example is that testing and the runtests function work differently in Matlab and Octave.<br />
<br />
===Just-In-Time compiler===<br />
<br />
Matlab includes a "Just-In-Time" compiler. This compiler allows the acceleration of for-loops in Matlab to almost native performance with certain restrictions. The JIT must know the return type of all functions called in the loops and so you can't include user functions in the loop of JIT optimized loops. Octave doesn't have a JIT and so to some might seem slower than Matlab. For this reason you must vectorize your code as much as possible. The MathWorks themselves have a good document discussing vectorization at http://www.mathworks.com/support/tech-notes/1100/1109.html.<br />
<br />
===Compiler===<br />
<br />
On a related point, there is no Octave compiler, and so you can't convert your Octave code into a binary for additional speed or distribution. There have been several aborted attempts at creating an Octave compiler. Should the JIT compiler above ever be implemented, an Octave compiler should be more feasible.<br />
<br />
===Graphic handles===<br />
<br />
Up to Octave 2.9.9 there was no support for graphic handles in Octave itself. In the 3.2.N versions of Octave and beyond, the support for graphics handles is converging towards full compatibility. The patch function is currently limited to 2-D patches, due to an underlying limitation in gnuplot, but the experimental OpenGL backend is starting to see an implementation of 3-D patches.<br />
<br />
===GUI functions ===<br />
<br />
There are no Matlab compatible GUI functions yet. This might be an issue if you intend to exchange Octave code with Matlab users. There are a number of bindings from Octave to {{Forge|tcl-octave|Tcl/Tk}}, [http://octaviz.sourceforge.net/index.php? VTK] and {{Forge|zenity}} for example, that can be used for a GUI, but these are not Matlab compatible. Work on a Matlab compatible GUI is in an alpha stage in the QtHandles project, which may form part of a future release of Octave.<br />
<br />
===Simulink===<br />
<br />
Octave itself includes no Simulink support. Typically the simulink models lag research and are less flexible, so shouldn't really be used in a research environment. However, some Matlab users that try to use Octave complain about this lack.<br />
<br />
===MEX-Files===<br />
<br />
Octave includes an API to the Matlab MEX interface. However, as MEX is an API to the internals of Matlab and the internals of Octave differ from Matlab, there is necessarily a manipulation of the data to convert from a MEX interface to the Octave equivalent. This is notable for all complex matrices, where Matlab stores complex arrays as real and imaginary parts, whereas Octave respects the C99/C++ standards of co-locating the real/imag parts in memory. Also due to the way Matlab allows access to the arrays passed through a pointer, the MEX interface might require copies of arrays (even non complex ones).<br />
<br />
===Block comments===<br />
<br />
Block comments denoted by {{Codeline|#{}} and {{Codeline|#&#125;}} markers (or {{Codeline|%{}} and {{Codeline|%&#125;}}) are supported by Octave with some limitations. The major limitation is that block comments are not supported within [] or {}.<br />
<br />
===Mat-File format===<br />
<br />
There are some differences in the mat v5 file format accepted by Octave. Matlab recently introduced the "-V7.3" save option which is an HDF5 format which is particularly useful for 64-bit platforms where the standard Matlab format can not correctly save variables. Octave accepts HDF5 files, but is not yet compatible with the "-v7.3" versions produced by Matlab.<br />
<br />
Although Octave can load inline function handles saved by Matlab, it can not yet save them.<br />
<br />
Finally, some multi-byte Unicode characters aren't yet treated in mat-files.<br />
<br />
===Profiler===<br />
<br />
Thanks to Daniel Kraft's 2011 Google Summer of Code project, Octave has a profiler since version 3.6.0. However, at the moment it only produces text output and has its own makeshift interface for hierarchical profiling.<br />
<br />
===Toolboxes===<br />
<br />
Octave is a community project and so the toolboxes that exist are donated by those interested in them through [[Octave Forge]]. These might be lacking in certain functionality relative to the Matlab toolboxes, and might not exactly duplicate the Matlab functionality or interface.<br />
<br />
===Short-circuit {{Codeline|&}} and {{Codeline|&#124;}} operators===<br />
<br />
The {{Codeline|&}} and {{Codeline|&#124;}} operators in Matlab short-circuit when included in a condition (e.g. an {{Codeline|if}} or {{Codeline|while}} statement) and not otherwise. In Octave only the {{Codeline|&&}} and {{Codeline|&#124;&#124;}} short circuit. Note that this means that<br />
<br />
if (a | b)<br />
...<br />
end<br />
<br />
and<br />
<br />
t = a | b;<br />
if t<br />
...<br />
end<br />
<br />
have different semantics in Matlab. This is really a Matlab bug, but there is too much code out there that relies on this behaviour to change it. Prefer the {{Codeline|&#124;&#124;}} and {{Codeline|&&}} operators in {{Codeline|if}} statements if possible. If you need to use code written for Matlab that depends on this buggy behaviour, you can enable it since Octave 3.4.0 with the following command:<br />
<br />
do_braindead_shortcircuit_evaluation(1)<br />
<br />
Note that the difference with Matlab is also significant when either argument is a function with side effects or if the first argument is a scalar and the second argument is an empty matrix. For example, note the difference between<br />
<br />
t = 1 | []; ## results in [], so...<br />
if (t) 1, end ## in if ([]), this is false.<br />
<br />
and<br />
<br />
if (1 | []) 1, end ## short circuits so condition is true.<br />
<br />
Another case that is documented in the Matlab manuals is that<br />
<br />
t = [1, 1] | [1, 2, 3]; ## error<br />
if ([1, 1] | [1, 2, 3]) 1, end ## OK<br />
<br />
Also Matlab requires the operands of {{Codeline|&&}} and {{Codeline|&#124;&#124;}} to be scalar values but Octave does not (it just applies the rule that for an operand to be considered true, every element of the object must be nonzero or logically true).<br />
<br />
Finally, note the inconsistence of thinking of the condition of an {{Codeline|if}} statement as being equivalent to {{Codeline|all(X(:))}} when {{Codeline|X}} is a matrix. This is true for all cases EXCEPT empty matrices:<br />
<br />
if ([0, 1]) == if (all ([0, 1])) ==> i.e., condition is false.<br />
if ([1, 1]) == if (all ([1, 1])) ==> i.e., condition is true.<br />
<br />
However,<br />
<br />
if ([])<br />
<br />
is not the same as<br />
<br />
if (all ([]))<br />
<br />
because, despite the name, the {{Codeline|all}} is really returning true if none of the elements of the matrix are zero, and since there are no elements, well, none of them are zero. This is an example of [http://en.wikipedia.org/wiki/Vacuous_truth vacuous truth]. But, somewhere along the line, someone decided that {{Codeline|if ([])}} should be false. Mathworks probably thought it just looks wrong to have {{Codeline|[]}} be true in this context even if you can use logical gymnastics to convince yourself that "all" the elements of an empty matrix are nonzero. Octave however duplicates this behavior for {{Codeline|if}} statements containing empty matrices.<br />
<br />
===Solvers for singular, under- and over-determined matrices===<br />
<br />
Matlab's solvers as used by the operators mldivide (\) and mrdivide (/), use a different approach than Octave's in the case of singular, under-, or over-determined matrices. In the case of a singular matrix, Matlab returns the result given by the LU decomposition, even though the underlying solver has flagged the result as erroneous. Octave has made the choice of falling back to a minimum norm solution of matrices that have been flagged as singular which arguably is a better result for these cases.<br />
<br />
In the case of under- or over-determined matrices, Octave continues to use a minimum norm solution, whereas Matlab uses an approach that is equivalent to<br />
<br />
function x = mldivide (A, b)<br />
m = rows(A);<br />
[Q, R, E] = qr(A);<br />
x = [A \ b, E(:, 1:m) * (R(:, 1:m) \ (Q' * b))]<br />
end<br />
<br />
While this approach is certainly faster and uses less memory than Octave's minimum norm approach, this approach seems to be inferior in other ways.<br />
<br />
A numerical question arises: how big can the null space component become, relative to the minimum-norm solution? Can it be nicely bounded, or can it be arbitrarily big? Consider this example:<br />
<br />
m = 10;<br />
n = 10000;<br />
A = ones(m, n) + 1e-6 * randn(m,n);<br />
b = ones(m, 1) + 1e-6 * randn(m,1);<br />
norm(A \ b)<br />
<br />
while Octave's minimum-norm values are around 3e-2, Matlab's results are 50-times larger. For another issue, try this code:<br />
<br />
m = 5;<br />
n = 100;<br />
j = floor(m * rand(1, n)) + 1;<br />
b = ones(m, 1);<br />
A = zeros(m, n);<br />
A(sub2ind(size(A),j,1:n)) = 1;<br />
x = A \ b;<br />
[dummy,p] = sort(rand(1,n));<br />
y = A(:,p)\b;<br />
norm(x(p)-y)<br />
<br />
It shows that unlike in Octave, mldivide in Matlab is not invariant with respect to column permutations. If there are multiple columns of the same norm, permuting columns of the matrix gets you different result than permuting the solution vector. This will surprise many users.<br />
<br />
Since the mldivide (\) and mrdivide (/) operators are often part of a more complex expression, where there is no room to react to warnings or flags, it should prefer intelligence (robustness) to speed, and so the Octave developers are firmly of the opinion that Octave's approach for singular, under- and over-determined matrices is a better choice than Matlab's.<br />
<br />
===Octave extensions===<br />
<br />
The extensions in Octave over MATLAB syntax are very useful, but might cause issues when sharing with Matlab users. A list of the major extensions that should be avoided to be compatible with Matlab are:<br />
<br />
Comments in Octave can be marked with {{Codeline|#}}. This allows POSIX systems to have the first line as {{Codeline|#! octave -q}} and mark the script itself executable. MATLAB doesn't have this feature due to the absence of comments starting with {{Codeline|#}}".<br />
<br />
Code blocks like if, for, while, etc can be terminated with block specific terminations like endif. MATLAB doesn't have this and all blocks must be terminated with end.<br />
<br />
Octave has a lisp-like {{Codeline|unwind_protect}} block that allows blocks of code that terminate in an error to ensure that the variables that are touched are restored. You can do something similar with try/catch combined with {{Codeline|rethrow (lasterror ())}} in Matlab, however rethrow and lasterror are only available in Octave 2.9.10 and later. MATLAB 2008a also introduced {{Codeline|OnCleanUp}} that is similar to {{Codeline|unwind_protect}}, except that the object created by this function has to be explicitly cleared in order for the cleanup code to run.<br />
<br />
Note that using try/catch combined with {{Codeline|rethrow (lasterror ())}} can not guarantee that global variables will be correctly reset, as it won't catch user interrupts with Ctrl-C. For example<br />
<br />
global a<br />
a = 1;<br />
try<br />
_a = a;<br />
a = 2<br />
while true<br />
end<br />
catch<br />
fprintf ('caught interrupt\n');<br />
a = _a;<br />
rethrow (lasterror());<br />
end<br />
<br />
compared to<br />
<br />
global a<br />
a = 1;<br />
unwind_protect<br />
_a = a;<br />
a = 2<br />
while true<br />
end<br />
unwind_protect_cleanup<br />
fprintf ('caught interrupt\n');<br />
a = _a;<br />
end<br />
<br />
Typing Ctrl-C in the first case returns the user directly to the prompt, and the variable ''a'' is not reset to the saved value. In the second case the variable ''a'' is reset correctly. Therefore Matlab gives no safe way of temporarily changing global variables.<br />
<br />
Indexing can be applied to all objects in Octave and not just variables. Therefore {{Codeline|sin(x)(1:10)}} for example is perfectly valid in Octave but not Matlab. To do the same in Matlab you must do {{Codeline|y &#61; sin(x); y &#61; y([1:10]);}}<br />
<br />
Octave has the operators {{Codeline|++}}, {{Codeline|–-}}, {{Codeline|-&#61;}}, {{Codeline|+&#61;}}, {{Codeline|*&#61;}}, etc. As MATLAB doesn't, if you are sharing code these should be avoided.<br />
<br />
Character strings in Octave can be denoted with double or single quotes. There is a subtle difference between the two in that escaped characters like {{Codeline|\n}} (newline), {{Codeline|\t}} (tab), etc are interpreted in double quoted strings but not single quoted strings. This difference is important on Windows platforms where the {{Codeline|\}} character is used in path names, and so single quoted strings should be used in paths. MATLAB doesn't have double quoted strings and so they should be avoided if the code will be transferred to a MATLAB user.<br />
<br />
=GUI=<br />
This is a small section but it's probably one of the most frequent questions.<br />
<br />
==Does Octave have a GUI?==<br />
Yes! It was officially released with Octave 4.0.0. It was<br />
also available since version 3.8.0 has an experimental feature (use the<br />
{{Codeline|--force-gui}} option to start Octave).<br />
<br />
==Why did you create yet another GUI instead of making one that already exists better?==<br />
None of the GUIs for Octave that had been developed thus far were part of<br />
Octave and there is a reason for it. All of them failed at a very important<br />
point, integration with Octave. They treated Octave as a foreign black box<br />
using pipes for communication. This approach is bound to fail with each new<br />
version. Any fix made to make them work with a new Octave versions would only<br />
be temporary. This included QtOctave (now abandoned and incompatible with<br />
newer versions of Octave), Xoctave (which is proprietary and commercial), and<br />
GUI Octave (which was proprietary and no longer available).<br />
<br />
Quint was a project for an Octave GUI that actually tried to do it right.<br />
Eventually it was merged into the Octave repository and is no longer a<br />
separate project. Also, many bits from QtOctave were reused in the GUI.<br />
<br />
QtOctave was a great and very useful tool. It looked beautiful and we are<br />
thankful to its developers for working on such a nice tool. However, it<br />
would have ''never'' been stable as it was. But most of all, the developers<br />
made it free software so we could reuse large chunks of it which were<br />
incorporated in what is now the Octave GUI.</div>Ederag