Mercurial > octave
view .github/workflows/make.yaml @ 32922:ab643c7c1c10
maint: Merge stable to default.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sat, 03 Feb 2024 15:33:45 +0100 |
parents | 21e30d912f02 8239df5ad55f |
children | 000cb78b35fc 477264afba70 |
line wrap: on
line source
name: make on: [push] concurrency: ci-${{ github.ref }} jobs: ubuntu: runs-on: ${{ matrix.os }} strategy: # Allow other runners in the matrix to continue if some fail fail-fast: false matrix: # For available GitHub-hosted runners, see: # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners os: [ubuntu-22.04, ubuntu-20.04] compiler: [gcc, clang] include: - compiler: gcc compiler-pkgs: "g++ gcc" cc: "gcc" cxx: "g++" extra-config-flags: "" - compiler: clang compiler-pkgs: "clang libc++-dev libc++abi-dev" cc: "clang" cxx: "clang++ -stdlib=libc++" extra-config-flags: "--without-spqr --without-magick" # "ccache" on Ubuntu 20.04 doesn't compress the cache. # Clang seems to generally require less cache size (smaller object files?). - ccache-max: 1.2G - os: ubuntu-20.04 compiler: gcc ccache-max: 6G - os: ubuntu-22.04 compiler: gcc ccache-max: 1.2G - os: ubuntu-20.04 compiler: clang ccache-max: 3G - os: ubuntu-22.04 compiler: clang ccache-max: 400M name: ${{ matrix.os }} ${{ matrix.compiler }} env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} steps: - name: checkout repository uses: actions/checkout@v3 - name: install dependencies env: COMPILER_PKGS: ${{ matrix.compiler-pkgs }} run: | sudo apt -qq update sudo apt install -y $COMPILER_PKGS autoconf automake bison ccache \ dvipng epstool fig2dev flex gfortran gnuplot-x11 gperf gzip \ icoutils libarpack2-dev libblas-dev libcurl4-gnutls-dev \ libfftw3-dev libfltk1.3-dev libfontconfig1-dev libfreetype6-dev \ libgl1-mesa-dev libgl2ps-dev libglpk-dev libgraphicsmagick++1-dev \ libhdf5-dev liblapack-dev libosmesa6-dev libpcre2-dev \ libqhull-dev libqscintilla2-qt5-dev libqrupdate-dev \ libreadline-dev librsvg2-bin libsndfile1-dev libsuitesparse-dev \ libsundials-dev libtool libxft-dev make openjdk-8-jdk \ perl portaudio19-dev pstoedit qtbase5-dev qttools5-dev \ qttools5-dev-tools rapidjson-dev rsync tar texinfo \ texlive-latex-extra xvfb zlib1g-dev - name: prepare ccache # create key with human readable timestamp # used in action/cache/restore and action/cache/save steps id: ccache-prepare run: | echo "key=ccache:${{ matrix.os }}:${{ matrix.compiler }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - name: restore ccache # setup the github cache used to maintain the ccache from one job to the next uses: actions/cache/restore@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} restore-keys: | ccache:${{ matrix.os }}:${{ matrix.compiler }}:${{ github.ref }} ccache:${{ matrix.os }}:${{ matrix.compiler }}:refs/heads/default - name: configure ccache env: CCACHE_MAX: ${{ matrix.ccache-max }} run: | test -d ~/.ccache || mkdir ~/.ccache echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf ccache -s echo "/usr/lib/ccache" >> $GITHUB_PATH - name: bootstrap run: GNULIB_URL=https://github.com/coreutils/gnulib.git ./bootstrap - name: configure timeout-minutes: 30 run: | echo $PATH echo which ccache which ccache which $CC echo $CC --version $CC --version which ${CXX% *} echo ${CXX% *} --version ${CXX% *} --version which gfortran echo gfortran --version gfortran --version mkdir .build cd .build && ../configure \ CPPFLAGS="-I/usr/include/hdf5/serial -I/usr/include/suitesparse" \ LDFLAGS="-L/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/hdf5/serial" \ ${{ matrix.extra-config-flags }} - name: build # Parallel make seems to fail intermittently when creating the figures # for the manual. The error message says it fails to connect to a # display. Maybe an xvfb issue? # Use single job make for now which seems to work more reliably. run: XDG_RUNTIME_DIR=$RUNNER_TEMP xvfb-run -a make -C ./.build all V=1 - name: ccache status run: ccache -s - name: save ccache # Save the cache after we are done (successfully) building uses: actions/cache/save@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} - name: check timeout-minutes: 60 run: XDG_RUNTIME_DIR=$RUNNER_TEMP xvfb-run -a make -C ./.build check | tee ./test-suite.log - name: display test suite log continue-on-error: true # Displaying the log shouldn't take long. Cancel the step if it does. timeout-minutes: 5 run: cat ./.build/test/fntests.log - name: test history file creation # see bug #62365 # Pipe to an interactive session to trigger appending the command to # the history. This will trigger the creation of a history file. run: | echo "history_file (make_absolute_filename ('./a/b/c/history')); disp ('test')" | ./.build/run-octave -i [ -f ./a/b/c/history ] || echo "::warning::Creating history file failed" - name: install run: | sudo make -C ./.build install - name: test stand-alone executable run: | unset CC unset CXX cd examples/code mkoctfile --link-stand-alone embedded.cc -o embedded LD_LIBRARY_PATH="/usr/local/lib/octave/$(octave --eval "disp(version())")" \ ./embedded - name: analyze test suite results # Make sure the test summary lists 0 "FAIL"s and no "REGRESSION" run: | [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] || exit 1 [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] || exit 1 echo No unknown failing tests. alpine: runs-on: ubuntu-latest name: Alpine (x86, musl) defaults: run: # Use emulated shell as default shell: alpine.sh {0} env: LIBGL_ALWAYS_SOFTWARE: "1" steps: - name: get CPU information shell: bash run: | cat /proc/cpuinfo - name: checkout repository uses: actions/checkout@v3 - name: install dependencies uses: jirutka/setup-alpine@v1 with: # For available CPU architectures, see: # https://github.com/marketplace/actions/setup-alpine-linux-environment arch: x86 # QScintilla-Qt6 is currently not distributed by Alpine Linux. When # it is, consider switching to Qt6 packages: # qt6-qt5compat-dev # qt6-qttools-dev # The following packages are only needed to buid and install gl2ps: # cmake # wget # libpng # sudo packages: > build-base autoconf automake m4 git ccache coreutils gfortran flex gperf icoutils mesa-dri-gallium libtool libltdl rsvg-convert texlive-dvi arpack-dev bison curl-dev fftw-dev fltk-dev fontconfig-dev freetype-dev ghostscript-dev glpk-dev glu-dev gnuplot graphicsmagick-dev hdf5-dev lcms2-dev libsm-dev libsndfile-dev openblas-dev pcre2-dev perl portaudio-dev qhull-dev qrupdate-dev qscintilla-dev qt5-qttools-dev qscintilla-dev rapidjson-dev readline-dev suitesparse-dev texinfo xvfb-run xz-dev zlib-dev bzip2 gzip tar zip cmake wget libpng sudo - name: prepare ccache # create key with human readable timestamp # used in action/cache/restore and action/cache/save steps id: ccache-prepare run: | echo "key=ccache:alpine:x86:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - name: restore ccache # setup the github cache used to maintain the ccache from one job to the next uses: actions/cache/restore@v3 with: # location of the ccache of the chroot in the root file system path: /home/runner/rootfs/alpine-latest-x86/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} restore-keys: | ccache:alpine:x86:${{ github.ref }} ccache:alpine:x86:refs/heads/default - name: configure ccache run: | test -d ~/.ccache || mkdir ~/.ccache echo "max_size = 1G" >> ~/.ccache/ccache.conf echo "compression = true" >> ~/.ccache/ccache.conf ccache --version ccache -p ccache -s echo "/usr/lib/ccache/bin" >> $GITHUB_PATH - name: build gl2ps # gl2ps is currently not distributed by Alpine Linux. # We need it for printing. run: | mkdir -p gl2ps && cd gl2ps printf "::group::\033[0;32m==>\033[0m Download tarball\n" wget -O gl2ps-1.4.2.tgz https://geuz.org/gl2ps/src/gl2ps-1.4.2.tgz echo "::endgroup::" printf "::group::\033[0;32m==>\033[0m Unpack tarball\n" tar zxvf gl2ps-1.4.2.tgz echo "::endgroup::" printf "::group::\033[0;32m==>\033[0m Configure\n" mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release ../gl2ps-1.4.2 echo "::endgroup::" printf "::group::\033[0;32m==>\033[0m Build\n" cmake --build . echo "::endgroup::" printf "::group::\033[0;32m==>\033[0m Install\n" sudo cmake --install . echo "::endgroup::" - name: bootstrap run: GNULIB_URL=https://github.com/coreutils/gnulib.git ./bootstrap - name: configure timeout-minutes: 30 run: | echo $PATH echo which ccache which ccache which gcc echo gcc --version gcc --version which g++ echo g++ --version g++ --version which gfortran echo gfortran --version gfortran --version mkdir .build cd .build && ../configure - name: build # Parallel make seems to fail intermittently when creating the figures # for the manual. The error message says it fails to connect to a # display. Maybe an xvfb issue? # Use single job make for now which seems to work more reliably. run: | XDG_RUNTIME_DIR=$RUNNER_TEMP xvfb-run -a make -C ./.build all V=1 - name: ccache status run: ccache -s - name: save ccache # Save the cache after we are done (successfully) building uses: actions/cache/save@v3 with: path: /home/runner/rootfs/alpine-latest-x86/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} - name: check timeout-minutes: 60 run: | XDG_RUNTIME_DIR=$RUNNER_TEMP \ xvfb-run -a make -C ./.build check | tee ./test-suite.log - name: display test suite log continue-on-error: true # Displaying the log shouldn't take long. Cancel the step if it does. timeout-minutes: 5 run: cat ./.build/test/fntests.log - name: test history file creation # see bug #62365 # Pipe to an interactive session to trigger appending the command to # the history. This will trigger the creation of a history file. run: | echo "history_file (make_absolute_filename ('./a/b/c/history')); disp ('test')" | ./.build/run-octave -i [ -f ./a/b/c/history ] || echo "::warning::Creating history file failed" - name: install run: | sudo make -C ./.build install - name: test stand-alone executable run: | cd examples/code mkoctfile --link-stand-alone embedded.cc -o embedded LD_LIBRARY_PATH="/usr/local/lib/octave/$(octave --eval "disp(version())")" ./embedded - name: analyze test suite results # Make sure the test summary lists 0 "FAIL"s and no "REGRESSION" run: | [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] \ || echo "::warning::At least one test failed" [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] \ || echo "::warning::At least one regression in test suite" echo Finished analyzing test suite results. macos: runs-on: ${{ matrix.os }} name: ${{ matrix.os }} Qt${{ matrix.qt }} strategy: # Allow other runners in the matrix to continue if some fail fail-fast: false matrix: # For available GitHub-hosted runners, see: https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners os: [macos-14, macos-13] # Most (or all) homebrew packages are compiled with clang and link # against libc++. So we also use clang to avoid issues with symbols # that don't match. # compiler: [real-gcc, clang] compiler: [clang] qt: [6] include: # - compiler: real-gcc # cc: "/usr/local/bin/gcc-10" # cxx: "/usr/local/bin/g++-10" # cppflags: "-I/usr/local/opt/hdf5/include -I/usr/local/opt/gl2ps/include -I/usr/local/opt/glpk/include -I/usr/local/opt/pcre/include -I/usr/local/opt/qscintilla2/include -I/usr/local/opt/suite-sparse/include -I/usr/local/opt/sundials/include" # ldflags: "-L/usr/local/opt/hdf5/lib -L/usr/local/opt/gl2ps/lib -L/usr/local/opt/glpk/lib -L/usr/local/opt/pcre/lib -L/usr/local/opt/qscintilla2/lib -L/usr/local/opt/suite-sparse/lib -L/usr/local/opt/sundials/lib" - compiler: clang cc: "clang" cxx: "clang++" # Qt6 doesn't install pkg-config files on macOS. See: https://bugreports.qt.io/browse/QTBUG-86080 # So, we need to provide the necessary flags manually. qt-cppflags: "-I${HOMEBREW_PREFIX}/opt/qt@6/include/QtCore -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtGui -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtHelp -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtNetwork -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtOpenGL -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtOpenGLWidgets -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtPrintSupport -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtSql -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtWidgets -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtXml -I${HOMEBREW_PREFIX}/opt/qt@6/include/QtCore5Compat" qt-ldflags: "-F${HOMEBREW_PREFIX}/opt/qt@6/Frameworks" qt-libs: "-framework QtCore -framework QtGui -framework QtHelp -framework QtNetwork -framework QtOpenGL -framework QtOpenGLWidgets -framework QtPrintSupport -framework QtSql -framework QtWidgets -framework QtXml -framework QtCore5Compat" - os: macos-13 qt: "5" cc: "clang" cxx: "clang++" # SUNDIALS >= 6.5.0 doesn't compile with the default flags determined # by the configure script. Set CXX manually to enable building with it. cxx-compiler-flags: "-std=gnu++14" env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} steps: - name: checkout repository uses: actions/checkout@v3 - name: install dependencies # This step sometimes takes long and still recovers. But sometimes it # seems to hang indefinitely. # Use a pretty long timeout (but still less than the default 6 hours). timeout-minutes: 75 # Homebrew's Python conflicts with the Python that comes pre-installed # on the GitHub runners. Some of Octave's dependencies depend on # different versions of Homebrew's Python. Enforce using the ones from # Homebrew to avoid errors on updates. # See: https://github.com/orgs/Homebrew/discussions/3928 # It looks like "gfortran" isn't working correctly unless "gcc" is # re-installed. # See also: https://formulae.brew.sh/formula/octave#default # The packages are listed in (alphabetically sorted) blocks: # The first block is for "direct" dependencies. # The second block is for additional dependencies needed when building from a release tarball. # The third block is for additional dependencies needed when building from a repository checkout. run: | brew update brew install --overwrite python@3.11 python@3.12 brew reinstall gcc brew install arpack epstool fftw fig2dev fltk fontconfig freetype \ ghostscript gl2ps glpk gnuplot graphicsmagick hdf5 libsndfile \ libtool openblas pcre2 portaudio pstoedit qhull qrupdate \ qscintilla2 qt@${{ matrix.qt }} rapidjson readline suite-sparse sundials texinfo \ ccache gnu-sed openjdk pkg-config \ automake autoconf bison gettext icoutils librsvg mactex-no-gui eval "$(/usr/libexec/path_helper)" HOMEBREW_PREFIX=$(brew --prefix) echo "HOMEBREW_PREFIX=$(brew --prefix)" >> $GITHUB_ENV echo "/Library/TeX/texbin" >> $GITHUB_PATH echo "${HOMEBREW_PREFIX}/opt/qt@${{ matrix.qt }}/bin" >> $GITHUB_PATH echo "${HOMEBREW_PREFIX}/opt/texinfo/bin" >> $GITHUB_PATH echo "${HOMEBREW_PREFIX}/opt/bison/bin" >> $GITHUB_PATH echo "${HOMEBREW_PREFIX}/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH - name: prepare ccache # create key with human readable timestamp # used in action/cache/restore and action/cache/save steps id: ccache-prepare run: | echo "key=ccache:${{ matrix.os }}:${{ matrix.compiler }}:qt${{ matrix.qt }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - name: restore ccache # setup the github cache used to maintain the ccache from one job to the next uses: actions/cache/restore@v3 id: restore-ccache with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} restore-keys: | ccache:${{ matrix.os }}:${{ matrix.compiler }}:qt${{ matrix.qt }}:${{ github.ref }} ccache:${{ matrix.os }}:${{ matrix.compiler }}:qt${{ matrix.qt }}:refs/heads/default - name: configure ccache # The cache doesn't seem to compress well on macOS. Is it already compressed? # Limit the maximum size to avoid exceeding the total cache limits. run: | test -d /Users/runner/Library/Preferences/ccache || mkdir /Users/runner/Library/Preferences/ccache echo "max_size = 0.9G" >> /Users/runner/Library/Preferences/ccache/ccache.conf ccache -s echo "${HOMEBREW_PREFIX}/opt/ccache/libexec" >> $GITHUB_PATH - name: bootstrap run: GNULIB_URL=https://github.com/coreutils/gnulib.git ./bootstrap - name: configure timeout-minutes: 30 env: MY_CPPFLAGS: ${{ matrix.cppflags }} MY_LDFLAGS: ${{ matrix.ldflags }} # This is a hodgepodge of configure flags put together from the # buildbot rules: # https://hg.octave.org/octave-buildbot/file/tip/master.cfg#l543 # And the homebrew formula: # https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/octave.rb # Amended with additional flags that seem to be needed. # Not all of those might be needed or be correct. run: | echo $PATH echo which ccache which ccache which $CC echo $CC --version $CC --version which $CXX echo $CXX --version $CXX --version which gfortran echo gfortran --version gfortran --version mkdir .build cd .build && ../configure \ CXX="${CXX} ${{ matrix.cxx-compiler-flags }}" \ F77="ccache gfortran" \ CPPFLAGS="-I${HOMEBREW_PREFIX}/opt/gettext/include -I${HOMEBREW_PREFIX}/opt/icu4c/include -I${HOMEBREW_PREFIX}/opt/qt@${{ matrix.qt }}/include -I${HOMEBREW_PREFIX}/opt/readline/include -I${HOMEBREW_PREFIX}/opt/sqlite/include $MY_CPPFLAGS -I${HOMEBREW_PREFIX}/include" \ CXXFLAGS="-O2 -g" \ LDFLAGS="-L${HOMEBREW_PREFIX}/opt/bison/lib -L${HOMEBREW_PREFIX}/opt/gettext/lib -L${HOMEBREW_PREFIX}/opt/icu4c/lib -L${HOMEBREW_PREFIX}/opt/readline/lib -L${HOMEBREW_PREFIX}/opt/sqlite/lib $MY_LDFLAGS -L${HOMEBREW_PREFIX}/lib" \ PKG_CONFIG_PATH="${HOMEBREW_PREFIX}/opt/openblas/lib/pkgconfig:${HOMEBREW_PREFIX}/opt/icu4c/lib/pkgconfig:${HOMEBREW_PREFIX}/opt/qt@${{ matrix.qt }}/lib/pkgconfig" \ --with-qt=${{ matrix.qt }} \ QCOLLECTIONGENERATOR="qhelpgenerator" \ QT_CPPFLAGS="${{ matrix.qt-cppflags }}" \ QT_LDFLAGS="${{ matrix.qt-ldflags }}" \ QT_LIBS="${{ matrix.qt-libs }}" \ --with-x=no \ --with-blas="-L${HOMEBREW_PREFIX}/opt/openblas/lib -lopenblas" \ --with-java-homedir="${HOMEBREW_PREFIX}/opt/openjdk" \ --prefix="${HOME}/usr" - name: build run: make -C ./.build all -j3 V=1 - name: ccache status run: ccache -s - name: save ccache # Save the cache after we are done (successfully) building uses: actions/cache/save@v3 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} - name: check # Continuing on error in this step means that jobs will be "green" even # if the test suite crashes. But if we don't continue, we'll loose the # ccache and other jobs will be cancelled, too. # It would be nice if we could mark the job as "yellow" (and continue) # in that case. The second best thing is to display a warning in the # job summary (see below). continue-on-error: true timeout-minutes: 60 run: | echo 'makeinfo_program ("${HOMEBREW_PREFIX}/opt/texinfo/bin/makeinfo");' >> ./scripts/startup/site-rcfile make -C ./.build check | tee ./test-suite.log - name: display test suite log continue-on-error: true # Displaying the log shouldn't take long. Cancel the step if it does. timeout-minutes: 5 run: cat ./.build/test/fntests.log - name: test history file creation # see bug #62365 # Pipe to an interactive session to trigger appending the command to # the history. This will trigger the creation of a history file. run: | echo "history_file (make_absolute_filename ('./a/b/c/history')); disp ('test')" | ./.build/run-octave -i [ -f ./a/b/c/history ] || echo "::warning::Creating history file failed" - name: install run: | mkdir -p /Users/runner/usr make -C ./.build install - name: test stand-alone executable run: | unset CC unset CXX cd examples/code PATH="/Users/runner/usr/bin:$PATH" \ mkoctfile --link-stand-alone embedded.cc -o embedded ./embedded - name: analyze test suite results # Make sure the test summary lists 0 "FAIL"s and no "REGRESSION" run: | [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] || exit 1 [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] || exit 1 echo No unknown failing tests. mingw: runs-on: ${{ matrix.os }} name: mingw-w64 ${{ matrix.msystem }} defaults: run: # Use MSYS2 as default shell shell: msys2 {0} strategy: # Allow other runners in the matrix to continue if some fail fail-fast: false matrix: # For available GitHub-hosted runners, see: https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners os: [windows-latest] msystem: [MINGW64, CLANG64] include: - msystem: MINGW64 mingw-prefix: mingw64 target-prefix: mingw-w64-x86_64 cc: gcc cxx: g++ f77: gfortran extra-config-flags: "" ccache-max: 0.9G allow-error: false - msystem: CLANG64 mingw-prefix: clang64 target-prefix: mingw-w64-clang-x86_64 cc: clang # It looks like we and graphicsmagick++ aren't ready for C++17 yet. cxx: "clang++ -std=gnu++14" f77: flang # Clang seems to require a different set of dllexport attributes than GCC. # autoconf and libtool still need help to correctly invoke flang. extra-config-flags: --disable-lib-visibility-flags ac_cv_f77_compiler_gnu=yes lt_cv_prog_gnu_ld=yes ccache-max: 400M # This configuration is not fully supported yet allow-error: true env: CHERE_INVOKING: 1 CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} F77: ${{ matrix.f77 }} # perl uses cmd shell by default PERL5SHELL: bash -l -c steps: - name: get CPU name # The runners for the 32-bit target sometimes get stuck in configure # when using the Fortran compiler. # Does that error depend on the processor of the selected runner? shell: pwsh run : | Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: install MSYS2 build environment uses: msys2/setup-msys2@v2 with: update: true # Use pre-installed version to save disc space on partition with source. # We need that space for building. release: false # The packages are listed in (alphabetically sorted) blocks: # The first block is for mandatory dependencies. # The second block is for optional dependencies needed when building from a release tarball. # The third block is for additional dependencies needed when building from a repository checkout. # The fourth block is for additional run-time dependencies (to run test suite) that aren't needed to build. install: >- base-devel ${{ matrix.target-prefix }}-autotools ${{ matrix.target-prefix }}-cc ${{ matrix.target-prefix }}-fc ${{ matrix.target-prefix }}-gperf ${{ matrix.target-prefix }}-openblas ${{ matrix.target-prefix }}-pcre2 ${{ matrix.target-prefix }}-arpack ${{ matrix.target-prefix }}-curl ${{ matrix.target-prefix }}-fftw ${{ matrix.target-prefix }}-fltk ${{ matrix.target-prefix }}-gl2ps ${{ matrix.target-prefix }}-glpk ${{ matrix.target-prefix }}-ghostscript ${{ matrix.target-prefix }}-gnuplot ${{ matrix.target-prefix }}-graphicsmagick ${{ matrix.target-prefix }}-hdf5 ${{ matrix.target-prefix }}-libsndfile ${{ matrix.target-prefix }}-portaudio ${{ matrix.target-prefix }}-qhull ${{ matrix.target-prefix }}-qrupdate ${{ matrix.target-prefix }}-qscintilla ${{ matrix.target-prefix }}-qt5-base ${{ matrix.target-prefix }}-qt5-imageformats ${{ matrix.target-prefix }}-qt5-svg ${{ matrix.target-prefix }}-qt5-tools ${{ matrix.target-prefix }}-rapidjson ${{ matrix.target-prefix }}-suitesparse ${{ matrix.target-prefix }}-sundials git ${{ matrix.target-prefix }}-ccache ${{ matrix.target-prefix }}-icoutils ${{ matrix.target-prefix }}-librsvg texinfo unzip zip msystem: ${{ matrix.msystem }} - name: checkout repository uses: actions/checkout@v3 - name: prepare ccache # create key with human readable timestamp # used in action/cache/restore and action/cache/save steps id: ccache-prepare run: | echo "ccachedir=$(cygpath -m $(ccache -k cache_dir))" >> $GITHUB_OUTPUT echo "key=ccache:${{ matrix.os }}:${{ matrix.msystem }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT echo "timestamp=$(date +"%Y-%m-%d_%H-%M-%S")" >> $GITHUB_OUTPUT - name: restore ccache # Setup the github cache used to maintain the ccache from one job to the next uses: actions/cache/restore@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} restore-keys: | ccache:${{ matrix.os }}:${{ matrix.msystem }}:${{ github.ref }} ccache:${{ matrix.os }}:${{ matrix.msystem }}:refs/heads/default - name: configure ccache # Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota. run: | which ccache test -d ${{ steps.ccache-prepare.outputs.ccachedir }} || mkdir -p ${{ steps.ccache-prepare.outputs.ccachedir }} echo "max_size = ${{ matrix.ccache-max }}" > ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf echo "compression = true" >> ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf ccache -p ccache -s # create ccache helper script for Fortran compiler echo -e '#!/bin/bash\nccache '$MINGW_PREFIX'/bin/'$F77' "$@"' > $MINGW_PREFIX/lib/ccache/bin/$F77 # prepend path to ccache helper scripts to PATH echo 'export PATH="$MINGW_PREFIX/lib/ccache/bin:$PATH"' >> ~/.bash_profile - name: bootstrap run: GNULIB_URL=https://github.com/coreutils/gnulib.git ./bootstrap - name: configure # configure sometimes hangs while compiling 32bit Fortran. # It should take much less than 30 minutes. Cancel the step if it takes longer. timeout-minutes: 30 # FIXME: Fix building with Java support. Override JAVA_HOME for now. # FIXME: How do we get a working TeX environment in MSYS2? Disable building the documentation for now. run: | echo $PATH which $CC echo $CC --version $CC --version which ${CXX% *} echo ${CXX% *} --version ${CXX% *} --version which $F77 echo $F77 --version $F77 --version mkdir .build cd .build && ../configure \ JAVA_HOME="" \ --disable-docs \ ${{ matrix.extra-config-flags }} - name: build # Spawning processes seems to have a big overhead on this platform. Use a somewhat larger number of parallel processes to compensate for that. run: | make -C ./.build all -j8 V=1 - name: ccache status continue-on-error: true run: ccache -s - name: save ccache # Save the cache after we are done (successfully) building uses: actions/cache/save@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} - name: check # Continuing on error in this step means that jobs will be "green" even # if the test suite crashes. But if we don't continue, we'll loose the # ccache and other jobs will be cancelled, too. # It would be nice if we could mark the job as "yellow" (and continue) # in that case. The second best thing is to display a warning in the # job summary (see below). continue-on-error: true timeout-minutes: 60 # Perl scripts cannot be run as executables on Windows (no shebang mechanism). # We need to wrap them by calling the perl executable explicitly. # mkoctfile seems to have trouble when gcc is called via ccache. So, # remove the directory with the ccache wrappers from PATH. run: | echo "makeinfo_program (sprintf ('%s && cd %s && perl makeinfo', [s=nthargout(2, @system, 'cygpath -w /usr/bin')](1:2), strtrim (s)));" \ >> ./scripts/startup/site-rcfile export PATH=$(echo "$PATH" | sed -e "s|$MINGW_PREFIX/lib/ccache/bin:||g") make -C ./.build check RUN_OCTAVE_OPTIONS="--no-gui-libs" | tee ./test-suite.log - name: display test suite log continue-on-error: true # Displaying the log shouldn't take long. Cancel the step if it does. timeout-minutes: 5 run: cat ./.build/test/fntests.log - name: test history file creation # see bug #62365 # Pipe to an interactive session to trigger appending the command to # the history. This will trigger the creation of a history file. run: | echo "history_file (make_absolute_filename ('./a/b/c/history')); disp ('test')" | ./.build/run-octave -i [ -f ./a/b/c/history ] || echo "::warning::Creating history file failed" - name: install run: | mkdir -p /c/octave/pkg make -C ./.build DESTDIR=/c/octave/pkg install - name: test stand-alone executable continue-on-error: ${{ matrix.allow-error }} run: | unset CC unset CXX export PATH=$(echo "$PATH" | sed -e "s|$MINGW_PREFIX/lib/ccache/bin:||g") export PATH="/c/octave/pkg/${{ matrix.mingw-prefix }}/bin:$PATH" cd examples/code mkoctfile --link-stand-alone embedded.cc -o embedded ./embedded.exe - name: analyze test suite results # Make sure the test summary lists 0 "FAIL"s and no "REGRESSION" run: | [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] || echo "::warning::At least one test failed" [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] || echo "::warning::At least one regression in test suite" echo Finished analyzing test suite results. - name: compress build artifact if: matrix.msystem == 'MINGW64' continue-on-error: true run: | cd /c/octave/pkg tar -cvzf octave.tar.gz * - name: upload build artifact if: matrix.msystem == 'MINGW64' continue-on-error: true uses: actions/upload-artifact@v3 with: name: ${{ matrix.target-prefix }}-octave-${{ steps.ccache-prepare.outputs.timestamp }} path: C:\octave\pkg\octave.tar.gz retention-days: 7 cygwin: runs-on: ${{ matrix.os }} defaults: run: # Use Cygwin bash as default shell shell: C:\cygwin\bin\bash.exe --login -eo pipefail -o igncr '{0}' strategy: # Allow other runners in the matrix to continue if some fail fail-fast: false matrix: # For available GitHub-hosted runners, see: https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners os: [windows-latest] env: CHERE_INVOKING: "1" CC: gcc CXX: g++ F77: gfortran # ccache 3.1 doesn't read configuration files CCACHE_COMPRESS: "1" steps: - name: get CPU name shell: pwsh run : | Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: checkout repository # This must be done before installing Cygwin because their git is # incompatible with this action. uses: actions/checkout@v3 - name: install Cygwin build environment uses: cygwin/cygwin-install-action@v2 with: # The packages are listed in (alphabetically sorted) blocks: # The first block is for mandatory dependencies. # The second block is for optional dependencies needed when building from a release tarball. # The third block is for additional dependencies needed when building from a repository checkout. # The fourth block is for additional run-time dependencies (to run test suite) that aren't needed to build. # FIXME: libklu-devel should depend on libbtf-devel. Install it manually even if Octave doesn't explicitly use it. packages: >- autoconf automake make gcc-g++ gcc-fortran bison dash flex gperf libtool liblapack-devel libpcre2-devel libreadline-devel ghostscript gnuplot-base libamd-devel libarpack-devel libbtf-devel libbz2-devel libcamd-devel libccolamd-devel libcholmod-devel libcolamd-devel libcurl-devel libcxsparse-devel libfftw3-devel libfltk-devel libfontconfig-devel libfreetype-devel libGL-devel libgl2ps-devel libglpk-devel libGLU-devel libgomp1 libGraphicsMagick-devel libhdf5-devel libiconv-devel libklu-devel libportaudio-devel libqhull-devel libqrupdate-devel libqscintilla2_qt5-devel libQt5Core-devel libQt5Gui-devel libQt5Help-devel libsndfile-devel libsuitesparseconfig-devel libsundials-devel libspqr-devel libumfpack-devel qt5-doc-tools rapidjson-devel ccache git icoutils rsvg texinfo unzip zip - name: prepare ccache # create key with human readable timestamp # used in action/cache/restore and action/cache/save steps id: ccache-prepare run: | echo "ccachedir=$(cygpath -m ~/.ccache)" >> $GITHUB_OUTPUT echo "key=ccache:${{ matrix.os }}:cygwin:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - name: restore ccache # Setup a github cache used to maintain the ccache from one run to the next uses: actions/cache/restore@v3.2.2 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} restore-keys: | ccache:${{ matrix.os }}:cygwin:${{ github.ref }} ccache:${{ matrix.os }}:cygwin:refs/heads/default - name: configure ccache run: | # work around issue with ccache calling itself recursively [ -f /usr/bin/ccache.exe ] && mv /usr/bin/ccache.exe /usr/bin/ccache which ccache ccache -V # ccache 3.1 doesn't read configuration files # test -d ${{ steps.ccache-prepare.outputs.ccachedir }} || mkdir -p ${{ steps.ccache-prepare.outputs.ccachedir }} # echo "max_size = 0.9G" > ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf # echo "compression = true" >> ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf # limit maximum cache size to avoid exceeding the total disk or cache quota ccache -M 0.9G ccache -s # create ccache symlinks for all compilers test -d /usr/lib/ccache/bin || mkdir -p /usr/lib/ccache/bin ln -s /usr/bin/ccache /usr/lib/ccache/bin/${CC}.exe ln -s /usr/bin/ccache /usr/lib/ccache/bin/${CXX}.exe ln -s /usr/bin/ccache /usr/lib/ccache/bin/${F77}.exe # prepend path to ccache symlinks to PATH echo 'export PATH="/usr/lib/ccache/bin:$PATH"' >> ~/.bash_profile - name: bootstrap run: GNULIB_URL=https://github.com/coreutils/gnulib.git ./bootstrap - name: configure # FIXME: Fix building with Java support. Override JAVA_HOME for now. # FIXME: How do we get a working TeX environment in Cygwin? Disable building the documentation for now. run: | echo $PATH which $CC echo $CC --version $CC --version which $CXX echo $CXX --version $CXX --version which $F77 echo $F77 --version $F77 --version mkdir .build cd .build && ../configure \ --libexecdir=/usr/lib \ --enable-shared \ --disable-java \ --disable-docs \ JAVA_HOME="" \ EGREP="grep -E" \ FLIBS="-lgfortran -lquadmath" - name: build # Spawning processes seems to have a big overhead on this platform. Use a somewhat larger number of parallel processes to compensate for that. run: | EGREP="grep -E" make -C ./.build all -j8 V=1 - name: ccache status continue-on-error: true run: ccache -s - name: save ccache # Save the cache after we are done (successfully) building uses: actions/cache/save@v3.2.2 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} - name: check # Continuing on error in this step means that jobs will be "green" even # if the test suite crashes. But if we don't continue, we'll loose the # ccache. # It would be nice if we could mark the job as "yellow" (and continue) # in that case. The second best thing is to display a warning in the # job summary (see below). continue-on-error: true timeout-minutes: 60 # mkoctfile seems to have trouble when gcc is called via ccache. So, # remove the directory with the ccache wrappers from PATH. run: | export PATH=$(echo "$PATH" | sed -e "s|/usr/lib/ccache/bin:||g") EGREP="grep -E" make -C ./.build check | tee ./test-suite.log - name: display test suite log continue-on-error: true # Displaying the log shouldn't take long. Cancel the step if it does. timeout-minutes: 5 run: cat ./.build/test/fntests.log - name: test history file creation # see bug #62365 # Pipe to an interactive session to trigger appending the command to # the history. This will trigger the creation of a history file. run: | echo "history_file (make_absolute_filename ('./a/b/c/history')); disp ('test')" | ./.build/run-octave -i [ -f ./a/b/c/history ] || echo "::warning::Creating history file failed" - name: install run: | make -C ./.build install - name: test stand-alone executable run: | unset CC unset CXX export PATH=$(echo "$PATH" | sed -e "s|/usr/lib/ccache/bin:||g") cd examples/code mkoctfile --link-stand-alone embedded.cc -o embedded ./embedded.exe - name: analyze test suite results # Make sure the test summary lists 0 "FAIL"s and no "REGRESSION" run: | [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] || echo "::warning::At least one test failed" [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] || echo "::warning::At least one regression in test suite" echo Finished analyzing test suite results.