-
-
Save gramian/cd245d7dea271bcaae9967c93327429a to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# project: build_oct | |
# version: 1.12 (2023-01-01) | |
# authors: C. Himpe (0000-0003-2194-6754), M. Koehler (0000-0003-2338-9904) | |
# license: BSD-2-Clause License (opensource.org/licenses/BSD-2-Clause) | |
# summary: Build Octave and numerical dependencies from source (in Ubuntu 20.04 with GCC >= 10.3). | |
# requires hardware: either X86-64 with AVX2 or ARM64 with NEON. | |
# requires software packages: octave libpcre2-dev libreadline-dev libgmp3-dev libmpfr-dev libfreetype6-dev libgl2ps-dev libfontconfig1-dev libglu1-mesa-dev | |
# add to .bashrc: alias oct='export OMP_NUM_THREADS=5; $HOME/BUILT/bin/octave-cli' | |
DEST="$HOME/opt/OCTAVE" | |
NJOBS=5 | |
XJOBS="-j${NJOBS}" | |
OPTIM="-O3" | |
case `uname -m | head -c3` in | |
x86) | |
OPTIM="$OPTIM -m64 -mavx2 -mfma -march=native -mtune=native -mfpmath=sse -malign-data=cacheline -ftree-vectorize -fno-semantic-interposition" | |
;; | |
arm) | |
OPTIM="$OPTIM -mcpu=native -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps" | |
;; | |
esac | |
FLAGS="$OPTIM -fomit-frame-pointer -I$DEST/include -L$DEST/lib -Wl,-rpath=$DEST/lib -pipe" | |
LINK="-L$DEST/lib -Wl,-rpath=$DEST/lib" | |
ALLOC="-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -lmimalloc" | |
FLEXI="-lflexiblas -L$DEST/lib" | |
declare -A AMIMALLOC=( [TAR]="mimalloc.tar.gz" [LNK]="https://github.com/microsoft/mimalloc/archive/v" [VER]="1.7.9" ) | |
declare -A AOPENBLAS=( [TAR]="openblas.tar.gz" [LNK]="https://github.com/xianyi/OpenBLAS/archive/v" [VER]="0.3.21" ) | |
declare -A AFLEXIBLAS=( [TAR]="flexiblas.tar.gz" [LNK]="https://github.com/mpimd-csc/flexiblas/archive/v" [VER]="3.2.1" ) | |
declare -A AQRUPDATENG=( [TAR]="qrupdate.tar.gz" [LNK]="https://github.com/mpimd-csc/qrupdate-ng/archive/v" [VER]="1.1.5" ) | |
declare -A ASUITESPARSE=( [TAR]="suitesparse.tar.gz" [LNK]="https://github.com/DrTimothyAldenDavis/SuiteSparse/archive/v" [VER]="5.13.0" ) | |
declare -A AARPACKNG=( [TAR]="arpack.tar.gz" [LNK]="https://github.com/opencollab/arpack-ng/archive/" [VER]="3.8.0" ) | |
declare -A ASUNDIALS=( [TAR]="sundials.tar.gz" [LNK]="https://github.com/LLNL/sundials/archive/v" [VER]="6.5.0" ) | |
declare -A AOCTAVE=( [TAR]="octave.tar.gz" [LNK]="https://ftp.gnu.org/gnu/octave/octave-" [VER]="7.3.0" ) | |
# Setup destination | |
install -d -m 755 "${DEST}" | |
install -d -m 755 "${DEST}/include" | |
install -d -m 755 "${DEST}/lib" | |
install -d -m 755 "${DEST}/share" | |
install -d -m 755 "${DEST}/man" | |
install -d -m 755 "${DEST}/bin" | |
ln -sf "${DEST}/lib" "${DEST}/lib64" | |
export PATH="${DEST}/bin":${PATH} | |
## MIMALLOC | |
wget -nc -O ${AMIMALLOC[TAR]} ${AMIMALLOC[LNK]}${AMIMALLOC[VER]}.tar.gz | |
tar -xf ${AMIMALLOC[TAR]} && cd $(tar -tf ${AMIMALLOC[TAR]} | grep -m1 /) | |
mkdir -p build && cd build && | |
cmake .. -DCMAKE_INSTALL_PREFIX=$DEST -DCMAKE_C_FLAGS="$FLAGS" -DCMAKE_CXX_FLAGS="$FLAGS" && | |
make $XJOBS && | |
make install | |
cd .. | |
cd .. | |
## OPENBLAS | |
wget -nc -O ${AOPENBLAS[TAR]} ${AOPENBLAS[LNK]}${AOPENBLAS[VER]}.tar.gz | |
tar -xf ${AOPENBLAS[TAR]} && cd $(tar -tf ${AOPENBLAS[TAR]} | grep -m1 /) | |
sed -i "s/COMMON_OPT = -O2/COMMON_OPT = -O3/g" Makefile.system | |
make $XJOBS CFLAGS="$FLAGS $ALLOC -fPIC" CXXFLAGS="$FLAGS $ALLOC -fPIC" FFLAGS="$FLAGS -fPIC" && | |
make PREFIX=$DEST install && | |
cd .. | |
## FLEXIBLAS | |
wget -nc -O ${AFLEXIBLAS[TAR]} ${AFLEXIBLAS[LNK]}${AFLEXIBLAS[VER]}.tar.gz | |
tar -xf ${AFLEXIBLAS[TAR]} && cd $(tar -tf ${AFLEXIBLAS[TAR]} | grep -m1 /) | |
mkdir -p build && cd build && | |
cmake .. -DCMAKE_C_FLAGS="$FLAGS $ALLOC" -DCMAKE_CXX_FLAGS="$FLAGS $ALLOC" -DCMAKE_Fortran_FLAGS="$FLAGS" -DCMAKE_LD_FLAGS="$LINK" \ | |
-DCMAKE_INSTALL_PREFIX=$DEST \ | |
-DEXTRA="OPENBLAS" \ | |
-DOPENBLAS_LIBRARY="$DEST/lib/libopenblas.so;gfortran;gomp;m"\ | |
-DFLEXIBLAS_DEFAULT=OPENBLAS && | |
make $XJOBS && | |
make install && | |
cd .. | |
cd .. | |
## QRUPDATENG | |
wget -nc -O ${AQRUPDATENG[TAR]} ${AQRUPDATENG[LNK]}${AQRUPDATENG[VER]}.tar.gz | |
tar -xf ${AQRUPDATENG[TAR]} && cd $(tar -tf ${AQRUPDATENG[TAR]} | grep -m1 /) | |
mkdir -p build && cd build && | |
cmake .. -DCMAKE_C_FLAGS="$FLAGS $ALLOC" -DCMAKE_CXX_FLAGS="$FLAGS $ALLOC" -DCMAKE_Fortran_FLAGS="$FLAGS" -DCMAKE_LD_FLAGS="$LINK" \ | |
-DCMAKE_INSTALL_PREFIX=$DEST \ | |
-DBUILD_SHARED_LIBS=ON \ | |
-DBLAS_LIBRARIES=$DEST/lib/libflexiblas.so \ | |
-DLAPACK_LIBRARIES=$DEST/lib/libflexiblas.so && | |
make $XJOBS && | |
make install && | |
cd .. | |
cd .. | |
## SUITESPARSE | |
wget -nc -O ${ASUITESPARSE[TAR]} ${ASUITESPARSE[LNK]}${ASUITESPARSE[VER]}.tar.gz | |
tar -xf ${ASUITESPARSE[TAR]} && cd $(tar -tf ${ASUITESPARSE[TAR]} | grep -m1 /) | |
sed -i "s/( cd GraphBLAS/#( cd GraphBLAS/g" Makefile # CHECK ON UPDATE | |
sed -i "351s/.*/ LDLIBS += -lrt -L\$(INSTALL_LIB)/" SuiteSparse_config/SuiteSparse_config.mk # CHECK ON UPDATE | |
make JOBS=${NJOBS} $XJOBS library CFLAGS="$FLAGS $ALLOC" CXXFLAGS="$FLAGS $ALLOC" FFLAGS="$FLAGS" LDFLAGS="$LINK" BLAS="$FLEXI" LAPACK="$FLEXI" && | |
make install INSTALL=$DEST BLAS="$FLEXI" LAPACK="$FLEXI" CFLAGS="$FLAGS $ALLOC" CXXFLAGS="$FLAGS $ALLOC" FFLAGS="$FLAGS" LDFLAGS="$LINK" && | |
cd .. | |
## SUNDIALS | |
wget -nc -O ${ASUNDIALS[TAR]} ${ASUNDIALS[LNK]}${ASUNDIALS[VER]}.tar.gz | |
tar -xf ${ASUNDIALS[TAR]} && cd sundials-${ASUNDIALS[VER]} | |
mkdir -p build && cd build && | |
cmake .. -DCMAKE_INSTALL_PREFIX=$DEST \ | |
-DCMAKE_C_FLAGS_RELEASE="$FLAGS $ALLOC" \ | |
-DCMAKE_CXX_FLAGS_RELEASE="$FLAGS $ALLOC" \ | |
-DCMAKE_Fortran_FLAGS_RELEASE="$FLAGS" \ | |
-DCMAKE_LD_FLAGS="$LINK" \ | |
-DCMAKE_BUILD_TYPE=Release -DEXAMPLES_INSTALL_PATH=$DEST/examples \ | |
-DENABLE_LAPACK=ON -DLAPACK_LIBRARIES=$DEST/lib/libflexiblas.so \ | |
-DENABLE_KLU=ON -DKLU_INCLUDE_DIR=$DEST/include -DKLU_LIBRARY_DIR=$DEST/lib \ | |
-DENABLE_OPENMP=ON && | |
make $XJOBS && | |
make install && | |
cd .. | |
cd .. | |
## ARPACKNG | |
wget -nc -O ${AARPACKNG[TAR]} ${AARPACKNG[LNK]}${AARPACKNG[VER]}.tar.gz | |
tar -xf ${AARPACKNG[TAR]} && cd $(tar -tf ${AARPACKNG[TAR]} | grep -m1 /) | |
mkdir -p build && cd build && | |
cmake .. -DCMAKE_C_FLAGS="$FLAGS $ALLOC" -DCMAKE_CXX_FLAGS="$FLAGS $ALLOC" -DCMAKE_Fortran_FLAGS="$FLAGS" \ | |
-DCMAKE_INSTALL_PREFIX=$DEST \ | |
-DBUILD_SHARED_LIBS=ON \ | |
-DBLAS_LIBRARIES="$FLEXI" \ | |
-DLAPACK_LIBRARIES="$FLEXI" && | |
make $XJOBS && | |
make install && | |
cd .. | |
cd .. | |
## OCTAVE | |
wget -nc -O ${AOCTAVE[TAR]} ${AOCTAVE[LNK]}${AOCTAVE[VER]}.tar.gz | |
tar -xf ${AOCTAVE[TAR]} && cd $(tar -tf ${AOCTAVE[TAR]} | grep -m1 /) | |
./configure CFLAGS="$FLAGS $ALLOC" CXXFLAGS="$FLAGS $ALLOC" FFLAGS="$FLAGS" LDFLAGS="$LINK" --prefix=$DEST \ | |
--disable-java --disable-gui --without-qt \ | |
--with-blas="$FLEXI" --with-lapack="$FLEXI" \ | |
--with-qrupdate-includedir=$DEST/include --with-qrupdate-libdir=$DEST/lib \ | |
--with-arpack-includedir=$DEST/include --with-arpack-libdir=$DEST/lib \ | |
--with-klu-includedir=$DEST/include --with-klu-libdir=$DEST/lib \ | |
--with-sundials_ida-includedir=$DEST/include --with-sundials_ida-libdir=$DEST/lib \ | |
--with-sundials_nvecserial-includedir=$DEST/include --with-sundials_nvecserial-libdir=$DEST/lib \ | |
--with-sundials_sunlinsolklu-includedir=$DEST/include --with-sundials_sunlinsolklu-libdir=$DEST/lib \ | |
--with-umfpack-includedir=$DEST/include --with-umfpack-libdir=$DEST/lib \ | |
--with-cxsparse-includedir=$DEST/include --with-cxsparse-libdir=$DEST/lib \ | |
--with-cholmod-includedir=$DEST/include --with-cholmod-libdir=$DEST/lib \ | |
--with-ccolamd-includedir=$DEST/include --with-ccolamd-libdir=$DEST/lib \ | |
--with-colamd-includedir=$DEST/include --with-colamd-libdir=$DEST/lib \ | |
--with-camd-includedir=$DEST/include --with-camd-libdir=$DEST/lib \ | |
--with-amd-includedir=$DEST/include --with-amd-libdir=$DEST/lib \ | |
--with-suitesparseconfig-includedir=$DEST/include --with-suitesparseconfig-libdir=$DEST/lib && | |
make $XJOBS && | |
make install PREFIX=$DEST | |
cd .. | |
exit 0 |
This is odd. Can you attach the config.log
in the octave folder? Thanks.
I've created a gist of the config.log.
This bit seems relevant.
78722 configure:75567: $PKG_CONFIG --exists --print-errors "sundials_nvecserial"
78723 Package sundials_nvecserial was not found in the pkg-config search path.
78724 Perhaps you should add the directory containing `sundials_nvecserial.pc'
78725 to the PKG_CONFIG_PATH environment variable
78726 No package 'sundials_nvecserial' found
Sorry, I cannot reproduce this on my system. Could you check if the sundials package was successfully built?
You're right. flexiblas-3.0.4
builds and make test
passes, but
~/BUILT/SuiteSparse-5.10.1/sundials-5.8.0/build $ cmake ..
-- SUNDIALS_GIT_VERSION:
-- Using int64_t for indices
-- Determining Fortran name-mangling scheme... OK
Appending C RELEASE flags
Appending Fortran RELEASE flags
-- Looking for LAPACK libraries... OK
-- LAPACK_LIBRARIES: /home/jwscook/BUILT/lib/libflexiblas.so
-- Skipped LAPACK tests, assuming LAPACK works with SUNDIALS. Set LAPACK_WORKS=FALSE to (re)run compatibility test.
CMake Error at /usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
Could NOT find KLU (missing: KLU_LIBRARY KLU_LIBRARIES)
Call Stack (most recent call first):
/usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393 (_FPHSA_FAILURE_MESSAGE)
cmake/tpl/FindKLU.cmake:94 (find_package_handle_standard_args)
cmake/tpl/SundialsKLU.cmake:48 (find_package)
cmake/SundialsSetupTPLs.cmake:103 (include)
CMakeLists.txt:168 (include)
-- Configuring incomplete, errors occurred!
That's all I've got time for until Monday, I'm afraid.
Alright.
The first thing that strikes me as odd is the path ~/BUILT/SuiteSparse-5.10.1/sundials-5.8.0/build $
. I suggest to make a fresh folder, place the build_oct.sh
inside and re-run it; Sundials should not have been built below SuiteSparse. I assume SuiteSparse already failed to built?
Either installing libpcre3-dev
or starting again from a new directory as suggest worked. Thanks again :)
This is great! One minor problem though. It appears that it octave doesn't integrate with sundials.
Any thoughts?