Editing Octave and separate toolchain

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
{{Warning|This page is outdated (October 2019).  For a simpler approach on building GNU Octave using a separate toolchain, see [[MXE]].}}
Building of octave together with a separate toolchain (custom built gcc/binutils/...).
Building of octave together with a separate toolchain (custom built gcc/binutils/...).


This is required mainly when the base linux distribution ships too old a version of gcc.
This is required mainly when the base linux distribution ships too old a version of gcc.
Unexperienced users should upgrade their distribution, though. Or use [[MXE]].
Unexperienced users should upgrade their distribution, though.


The main build directory will be called {{Path|/usr/local/build}}.  
The main build directory will be called {{Path|/usr/local/build}}.  
Line 63: Line 61:
  ../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
  ../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
  make -j 6 bootstrap
  make -j 6 bootstrap
sudo make install
# see what has been installed
ls /usr/local/gcc-6.2.0_binutils-2.27_isl/bin
== OpenBLAS ==
We need an optimized BLAS library, such as [http://www.openblas.net/ OpenBLAS]
cd $downloads
wget -O OpenBLAS-0.2.19.tar.gz http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz
cd $buildroot
tar --no-same-owner -xvf $downloads/OpenBLAS-0.2.19.tar.gz
cd OpenBLAS-0.2.19/
bash
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH
# check
which gcc
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gcc
which gfortran
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran
# do not use threads
# (because I use pararrayfun from the parallel package)
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"
One should get
OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)
  OS              ... Linux           
  Architecture    ... x86_64             
  BINARY          ... 64bit               
  C compiler      ... GCC  (command line : gcc)
  Fortran compiler ... GFORTRAN  (command line : gfortran)
  Library Name    ... libopenblas_haswell-r0.2.19.a (Single threaded) 
Checking the runpath:
ldd libopenblas.so
        linux-vdso.so.1 (0x00007fff961fc000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f3ee88cb000)
        libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f3ee85a3000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3ee81f9000)
        libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libquadmath.so.0 (0x00007f3ee7fb9000)
        libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/../lib64/libgcc_s.so.1 (0x00007f3ee7da2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3ee9ad6000)
Manual installation
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
cd /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/
sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0
sudo ln -s libopenblas.so.0 libopenblas.so
== qrupdate ==
download the latest version (1.1.2 as of this writing) to $downloads
https://sourceforge.net/projects/qrupdate/files/latest/download?source=typ_redirect
Start from a clean state
exit
bash
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH
which gfortran
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran
cd $buildroot
tar --no-same-owner -xvf $downloads/qrupdate-1.1.2.tar.gz
cd qrupdate-1.1.2/
Save the following to $downloads/qrupdate-1.1.2_Makeconf.patch
{{Code|qrupdate-1.1.2_Makeconf.patch|<pre>
--- Makeconf.orig 2016-09-20 16:33:23.061756020 +0200
+++ Makeconf 2016-09-20 16:39:47.385547117 +0200
@@ -1,26 +1,26 @@
# set this to your compiler's executable name (e.g. gfortran, g77)
FC=gfortran
# requested flags
-FFLAGS=-fimplicit-none -O3 -funroll-loops
+FFLAGS=-fimplicit-none -march=native -O3 -funroll-loops -lgfortran
# set if you need shared library
FPICFLAGS=-fPIC
# BLAS library (only required for tests)
-BLAS=-lblas
+BLAS=-lopenblas
# LAPACK library (only required for tests)
-LAPACK=-llapack
+LAPACK=
# Library version
VERSION=1.1
MAJOR=1
# The default library dir
-LIBDIR=lib
+LIBDIR=lib64
# Destination installation offset
DESTDIR=
# set default prefix to /usr/local
ifeq ($(strip $(PREFIX)),)
-  PREFIX=/usr/local
+  PREFIX=/usr/local/gcc-6.2.0_binutils-2.27_isl
endif
</pre>
}}
patch -p0 < $downloads/qrupdate-1.1.2_Makeconf.patch
make solib
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}})
make install-shlib
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state
== arpack-ng ==
https://github.com/opencollab/arpack-ng/releases
cd $downloads
wget -O arpack-ng-3.4.0.tar.gz https://github.com/opencollab/arpack-ng/archive/3.4.0.tar.gz
Start from a clean state
exit
bash
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH
which gfortran
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran
cd $buildroot
tar --no-same-owner -xvf $downloads/arpack-ng-3.4.0.tar.gz
cd arpack-ng-3.4.0
./bootstrap
./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
make -j 6
make check
  # TOTAL: 12
  # PASS:  12
