Skip to content

Build and Test Macaulay2 #1376

Build and Test Macaulay2

Build and Test Macaulay2 #1376

Workflow file for this run

################################################################################
#
# Github actions trigger (workflow script) for building Macaulay2
#
# See https://help.github.com/en/actions for the documentation.
#
################################################################################
name: Build and Test Macaulay2
on:
workflow_dispatch:
pull_request:
branches:
- master
- development
schedule:
- cron: '0 6 * * SUN' # runs tests on the main branch every Sunday at 06:00 UTC
concurrency:
# Cancel in-progress runs when a new workflow with the same group name is triggered
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
defaults:
run:
working-directory: M2/BUILD/build
jobs:
build:
if: github.repository == 'Macaulay2/M2' || contains(github.ref, 'global')
name: ${{ matrix.build-system }}-${{ matrix.os }}-${{ matrix.compiler }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
build-system:
- autotools
- cmake
os:
- ubuntu-24.04
- macos-13
compiler:
- default
include:
# This build tests Clang rather than AppleClang (keep)
- build-system: cmake
os: macos-13 # TODO: switch to macos-14 for arm64 testing
compiler: clang-15
cxx: clang++
cc: clang
exclude:
- build-system: cmake
os: macos-13
compiler: default
steps:
- uses: actions/checkout@v4
# ----------------------
# Install missing tools and libraries for macOS
# ----------------------
- name: Install requirements for macOS
if: runner.os == 'macOS'
run: |
brew config
brew tap macaulay2/tap
brew install --overwrite python
brew install automake boost tbb ccache ctags texinfo llvm make ninja yasm libffi msolve
brew install --only-dependencies macaulay2/tap/M2
brew link factory --force
# ----------------------
# Install missing tools and libraries for Linux
# ----------------------
- name: Install requirements for Linux
if: runner.os == 'Linux'
run: |
sudo add-apt-repository -y -n ppa:macaulay2/macaulay2
sudo apt-get update
sudo apt-get install -y -q --no-install-recommends clang-16 gfortran libtool-bin ninja-build yasm ccache
sudo apt-get install -y -q --no-install-recommends liblzma-dev libboost-stacktrace-dev \
libncurses-dev libncurses5-dev libreadline-dev libeigen3-dev libopenblas-dev libxml2-dev \
libgc-dev libgdbm-dev libglpk-dev libgmp3-dev libgtest-dev libmpfr-dev libmpfi-dev libntl-dev gfan \
libgivaro-dev libboost-regex-dev fflas-ffpack libflint-dev libmps-dev libfrobby-dev \
libsingular-dev singular-data libcdd-dev cohomcalg topcom 4ti2 libnormaliz-dev normaliz coinor-csdp \
libnauty-dev nauty lrslib polymake pipx phcpack w3c-markup-validator libtbb-dev qepcad libomp-16-dev msolve
# ----------------------
# Steps common to all build variants
# ----------------------
- name: Prepare build environment
run: |
echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV
echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV
if [[ "${{ runner.os }}" == "Linux" ]]
then shopt -s expand_aliases
alias llvm-config="/usr/bin/llvm-config-16"
echo "/usr/lib/ccache" >> $GITHUB_PATH
echo "/home/linuxbrew/.linuxbrew/bin" >> $GITHUB_PATH
else echo `brew --prefix ccache`/libexec >> $GITHUB_PATH
echo `brew --prefix make `/libexec/gnubin >> $GITHUB_PATH
echo `brew --prefix llvm`/bin >> $GITHUB_PATH
PATH=`brew --prefix llvm`/bin:$PATH
echo `brew --prefix libtool`/libexec/gnubin >> $GITHUB_PATH
fi
# Necessary for clang to find the right libomp
echo "LIBRARY_PATH=`llvm-config --libdir`" >> $GITHUB_ENV
- uses: actions/cache@v4
if: matrix.build-system == 'cmake'
id: restore-cache
with:
path: |
~/.ccache
~/work/M2/M2/M2/BUILD/build/usr-host
key: build-cache-${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.build-system }}-${{ hashFiles('**/cmake/*-libraries.cmake', '.github/workflows/test_build.yml') }}
# ----------------------
# Configure and build M2 using CMake
# ----------------------
- name: Configure Macaulay2 using CMake
if: matrix.build-system == 'cmake'
run: |
cmake -S../.. -B. -GNinja \
-DCMAKE_BUILD_TYPE=Release -DBUILD_NATIVE=OFF \
-DCMAKE_PREFIX_PATH="`brew --prefix`;`brew --prefix libffi`" \
-DCMAKE_INSTALL_PREFIX=/usr \
--debug-trycompile
- name: Build libraries using Ninja
if: matrix.build-system == 'cmake'
run: |
cmake --build . --target build-libraries build-programs
- name: Build Macaulay2 using Ninja
if: matrix.build-system == 'cmake'
run: |
cmake --build . --target M2-core M2-emacs install-packages
if [[ "${{ runner.os }}" == "Linux" ]] && [[ "${{ matrix.build-system }}" == "cmake" ]]; then
sudo apt-get install -y -q --no-install-recommends dpkg-dev
echo "GIT_COMMIT=`git describe --dirty --always --match HEAD`" >> $GITHUB_ENV
cpack -G DEB
fi
# ----------------------
# Configure and build M2 using Autotools
# ----------------------
- name: Configure Macaulay2 using Autotools
if: matrix.build-system == 'autotools'
run: |
../../autogen.sh
export PYVERSION=`python3 -c "from sys import version_info; \
print(f'{version_info.major}.{version_info.minor}')"`
export CPPFLAGS="-I`brew --prefix`/include \
-I`brew --prefix libomp`/include \
-I`brew --prefix readline`/include"
export LDFLAGS="-L`brew --prefix`/lib \
-L`brew --prefix libomp`/lib \
-L`brew --prefix readline`/lib \
-L/Library/Frameworks/Python.framework/Versions/${PYVERSION}/lib"
export F77=gfortran-14
../../configure --enable-download --with-system-gc
- name: Build Macaulay2 using Make
if: matrix.build-system == 'autotools'
run: |
make -j$(nproc 2>/dev/null || sysctl -n hw.logicalcpu)
# ----------------------
# Run tests
# ----------------------
- name: Run Tests using CTest
if: matrix.build-system == 'cmake' && runner.os == 'macOS'
run: |
set -xe
./M2 -q --check 1
./M2 -q --check 2
./M2 -q --check 3
cmake --build . --target M2-tests
cmake --build . --target M2-unit-tests
cmake --build . --target memtailor-unit-tests mathic-unit-tests mathicgb-unit-tests
ctest -j1 --output-on-failure -R "unit-tests"
ctest -j4 --output-on-failure -R "ComputationsBook"
# TODO: add Macaulay2/tests/engine when https://github.com/Macaulay2/M2/issues/1213 is fixed
- name: Run Tests using Autotools
if: matrix.build-system == 'autotools' && runner.os == 'Linux' && matrix.compiler == 'default'
run: |
make check -o check-in-libraries
make -C Macaulay2/html-check-links check
- name: Validate HTML documentation
if: matrix.build-system == 'autotools' && runner.os == 'Linux'
run: |
pipx install html5validator
if test ${{ github.event_name }} = pull_request
then
git fetch --depth=1 origin development
# validate everything if any changes to Core
if test "$(git diff --stat origin/development HEAD -- ../../Macaulay2/m2)"
then
make validate-html
else
# otherwise, just validate HTML docs for packages that have been updated
PACKAGES=$(git diff --stat origin/development HEAD -- ../../Macaulay2/packages/ | grep -Po "(?<=Macaulay2/packages/)[^/\.]*(?=\.m2|/)" | uniq | xargs)
make validate-html PACKAGES="$PACKAGES"
fi
else
# if not a pull request (scheduled or pre-master builds), then validate everything
make validate-html
fi
# ----------------------
# Upload build artifacts
# ----------------------
- name: Upload build logs
if: always()
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.build-system }}-${{ matrix.os }}-${{ matrix.compiler }}-logs
path: |
# Autotools
M2/BUILD/build/config.log
M2/BUILD/build/check-configure/tmp/config.log
M2/BUILD/build/include/*
M2/BUILD/build/libraries/*/build/*/config.log
# CMake
M2/BUILD/build/CMakeCache.txt
M2/BUILD/build/CMakeFiles/CMakeError.log
M2/BUILD/build/CMakeFiles/CMakeOutput.log
M2/BUILD/build/libraries/*/build/config.log
# package example errors
M2/BUILD/build/usr-dist/common/share/doc/Macaulay2/*/example-output/*.errors
# package test errors under Ubuntu
/tmp/M2-*/*.tmp
/tmp/M2-*/*.m2
# Test errors
M2/BUILD/build/Macaulay2/tests/*/*.errors
- name: Upload Macaulay2 package for Ubuntu (x86_64)
if: matrix.build-system == 'cmake' && runner.os == 'Linux' && success()
uses: actions/upload-artifact@v4
with:
name: Macaulay2-${{ env.GIT_COMMIT }}-ubuntu-x86_64
path: |
M2/BUILD/build/Macaulay2-*
retention-days: 1