-
Notifications
You must be signed in to change notification settings - Fork 236
255 lines (228 loc) · 9.8 KB
/
test_build.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
################################################################################
#
# 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