Skip to content

Move windows to bash #541

Move windows to bash

Move windows to bash #541

Workflow file for this run

name: Win
on:
push:
branches: [ main ]
pull_request:
branches:
- main
- maintenance/**
workflow_dispatch: null
env:
# Preserve working directory for calls into bash
# Without this, invoking bash will cd to the home directory
CHERE_INVOKING: "yes"
BASH_PATH: "c:\\rtools40\\usr\\bin\\bash.exe"
jobs:
build:
strategy:
matrix:
include:
- { os: windows-latest, PLAT: x86, INTERFACE64: '0'}
- { os: windows-latest, PLAT: x64, INTERFACE64: '0'}
- { os: windows-latest, PLAT: x64, INTERFACE64: '1'}
- { os: windows-11-arm, PLAT: arm64, INTERFACE64: '0'}
- { os: windows-11-arm, PLAT: arm64, INTERFACE64: '1'}
fail-fast: false
runs-on: ${{ matrix.os }}
timeout-minutes: 90
steps:
- uses: actions/[email protected]
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: 3.11
architecture: ${{ matrix.plat }}
- name: Setup conda
# No conda for arm64
if: matrix.os == 'windows-latest'
uses: conda-incubator/[email protected]
with:
channels: conda-forge
channel-priority: true
activate-environment: openblas
miniforge-version: latest
- name: Install compilers and python from conda
# No conda for arm64
if: matrix.os == 'windows-latest'
shell: bash -el {0}
run: conda install compilers python==3.11 cmake ninja anaconda-client
- name: Download and install LLVM (arm64) and other tools
if: matrix.os == 'windows-11-arm'
shell: pwsh
run: |
Invoke-WebRequest https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.0/LLVM-21.1.0-woa64.exe -UseBasicParsing -OutFile LLVM-woa64.exe
Start-Process -FilePath ".\LLVM-woa64.exe" -ArgumentList "/S" -Wait
Invoke-WebRequest https://static.rust-lang.org/rustup/dist/aarch64-pc-windows-msvc/rustup-init.exe -UseBasicParsing -Outfile rustup-init.exe
$env:PATH="$env:PATH;$env:USERPROFILE\.cargo\bin"
pip install anaconda-client
python -m pip install cmake ninja
- name: Set env variables
run: |
echo "START_DIR=$PWD" >> $env:GITHUB_ENV
# For interpretation of MSYSTEM, see:
# https://sourceforge.net/p/msys2/discussion/general/thread/b7dfdac8/#3939
if ( "${{ matrix.plat }}" -eq "x86") {
echo "PLAT=i686" >> $env:GITHUB_ENV
echo "WHEEL_PLAT=win32" >> $env:GITHUB_ENV
echo "MSYSTEM=MINGW32" >> $env:GITHUB_ENV
# No ucrt on 32-bits, so use _snprintf_c instead
echo "LDFLAGS=-static -static-libgcc -Wl,--defsym,_quadmath_snprintf=__snprintf_c" >> $env:GITHUB_ENV
echo "BUILD_BITS=32" >> $env:GITHUB_ENV
} else {
echo "PLAT=x86_64" >> $env:GITHUB_ENV
echo "WHEEL_PLAT=win_amd64" >> $env:GITHUB_ENV
echo "MSYSTEM=UCRT64" >> $env:GITHUB_ENV
echo "LDFLAGS=-lucrt -static -static-libgcc -Wl,--defsym,quadmath_snprintf=snprintf" >> $env:GITHUB_ENV
echo "BUILD_BITS=64" >> $env:GITHUB_ENV
}
if ( "${{ matrix.plat }}" -eq "arm64") {
echo "PLAT=arm64" >> $env:GITHUB_ENV
}
if ( ${{ matrix.INTERFACE64 }} -eq "1" ) {
echo "INTERFACE64=1" >> $env:GITHUB_ENV
}
$CIBW = "${{ github.workspace }}/.openblas"
$CIBW = $CIBW.replace("\","/")
echo "CIBW_ENVIRONMENT_WINDOWS=PKG_CONFIG_PATH=$CIBW" >> $env:GITHUB_ENV
- name: Debug
run: |
echo CIBW_ENVIRONMENT_WINDOWS=$env:CIBW_ENVIRONMENT_WINDOWS
- name: Build
shell: bash -el {0}
run: tools/build_steps_windows.sh
- name: Test
shell: bash
run: |
bash -lc tools/build_gfortran.sh
echo "Static test"
./for_test/test.exe
echo "Dynamic test"
./for_test/test_dyn.exe
- name: Copy
run: |
cp for_test\test*.exe builds
- name: Build wheel
shell: bash
run: |
set -xeo pipefail
python -m pip install wheel
# This will fail if there is more than one file in libs
unzip -d local/scipy_openblas64 builds/openblas.zip
if [[ -d local/scipy_openblas64/64 ]]; then
mv local/scipy_openblas64/64/* local/scipy_openblas64
else
mv local/scipy_openblas64/32/* local/scipy_openblas64
fi
mv local/scipy_openblas64/bin/*.dll local/scipy_openblas64/lib
rm local/scipy_openblas64/lib/*.a
rm -f local/scipy_openblas64/lib/*.exp # may not exist?
rm local/scipy_openblas64/lib/*.def
rm -rf local/scipy_openblas64/lib/pkgconfig
if [[ -d local/scipy_openblas64/64 ]]; then
rm -rf local/scipy_openblas64/64
else
rm -rf local/scipy_openblas64/32
fi
sed -e "s/bin/lib/" -i local/scipy_openblas64/lib/cmake/openblas/OpenBLASConfig.cmake
sed -e "s/dll/lib/" -i local/scipy_openblas64/lib/cmake/openblas/OpenBLASConfig.cmake
mkdir local/scipy_openblas64/lib/pkgconfig
if [[ "${INTERFACE64}" != "1" ]]; then
mv local/scipy_openblas64 local/scipy_openblas32
# rewrite the name of the project to scipy-openblas32
# this is a hack, but apparently there is no other way to change the name
# of a pyproject.toml project
sed -e "s/openblas64/openblas32/" -i pyproject.toml
sed -e "s/openblas_get_config64_/openblas_get_config/" -i local/scipy_openblas32/__init__.py
sed -e "s/cflags =.*/cflags = '-DBLAS_SYMBOL_PREFIX=scipy_'/" -i local/scipy_openblas32/__init__.py
sed -e "s/openblas64/openblas32/" -i local/scipy_openblas32/__init__.py
sed -e "s/openblas64/openblas32/" -i local/scipy_openblas32/__main__.py
PYTHONPATH=$PWD/local python -c "import scipy_openblas32 as s; print(s.get_pkg_config(use_prefix=True))" > local/scipy_openblas32/lib/pkgconfig/scipy-openblas.pc
else
PYTHONPATH=$PWD/local python -c "import scipy_openblas64 as s; print(s.get_pkg_config(use_prefix=True))" > local/scipy_openblas64/lib/pkgconfig/scipy-openblas.pc
fi
echo "" >> LICENSE.txt
echo "----" >> LICENSE.txt
echo "" >> LICENSE.txt
cat tools/LICENSE_win32.txt >> LICENSE.txt
python -m pip wheel -w dist -vv .
# move the mis-named scipy_openblas64-none-any.whl to a platform-specific name
if [[ -e dist/*any*.whl ]]; then
for f in dist/*.whl; do mv $f "${f/%any.whl/$WHEEL_PLAT.whl}"; done
fi
- uses: actions/[email protected]
with:
name: wheels-${{matrix.plat }}-${{ matrix.INTERFACE64 }}
path: dist/scipy_openblas*.whl
- name: Test 64-bit interface wheel
if: matrix.INTERFACE64 == '1'
run: |
python -m pip install --no-index --find-links dist scipy_openblas64
python -m scipy_openblas64
python -c "import scipy_openblas64; print(scipy_openblas64.get_pkg_config())"
python -m pip install pkgconf
python -m pkgconf scipy-openblas --cflags
- name: Test 32-bit interface wheel
if: matrix.INTERFACE64 != '1'
run: |
python -m pip install --no-index --find-links dist scipy_openblas32
python -m scipy_openblas32
python -c "import scipy_openblas32; print(scipy_openblas32.get_pkg_config())"
python -m pip install pkgconf
python -m pkgconf scipy-openblas --cflags
- name: Upload
# see https://github.com/marketplace/actions/setup-miniconda for why
# `-el {0}` is required.
shell: bash -el {0}
env:
ANACONDA_SCIENTIFIC_PYTHON_UPLOAD: ${{ secrets.ANACONDA_SCIENTIFIC_PYTHON_UPLOAD }}
run: |
conda install -y anaconda-client
source tools/upload_to_anaconda_staging.sh
upload_wheels