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 89: Line 87:
  # do not use threads  
  # do not use threads  
  # (because I use pararrayfun from the parallel package)
  # (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"
  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  


One should get
One should get
Line 118: Line 116:
  sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0
  sudo ln -s libopenblas_haswell-r0.2.19.so libopenblas.so.0
  sudo ln -s libopenblas.so.0 libopenblas.so
  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 ==
== arpack-ng ==
Line 203: Line 136:
  cd arpack-ng-3.4.0
  cd arpack-ng-3.4.0
  ./bootstrap
  ./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
  ./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
   
   
  make -j 6
  make -j 6
Line 224: Line 157:
  make install
  make install


{{codeline|exit}} root session, then {{codeline|exit}} current bash, to return to a clean state


== SuiteSparse ==
== SuiteSparse ==
Line 233: Line 165:
  wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz
  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
To be continued...
 
{{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)