From efe228d521c384e4e8739776bb9ca42491d2e059 Mon Sep 17 00:00:00 2001 From: thomas Date: Fri, 4 Jul 2025 14:17:28 +0200 Subject: [PATCH] octave: Add version 10.2 The build requires that the blas libraries installed in the system are removed. Otherwise it is more or less impossible to control which blas octave and the accompanying libraries are going to use at build time. After install everything is fine and lapack/old openblas can return. To have more AdHoc compatibility with Matlab a few octave packages are also installed (e.g. the statistics package). --- octave-10.2.0-0.build.sh | 432 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 432 insertions(+) create mode 100755 octave-10.2.0-0.build.sh diff --git a/octave-10.2.0-0.build.sh b/octave-10.2.0-0.build.sh new file mode 100755 index 0000000..e7ab2af --- /dev/null +++ b/octave-10.2.0-0.build.sh @@ -0,0 +1,432 @@ +#! /bin/bash + +# ------------------------------------------------------------------- Debug + +# COOKIE=$(mcookie|cut -c-8); grep -v V_GREP_ME $0 > /dev/shm/runme-$COOKIE.sh ; sleep 0.3; exec bash /dev/shm/runme-$COOKIE.sh +# TESTING=1 + +# mind openblas.be0 lapack.be0 ... +BLASPRESENT=$(echo -e /usr/lib/libopenblas* '\n' /usr/lib/libblas* '\n' /usr/lib/liblapack* | grep -v '*' | wc -c) +test $BLASPRESENT != '0' -a -z "$NOBLASCHECK" && \ + echo -e '# Only build w/o system blas/lapack!\n# bee remove' \ + 'openblas-0.3.9-1.x86_64 lapack-3.10.1-1.x86_64' && \ + exit + +# ---------------------------------------------------------------- Preamble + +PKG=octave +VERSION=10.2.0 +BUILD=0 + +TASK=${TASK:-ALL} # when testing parts, do #> TASK=BLAS ./octave-10.1.0-0.build.sh + +PREFIX=/pkg/$PKG-$VERSION-$BUILD +if [ -n "$TESTING" ]; then PREFIX=/scratch/local2/$PKG-$VERSION-$BUILD ; fi + +PATH=/bin:/usr/bin:/usr/sbin:/usr/local/bin + +set -euv +umask 022 + +BUILD_TMPDIR=/scratch/local2/$PKG-$VERSION-$BUILD.$USER.build.tmp + +test -d $BUILD_TMPDIR && ( chmod -R u+rwx $BUILD_TMPDIR || true ; rm -rf $BUILD_TMPDIR ) +export TMPDIR=$BUILD_TMPDIR +export HOME=$BUILD_TMPDIR/home +mkdir -vp $HOME + +exec $PREFIX/profile <<-EOF + PATH=$PREFIX/bin:\$PATH + export JAVA_HOME=/pkg/openjdk-17.0.2.8-0 + export LD_LIBRARY_PATH=$PREFIX/lib\${LD_LIBRARY_PATH:+:\$LD_LIBRARY_PATH} + PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig\${PKG_CONFIG_PATH:+:\$PKG_CONFIG_PATH} + export PKG_CONFIG_PATH + if [ -d $PREFIX/.compatlibs ]; then export LD_LIBRARY_PATH=$PREFIX/.compatlibs\${LD_LIBRARY_PATH:+:}\$LD_LIBRARY_PATH ; fi +EOF +. $PREFIX/profile + +NPROC=$(( $(nproc) * 4 / 5 + 1 )) +export MAKEFLAGS="-j $NPROC" + +BUILDDIR=$PREFIX/build + +mkdir -p $BUILDDIR +cd $BUILDDIR + + +# ------------------------------------------------------------- Maintenance + +if [ $TASK = 'zap' ]; then # reset + cd $PREFIX + for DIR in $(find -maxdepth 1 -type d | grep -v build | grep -i [a-z]); do # exclude build and the sole 'dot' + rm -rf $DIR + done + for DIR in */*/build; do + rm -rf $DIR + done + # qhull is a bit different :/ + rm -rf build/qhull-2020.2 + + echo "# $PREFIX cleaned ..." + exit +fi + +# ------------------------------------------ Dependencies (mostly optional) + +( if ! [ $TASK = 'ALL' -o $TASK = 'QH' ]; then exit; fi + + # orig: http://www.qhull.org/download/qhull-2020-src-8.0.2.tgz + BEEHIVE=https://beehive.molgen.mpg.de/295f7332269a38279478f555cc185296/qhull-2020-src-8.0.2.tgz + + test -e qhull-2020-src-8.0.2.tgz || wget -nv $BEEHIVE + test -d qhull-2020.2 || tar -xf qhull-2020-src-8.0.2.tgz + + export CFLAGS='-O3 -fPIC' + export CXXFLAGS='-O3 -fPIC' + + cd qhull-2020.2/build + + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_SKIP_RPATH=ON \ + .. + + make -j $NPROC + make install + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'RJ' ]; then exit; fi + + # orig: https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/badd12c511e081fec6c89c43a7027bce/rapidjson-1.1.0.tar.gz + + test -e rapidjson-1.1.0.tar.gz || wget -nv $BEEHIVE + rm -rf rapidjson-1.1.0 + tar -xf rapidjson-1.1.0.tar.gz + + cd rapidjson-1.1.0 + + # # it is a header only library + # well, a 2016 release, and around thousand issues ... + + sed -i -e 's/-Werror//' CMakeLists.txt + sed -i -e 's/-Werror//' example/CMakeLists.txt + + # same as https://github.com/Tencent/rapidjson/commit/3b2441b8.patch + # Removed non-compiling assignment operator + sed -i -e '/^\s\s*GenericStringRef&\s\s*operator=/ d' include/rapidjson/document.h + + # issue #909, include/rapidjson/prettywriter.h + sed -i -e '45 s/> Base;$/, writeFlags> Base;/' include/rapidjson/prettywriter.h + + # issue #1718, include/rapidjson/writer.h + sed -i \ + -e '262 d' -e '252 a \\n static const size_t kDefaultLevelDepth = 32; // now unprotected' \ + include/rapidjson/writer.h + + mkdir -p build + cd build + + cmake \ + -DCMAKE_BUILD_TYPE=None \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DRAPIDJSON_HAS_STDSTRING=ON \ + -DRAPIDJSON_BUILD_CXX11=ON \ + -DRAPIDJSON_BUILD_DOC=OFF \ + -DRAPIDJSON_ENABLE_INSTRUMENTATION_OPT=OFF \ + .. + + make -j $NPROC + make install + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'GM' ]; then exit; fi + # GraphicsMagick: an ImageMagick fork + + # orig: https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.45/GraphicsMagick-1.3.45.tar.xz + BEEHIVE=https://beehive.molgen.mpg.de/5eb76e9af7b887a8828fce11aa1e2f1c/GraphicsMagick-1.3.45.tar.xz + + test -e GraphicsMagick-1.3.45.tar.xz || wget -nv $BEEHIVE + test -d GraphicsMagick-1.3.45 || tar -xf GraphicsMagick-1.3.45.tar.xz + + mkdir -p GraphicsMagick-1.3.45-build/build + cd GraphicsMagick-1.3.45-build/build + + ../../GraphicsMagick-1.3.45/configure \ + --prefix=$PREFIX \ + --enable-shared \ + --with-modules \ + --with-magick_plus_plus \ + --with-threads + + make -j $NPROC + make install + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'GL2' ]; then exit; fi + + # orig: https://geuz.org/gl2ps/src/gl2ps-1.4.2.tgz + BEEHIVE=https://beehive.molgen.mpg.de/0606554d833f4fd9f09eab48a374c785/gl2ps-1.4.2.tgz + + test -e gl2ps-1.4.2.tgz || wget -nv $BEEHIVE + test -d gl2ps-1.4.2 || tar -xf gl2ps-1.4.2.tgz + cd gl2ps-1.4.2 + + mkdir -p build + cd build + + export FORCE_SOURCE_DATE=1 # make pdftex adhere to SOURCE_DATE_EPOCH + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_EXE_LINKER_FLAGS=-lm \ + .. + + make -j $NPROC + make install + +) + + +# ------------------------ Blas is indeed not optional +( if ! [ $TASK = 'ALL' -o $TASK = 'BLAS' ]; then exit; fi + + # orig: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.30/OpenBLAS-0.3.30.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/8db3d57f4d4485c6ae3f21ea465660e7/OpenBLAS-0.3.30.tar.gz + + BLASVER=0.3.30 + + test -e OpenBLAS-0.3.30.tar.gz || wget -nv $BEEHIVE + test -d OpenBLAS-0.3.30 || tar -xf OpenBLAS-0.3.30.tar.gz + cd OpenBLAS-0.3.30 + + # only use all CPUs when told to do so (OPENBLAS_DEFAULT_NUM_THREADS, OPENBLAS_NUM_THREADS, GOTO_NUM_THREADS) + sed -i \ + -e '/^\s\s*else blas_num_threads = MAX_CPU_NUMBER;/ s/MAX_CPU_NUMBER/1/' \ + ./driver/others/memory{,_qalloc}.c + + COMMONFLAGS='-O2 -fPIC' + + CFLAGS=$COMMONFLAGS \ + ASMFLAGS=$COMMONFLAGS \ + FFLAGS=${COMMONFLAGS/ -Wformat -Werror=format-security/} \ + FC=gfortran \ + cmake \ + -B build \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DBUILD_RELAPACK=ON \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_STATIC_LIBS=ON \ + -DBUILD_TESTING=OFF \ + -DNO_AFFINITY=ON \ + -DUSE_OPENMP=OFF \ + -DNO_WARMUP=1 \ + -DTARGET=CORE2 \ + -DNUM_THREADS=256 \ + -DDYNAMIC_ARCH=ON + + cmake --build build + + srcdir=$(pwd) + + # check + cd "$srcdir"/build + ctest + + cd "$srcdir" + cmake --install build + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'ARPNG' ]; then exit; fi + # orig: https://github.com/opencollab/arpack-ng/archive/refs/tags/3.9.1.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/8f66485ae9d7e676b42aeead2bf5757e/arpack-ng-3.9.1.tar.gz + # https://slackbuilds.org/repository/15.0/academic/arpack-ng/ + # postponed for the next build +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'QR' ]; then exit; fi + + # orig: https://github.com/mpimd-csc/qrupdate-ng/archive/refs/tags/v1.1.5.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/c5c61b8d6401508feefd56efed0f6a5a/qrupdate-ng-1.1.5.tar.gz + + test -e qrupdate-ng-1.1.5.tar.gz || wget -nv $BEEHIVE + test -d qrupdate-ng-1.1.5 || tar -xf qrupdate-ng-1.1.5.tar.gz + cd qrupdate-ng-1.1.5 + + mkdir -p build + cd build + + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + .. + + make -j $NPROC + make install + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'SSP' ]; then exit; fi + + # orig: https://github.com/DrTimothyAldenDavis/SuiteSparse/archive/refs/tags/v7.10.3.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/d824ca42257575397d384bbbf99cf10e/SuiteSparse-7.10.3.tar.gz + + test -e SuiteSparse-7.10.3.tar.gz || wget -nv $BEEHIVE + test -d SuiteSparse-7.10.3 || tar -xf SuiteSparse-7.10.3.tar.gz + cd SuiteSparse-7.10.3 + + mkdir -p build + cd build + + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + .. + + make -j $NPROC + make install + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'SD' ]; then exit; fi + + # orig: https://github.com/LLNL/sundials/releases/download/v7.3.0/sundials-7.3.0.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/2e301e1ed3356b80145d7c142d467ec9/sundials-7.3.0.tar.gz + + test -e sundials-7.3.0.tar.gz || wget -nv $BEEHIVE + test -d sundials-7.3.0 || tar -xf sundials-7.3.0.tar.gz + cd sundials-7.3.0 + + mkdir -p build + cd build + + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DENABLE_KLU=ON \ + -DEXAMPLES_ENABLE_C=OFF \ + -DEXAMPLES_ENABLE_CXX=OFF \ + -DEXAMPLES_INSTALL=OFF \ + .. + + make -j $NPROC + make install + +) + +# ------------------------------------------------------------------ Octave + +( if ! [ $TASK = 'ALL' -o $TASK = 'OCT' ]; then exit; fi + + # orig: https://ftp.halifax.rwth-aachen.de/gnu/octave/octave-10.2.0.tar.gz + BEEHIVE=https://beehive.molgen.mpg.de/ff45483bef60b83f5b95cc5dd477e206/octave-10.2.0.tar.gz + + test -e octave-10.2.0.tar.gz || wget -nv $BEEHIVE + test -d octave-10.2.0 || tar -xf octave-10.2.0.tar.gz + + mkdir -p octave-10.2.0-build/build + cd octave-10.2.0-build/build + + LDFLAGS=${LDFLAGS:-} + # lsundials_core -> Workaround build failure with sundials 7 + # LDFLAGS+=" -lsundials_core" \ + + COMMONBUILDFLAGS='-O2 -fPIC -I $PREFIX/include' + + OPENBLASLIB="$PREFIX/lib/libopenblas.so.0.3" + + LDFLAGS+=" -L$PREFIX/lib" \ + ../../octave-10.2.0/configure V=1 \ + --prefix=$PREFIX \ + --with-openssl=auto \ + --with-blas=$OPENBLASLIB \ + --with-lapack=$OPENBLASLIB \ + CFLAGS="$COMMONBUILDFLAGS" \ + CXXFLAGS="$COMMONBUILDFLAGS" \ + FFLAGS="$COMMONBUILDFLAGS" \ + FCFLAGS="$COMMONBUILDFLAGS" + + sed -i 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool # Fix overlinking + + make -j $NPROC V=1 + make install + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'PKG' ]; then exit; fi + # also install some popular packages + # --> https://gnu-octave.github.io/packages/ + + mkdir -p packages_global + cd packages_global + + # arduino: would be a nice to have, but probably the hardware libs are missing, so skip them for now + # https://downloads.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/instrument-control-0.9.4.tar.gz \ + # https://github.com/gnu-octave/octave-arduino/releases/download/release-0.12.1/arduino-0.12.1.tar.gz ; do + + + # Thu Jul 3 15:20:50 CEST 2025 - new failures + # https://github.com/ltfat/ltfat/releases/download/v2.6.0/ltfat-2.6.0-of.tar.gz \ + # https://github.com/PREDICT-EPFL/piqp/releases/download/v0.4.1/piqp-octave.tar.gz \ + # https://github.com/shsajjadi/OctaveCoder/releases/download/coder-1.9.2/coder-1.9.2.tar.gz \ + + # cache em ... + for PKG in \ + https://github.com/gnu-octave/pkg-control/releases/download/control-4.1.1/control-4.1.1.tar.gz \ + https://github.com/gnu-octave/pkg-octave-doc/archive/refs/tags/release-0.5.5.tar.gz \ + https://downloads.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/symbolic-3.2.1.tar.gz \ + https://github.com/ONSAS/ONSAS.m/archive/refs/tags/v0.2.5.tar.gz \ + https://github.com/stk-kriging/stk/releases/download/2.8.1/stk-2.8.1-octpkg.tar.gz \ + https://github.com/apjanke/octave-tablicious/releases/download/v0.4.4/tablicious-0.4.4.tar.gz \ + https://github.com/gnu-octave/statistics/archive/refs/tags/release-1.7.3.tar.gz \ + https://sourceforge.net/projects/geographiclib/files/distrib-Octave/geographiclib-octave-2.3.3.tar.gz \ + https://github.com/gnu-octave/statistics-resampling/archive/refs/tags/5.6.0.tar.gz \ + https://github.com/wgreene310/pde1dm/archive/v1.3.tar.gz \ + https://github.com/gapost/hdf5oct/archive/refs/tags/1.0.0.tar.gz ; do + BN=${PKG##*/} + if ! [ -e "$BN" ]; then wget -nv "$PKG"; fi + TARS+=($BN) + done + + # install + for TAR in ${TARS[*]}; do + echo "# ====== installing $TAR" + echo pkg install -verbose -global $TAR | octave --no-gui + echo "# ===================================================== DONE" + done + +) + +( if ! [ $TASK = 'ALL' -o $TASK = 'LIBCHK' ]; then exit; fi + # do some bookkeeping on the libs, use readelf, ldd + cd $PREFIX + # find -type f -name 'lib*.so.*' | grep -v /build + for SO in $(find lib -type f -name 'lib*.so.*'); do + echo "# --- $SO ---" + readelf -d $SO | grep -i -e needed -e soname -e rpath + echo '' + ldd $SO | cut -f2- + echo '' + done 2>&1 | tee $BUILDDIR/lib_report + echo "# created $BUILDDIR/lib_report" +) + +# -------------------------------------------------------------------- Done