# check libraries
ldd ./SRC/.libs/libarpack.so
        linux-vdso.so.1 (0x00007fff1f38c000)
        libopenblas.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libopenblas.so.0 (0x00007f80c79d8000)
        libgfortran.so.3 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgfortran.so.3 (0x00007f80c76b0000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f80c7368000)
        libgcc_s.so.1 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libgcc_s.so.1 (0x00007f80c7151000)
        libquadmath.so.0 => /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/libquadmath.so.0 (0x00007f80c6f11000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f80c6b67000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f80c892e000)
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}})
make install
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state
== SuiteSparse ==
http://faculty.cse.tamu.edu/davis/suitesparse.html
cd $downloads
wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz
Save the code below to $downloads/UMFPACK_Demo_Makefile-4.5.3.patch
{{Code|UMFPACK_Demo_Makefile-4.5.3.patch|<pre>
--- UMFPACK/Demo/Makefile.orig 2016-09-19 16:20:46.317044240 +0200
+++ UMFPACK/Demo/Makefile 2016-09-19 16:30:15.079302070 +0200
@@ -27,9 +27,9 @@
C = $(CC) $(CF) $(UMFPACK_CONFIG) $(CONFIG_PARTITION) \
    -I../../include
-LIBS = $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \
+LIBS = $(LDFLAGS) $(LDLIBS) -L../../lib -lumfpack -lamd -lsuitesparseconfig \
$(LIB_WITH_CHOLMOD) $(LAPACK) $(BLAS)
libs: metis
( cd ../../SuiteSparse_config ; $(MAKE) )
( cd ../../AMD ; $(MAKE) library )
</pre>
}}
cd $buildroot
tar --no-same-owner -xvf $downloads/SuiteSparse-4.5.3.tar.gz
mv SuiteSparse SuiteSparse-4.5.3
cd SuiteSparse-4.5.3/
patch -p0 < $downloads/UMFPACK_Demo_Makefile-4.5.3.patch
# should get: "patching file UMFPACK/Demo/Makefile"
If the following command
find . -name Makefile -exec grep "LDLIBS +=" {} \; -print
yields {{codeline|LDLIBS}} lines not starting with {{codeline|override}},
then the patch sent upstream has not been applied,
and we should do it here:
find . -name Makefile -exec sed -i 's/LDLIBS +=/override LDLIBS +=/g' {} \;
Now we are ready to build SuiteSparse
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"
fix RUN_PATH and install
cp -Rdp lib lib_chrpath
patchelf --set-rpath /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64 lib_chrpath/*
sudo cp lib_chrpath/* /usr/local/gcc-6.2.0_binutils-2.27_isl/lib64/
sudo mkdir /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/
sudo cp include/* /usr/local/gcc-6.2.0_binutils-2.27_isl/include/suitesparse/
== FFTW ==
http://www.fftw.org/
cd $downloads
wget http://www.fftw.org/fftw-3.3.5.tar.gz
Start from a clean state
exit
bash
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH
which gfortran
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran
cd $buildroot
tar --no-same-owner -xvf $downloads/fftw-3.3.5.tar.gz
cd fftw-3.3.5/
=== Single precision ===
./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
make -j6
make check
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}})
make install
exit
=== Double precision ===
./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
make -j6
make check
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}})
make install
exit
== GraphicsMagick ==
download GraphicsMagick (here, GraphicsMagick-1.3.25.tar.xz) to $downloads
https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/
Start from a clean state
exit
bash
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH
which gfortran
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran
cd $buildroot
tar --no-same-owner -xvf $downloads/GraphicsMagick-1.3.25.tar.xz
cd GraphicsMagick-1.3.25
Disable ''webp'' and ''jbig'' that fail tests with gcc-6.2.0
./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
The summary should be fine. As comparison and source of relevant informations: [[GraphicsMagick]]
make -j 6
make -j6 check
============================================================================
Testsuite summary for GraphicsMagick 1.3.25
============================================================================
# TOTAL: 1215
# PASS:  1169
# SKIP:  46
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
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}})
make install
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state
== Octave itself ==
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}}
sudo find /usr/local/gcc-6.2.0_binutils-2.27_isl -name "*.la" -exec sed -i 's:/lib64/../lib64:/lib64:g' {} \; -print
which will replace all unnecessary {{codeline|/lib64/../lib64}} by {{codeline|/lib64}}.
cd $downloads
wget ftp://ftp.gnu.org/gnu/octave/octave-4.2.0.tar.lz
Start from a clean state
exit
bash
export PATH=/usr/local/gcc-6.2.0_binutils-2.27_isl/bin:$PATH
which gfortran
# should be /usr/local/gcc-6.2.0_binutils-2.27_isl/bin/gfortran
cd $buildroot
tar --no-same-owner -xvf $downloads/octave-4.2.0.tar.lz
cd octave-4.2.0
mkdir build-; cd $_
../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
make -j 6
make check
# or, for nvidia users,
xvfb-run -s "-screen 0 640x480x24" make check LD_PRELOAD=/usr/lib64/libGL.so
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}})
make install
{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state


Done.


[[Category:Outdated pages]]
To be continued...
Please note that all contributions to Octave may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Octave:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)