-
Notifications
You must be signed in to change notification settings - Fork 119
363 lines (326 loc) · 14.8 KB
/
build.yml
File metadata and controls
363 lines (326 loc) · 14.8 KB
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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
name: build
on:
push:
branches: [master]
pull_request:
workflow_dispatch:
defaults:
run:
shell: bash
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
###########################################################
pre_job:
###########################################################
# continue-on-error: true # Uncomment once integration is finished
runs-on: ubuntu-latest-fat
# Map a step output to a job output
outputs:
should_skip: ${{ steps.skip_check.outputs.should_skip }}
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
# All of these options are optional, so you can remove them if you are happy with the defaults
concurrent_skipping: 'same_content'
do_not_skip: '["pull_request", "workflow_dispatch", "release"]'
- name: Cache LLVM
uses: actions/cache@v3
id: llvm-cache
with:
# Cache LLVM.dll, to make CI faster.
path: build/_deps/das_llvm_shared_lib-src
key: ${{ runner.os }}-${{ hashFiles('modules/dasLLVM/CMakeLists.txt') }}
###########################################################
build:
###########################################################
needs: pre_job
if: needs.pre_job.outputs.should_skip != 'true'
runs-on: ${{ matrix.runner }}
env:
das_dll_build: 'NO'
das_llvm_disabled: 'OFF'
strategy:
fail-fast: false
matrix:
target: [linux, linux_arm, darwin15, darwin26, windows]
architecture: [32, 64, arm64]
cmake_preset: [ Debug, Release ]
sanitizers: [none]
include:
- target: linux
release_target: linux
release_arch: x86_64
runner: ubuntu-latest-fat
archive_ext: tar.gz
sanitizers: none
# Sanitizer matrix — Linux + Release + full tests (dastest + test_aot
# + ctest). Release keeps walltime in budget; the previous Debug+ASAN
# was prohibitive for production CI. See issue #2530.
- target: linux
architecture: 64
runner: ubuntu-latest-fat
cmake_preset: Release
sanitizers: asan
build_name: linux_asan
build_system: cmake
cmake_generator: Ninja
- target: linux
architecture: 64
runner: ubuntu-latest-fat
cmake_preset: Release
sanitizers: tsan
build_name: linux_tsan
build_system: cmake
cmake_generator: Ninja
- target: linux
architecture: 64
runner: ubuntu-latest-fat
cmake_preset: Release
sanitizers: ubsan
build_name: linux_ubsan
build_system: cmake
cmake_generator: Ninja
- target: linux_arm
release_target: linux
release_arch: arm64
runner: ubuntu-24.04-arm-fat
archive_ext: tar.gz
- target: darwin15
architecture: arm64
release_target: darwin15
release_arch: arm64
runner: macos-15-xlarge # Apple Silicon arm64, M2
architecture_string: arm64
archive_ext: tar.gz
- target: darwin26
release_target: darwin26
release_arch: arm64
runner: macos-26-xlarge # Apple Silicon arm64, M2
architecture_string: arm64
archive_ext: tar.gz
- target: windows
runner: windows-latest-fat
archive_ext: zip
- target: windows
build_system: cmake
cmake_generator: Visual Studio 17 2022
- target: darwin15
build_system: cmake
cmake_generator: Ninja
- target: darwin26
build_system: cmake
cmake_generator: Ninja
- target: linux
build_system: cmake
cmake_generator: Ninja
- target: linux_arm
build_system: cmake
cmake_generator: Ninja
- target: windows
release_target: windows
release_arch: x86
architecture: 32
architecture_string: Win32
- target: windows
release_target: windows
release_arch: x86_64
architecture: 64
architecture_string: x64
# RelWithDebInfo only on Windows x64
- target: windows
architecture: 64
cmake_preset: RelWithDebInfo
sanitizers: none
runner: windows-latest-fat
archive_ext: zip
build_system: cmake
cmake_generator: Visual Studio 17 2022
release_target: windows
release_arch: x86_64
architecture_string: x64
exclude:
# macOS Intel (darwin15 x86_64) prebuilt LLVM.dll isn't shipped by
# llvm-shared-builds v22.1.5 and Apple no longer makes new Intel
# macOS runners worth gating on. Drop entirely.
- target: darwin15
architecture: 64
- target: darwin15
architecture: 32
- target: darwin26
architecture: 32
- target: darwin26
architecture: 64
- target: linux
architecture: 32
- target: linux
architecture: arm64
- target: linux_arm
architecture: 32
- target: linux_arm
architecture: arm64 # todo
- target: windows
architecture: arm64 # todo https://github.com/actions/partner-runner-images/tree/main?tab=readme-ov-file#available-images
steps:
- name: "SCM Checkout"
uses: actions/checkout@v4
- name: "Install CMake and Ninja"
uses: lukka/get-cmake@latest
- name: "Install: Required Dev Packages"
run: |
set -eux
case "${{ matrix.target }}${{ matrix.architecture }}" in
darwin15arm64|darwin26arm64)
# z3 is a runtime dependency of the prebuilt LLVM.dll on macOS arm64:
# its install_name hardcodes /opt/homebrew/opt/z3/lib/libz3.4.15.dylib,
# so dlopen("LLVM.dll") fails unless homebrew z3 is present.
brew install bison z3
echo 'export PATH="/usr/local/opt/bison/bin:$PATH"' >> ~/.bash_profile
export LDFLAGS="-L/usr/local/opt/bison/lib"
;;
darwin1564|darwin2664)
brew install bison z3
echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.bash_profile
export LDFLAGS="-L/opt/homebrew/opt/bison/lib"
;;
esac
case "${{ matrix.target }}${{ matrix.architecture }}" in
linux64)
echo "MARCH=64" >> $GITHUB_ENV
sudo apt-get update -y
sudo apt-get install --no-install-recommends -y \
libatomic-ops-dev \
libglu1-mesa-dev \
freeglut3-dev \
mesa-common-dev \
libglfw3-dev \
libfreetype6-dev \
libudev-dev \
libopenal-dev \
libvorbis-dev \
libflac-dev \
libclang-dev \
libx11-dev \
libxrandr-dev \
libxcursor-dev \
libxinerama-dev \
libxi-dev
;;
esac
- name: "Build: Daslang"
run: |
set -eux
mkdir build
case "${{ matrix.build_system }}" in
cmake)
case "${{ matrix.target }}${{ matrix.architecture }}" in
linux64)
CC=clang CXX=clang++ cmake --no-warn-unused-cli -B./build -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake_preset }} -G \
"${{ matrix.cmake_generator }}" -DDAS_USE_SANITIZER=${{ matrix.sanitizers }} -DDAS_LLVM_DISABLED=${{ env.das_llvm_disabled }}
cd build
ninja
;;
windows32)
cmake --no-warn-unused-cli -B./build -G "${{ matrix.cmake_generator }}" -T host=x64 -A ${{ matrix.architecture_string }}
cmake --build ./build --config ${{ matrix.cmake_preset }} --parallel
;;
windows64)
cmake --no-warn-unused-cli -B./build -G "${{ matrix.cmake_generator }}" -T host=x64 -A ${{ matrix.architecture_string }} -DDAS_LLVM_DISABLED=${{ env.das_llvm_disabled }}
cmake --build ./build --config ${{ matrix.cmake_preset }} --parallel
;;
linux_arm*)
CC=clang CXX=clang++ cmake --no-warn-unused-cli -B./build -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake_preset }} -DDAS_GLFW_DISABLED=ON -DDAS_HV_DISABLED=OFF -DDAS_SQLITE_DISABLED=OFF -DDAS_LLVM_DISABLED=${{ env.das_llvm_disabled }} -G \
"${{ matrix.cmake_generator }}"
cd build
ninja
;;
*)
CC=clang CXX=clang++ cmake --no-warn-unused-cli -B./build -DCMAKE_OSX_ARCHITECTURES="${{ matrix.architecture_string }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake_preset }} -DDAS_LLVM_DISABLED=${{ env.das_llvm_disabled }} -G "${{ matrix.cmake_generator }}"
cd build
ninja
;;
esac
;;
esac
- name: "Test"
run: |
set -eux
case "${{ matrix.target }}${{ matrix.architecture }}" in
linux64)
cd bin
# LSan suppressions: format_error (fmt::throw_format_error allocates
# std::runtime_error whose internal string is reported as leaked
# because the exception object isn't always destroyed); uriParseSingleUriA
# / uriMakeOwner (Uri handle bound to daslang without auto-finalize —
# tracked separately, real fix is in the binding).
printf 'leak:format_error\nleak:uriParseSingleUriA\nleak:uriMakeOwner\n' > suppressions.txt
export LSAN_OPTIONS="suppressions=$(pwd)/suppressions.txt"
# Use more time to pass UBSAN and disable leaks in JIT mode because we exit using exit(), and do not call destructors.
[ "${{ env.das_llvm_disabled }}" = "ON" ] || ASAN_OPTIONS=detect_leaks=0 ./daslang _dasroot_/dastest/dastest.das -jit -- --color --failures-only --timeout 900 --test ../tests || ASAN_OPTIONS=detect_leaks=0 ./daslang _dasroot_/dastest/dastest.das -jit -- --color --failures-only --isolated-mode --timeout 3600 --test ../tests
./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --timeout 900 --test ../tests || ./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --isolated-mode --timeout 3600 --test ../tests
;;
windows32)
cd bin/"${{ matrix.cmake_preset }}"
./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --timeout 900 --test ../../tests || ./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --isolated-mode --timeout 3600 --test ../../tests
;;
windows*)
cd bin/"${{ matrix.cmake_preset }}"
[ "${{ env.das_llvm_disabled }}" = "ON" ] || ./daslang _dasroot_/dastest/dastest.das -jit -- --timeout 900 --color --failures-only --test ../../tests || ./daslang _dasroot_/dastest/dastest.das -jit -- --color --failures-only --isolated-mode --timeout 3600 --test ../../tests
./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --timeout 900 --test ../../tests || ./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --isolated-mode --timeout 3600 --test ../../tests
;;
linux_arm64)
cd bin
# Skip JIT tests on the Debug cmake preset — LLVM ARM64 SelectionDAG
# hangs reproducibly mid-suite under Debug (different test each run,
# ~20 min in). Tracked separately. Release of the same matrix still
# runs JIT — keep --failures-only off there so PASS lines print and
# name the test running just before the hang if it reoccurs (see
# RC2 release run #25572466058).
[ "${{ env.das_llvm_disabled }}" = "ON" ] || [ "${{ matrix.cmake_preset }}" = "Debug" ] || ./daslang _dasroot_/dastest/dastest.das -jit -- --color --timeout 900 --test ../tests || ./daslang _dasroot_/dastest/dastest.das -jit -- --color --failures-only --isolated-mode --timeout 3600 --test ../tests
./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --timeout 900 --test ../tests || ./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --isolated-mode --timeout 3600 --test ../tests
;;
*)
cd bin
[ "${{ env.das_llvm_disabled }}" = "ON" ] || ./daslang _dasroot_/dastest/dastest.das -jit -- --color --failures-only --timeout 900 --test ../tests || ./daslang _dasroot_/dastest/dastest.das -jit -- --color --failures-only --isolated-mode --timeout 3600 --test ../tests
./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --timeout 900 --test ../tests || ./daslang _dasroot_/dastest/dastest.das -- --color --failures-only --isolated-mode --timeout 3600 --test ../tests
;;
esac
- name: "Small C++ Tests"
run: |
set -eux
# Suppress LSan false-positives from format_error and JIT-mode exit() paths;
# see "Test" step above for the same suppressions.
printf 'leak:format_error\nleak:uriParseSingleUriA\nleak:uriMakeOwner\n' > build/suppressions.txt
export LSAN_OPTIONS="suppressions=$(pwd)/build/suppressions.txt"
cd build
case "${{ matrix.target }}${{ matrix.architecture }}" in
windows*)
ctest --build-config "${{ matrix.cmake_preset }}" -L small --output-on-failure
;;
*)
ctest -L small --output-on-failure
;;
esac
- name: "Slow Release Tests"
if: matrix.cmake_preset == 'Release'
run: |
set -eux
case "${{ matrix.target }}${{ matrix.architecture }}" in
windows32)
echo "Skipping AOT tests on 32-bit Windows"
;;
windows*)
cd bin/"${{ matrix.cmake_preset }}"
./test_aot -use-aot _dasroot_/dastest/dastest.das -- --use-aot --color --failures-only --timeout 900 --test ../../tests
;;
*)
cd bin
# Same suppressions as the "Test" step — sanitizer matrix entries
# need them here too.
printf 'leak:format_error\nleak:uriParseSingleUriA\nleak:uriMakeOwner\n' > suppressions.txt
export LSAN_OPTIONS="suppressions=$(pwd)/suppressions.txt"
./test_aot -use-aot _dasroot_/dastest/dastest.das -- --use-aot --color --failures-only --timeout 900 --test ../tests
;;
esac