Merge pull request #29532 from athurdekoos/doc/build-compatibility #3231
This file contains hidden or 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
name: Test with compiler sanitizers | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
- maintenance/** | |
defaults: | |
run: | |
shell: bash | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
permissions: | |
contents: read # to fetch code (actions/checkout) | |
jobs: | |
clang_ASAN_UBSAN: | |
# To enable this workflow on a fork, comment out: | |
if: github.repository == 'numpy/numpy' | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
submodules: recursive | |
fetch-tags: true | |
persist-credentials: false | |
- name: Set up pyenv | |
run: | | |
git clone https://github.com/pyenv/pyenv.git "$HOME/.pyenv" | |
PYENV_ROOT="$HOME/.pyenv" | |
PYENV_BIN="$PYENV_ROOT/bin" | |
PYENV_SHIMS="$PYENV_ROOT/shims" | |
echo "$PYENV_BIN" >> $GITHUB_PATH | |
echo "$PYENV_SHIMS" >> $GITHUB_PATH | |
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV | |
- name: Check pyenv is working | |
run: | |
pyenv --version | |
- name: Set up LLVM | |
run: | | |
brew install llvm@19 | |
LLVM_PREFIX=$(brew --prefix llvm@19) | |
echo CC="$LLVM_PREFIX/bin/clang" >> $GITHUB_ENV | |
echo CXX="$LLVM_PREFIX/bin/clang++" >> $GITHUB_ENV | |
echo LDFLAGS="-L$LLVM_PREFIX/lib" >> $GITHUB_ENV | |
echo CPPFLAGS="-I$LLVM_PREFIX/include" >> $GITHUB_ENV | |
- name: Build Python with address sanitizer | |
run: | | |
CONFIGURE_OPTS="--with-address-sanitizer" pyenv install 3.14t | |
pyenv global 3.14t | |
- name: Install dependencies | |
run: | | |
pip install -r requirements/build_requirements.txt | |
pip install -r requirements/ci_requirements.txt | |
pip install -r requirements/test_requirements.txt | |
# xdist captures stdout/stderr, but we want the ASAN output | |
pip uninstall -y pytest-xdist | |
- name: Build | |
run: | |
python -m spin build -- -Db_sanitize=address,undefined -Db_lundef=false | |
- name: Test | |
run: | | |
# pass -s to pytest to see ASAN errors and warnings, otherwise pytest captures them | |
# Ignore test_casting_floatingpoint_errors on macOS for now - causes crash inside UBSAN | |
ASAN_OPTIONS=detect_leaks=0:symbolize=1:strict_init_order=true:allocator_may_return_null=1 \ | |
UBSAN_OPTIONS=halt_on_error=1:suppressions=${GITHUB_WORKSPACE}/tools/ci/ubsan_suppressions_arm64.txt \ | |
python -m spin test -- -k "not test_casting_floatingpoint_errors" -v -s --timeout=600 --durations=10 | |
clang_TSAN: | |
# To enable this workflow on a fork, comment out: | |
if: github.repository == 'numpy/numpy' | |
runs-on: ubuntu-latest | |
container: | |
image: ghcr.io/nascheme/numpy-tsan:3.14t | |
options: --shm-size=2g # increase memory for large matrix ops | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Trust working directory and initialize submodules | |
run: | | |
git config --global --add safe.directory /__w/numpy/numpy | |
git submodule update --init --recursive | |
- name: Uninstall pytest-xdist (conflicts with TSAN) | |
run: pip uninstall -y pytest-xdist | |
- name: Build NumPy with ThreadSanitizer | |
run: python -m spin build -- -Db_sanitize=thread | |
- name: Run tests under prebuilt TSAN container | |
run: | | |
export TSAN_OPTIONS="halt_on_error=0:allocator_may_return_null=1:suppressions=$GITHUB_WORKSPACE/tools/ci/tsan_suppressions.txt" | |
echo "TSAN_OPTIONS=$TSAN_OPTIONS" | |
python -m spin test \ | |
`find numpy -name "test*.py" | xargs grep -l "import threading" | tr '\n' ' '` \ | |
-- -v -s --timeout=600 --durations=10 | |
ubuntu_UBSAN: | |
# To enable this workflow on a fork, comment out: | |
if: github.repository == 'numpy/numpy' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
submodules: recursive | |
fetch-tags: true | |
persist-credentials: false | |
- name: Set up pyenv | |
run: | | |
git clone https://github.com/pyenv/pyenv.git "$HOME/.pyenv" | |
PYENV_ROOT="$HOME/.pyenv" | |
PYENV_BIN="$PYENV_ROOT/bin" | |
PYENV_SHIMS="$PYENV_ROOT/shims" | |
echo "$PYENV_BIN" >> $GITHUB_PATH | |
echo "$PYENV_SHIMS" >> $GITHUB_PATH | |
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV | |
- name: Check pyenv is working | |
run: pyenv --version | |
- name: Build python with address sanitizer | |
run: | | |
CONFIGURE_OPTS="--with-address-sanitizer" pyenv install 3.14t | |
pyenv global 3.14t | |
- name: Install dependencies | |
run: | | |
pip install -r requirements/build_requirements.txt | |
pip install -r requirements/ci_requirements.txt | |
pip install -r requirements/test_requirements.txt | |
- name: Build numpy with UndefinedBehaviorSanitizer | |
run: python -m spin build -- -Db_sanitize=address,undefined -Db_lundef=false | |
- name: Test | |
run: | | |
# pass -s to pytest to see UBSAN errors and warnings, otherwise pytest captures them | |
ASAN_OPTIONS=detect_leaks=0:symbolize=1:strict_init_order=true:allocator_may_return_null=1 \ | |
UBSAN_OPTIONS=halt_on_error=1:suppressions=${GITHUB_WORKSPACE}/tools/ci/ubsan_suppressions_x86_64.txt \ | |
spin test -- -v -s --timeout=600 --durations=10 |