Build and Test Macaulay2 #1373
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################################ | |
# | |
# 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 |