Skip to content

Sped up Smoldyn suface and panel lookup with new c-safe Hashtable #115

Sped up Smoldyn suface and panel lookup with new c-safe Hashtable

Sped up Smoldyn suface and panel lookup with new c-safe Hashtable #115

Workflow file for this run

name: "Build Wheels"
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
release:
types:
- published
jobs:
build_wheels:
name: Build Python Wheels on ${{ matrix.os }} (for ${{ matrix.python_version }})
runs-on: ${{ matrix.os }}
strategy:
matrix:
#os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-13, macos-14]
os: [windows-latest]
python_version: ["cp39-*", "cp310-*", "cp311-*", "cp312-*", "cp313-*"]
exclude:
- os: windows-latest
python_version: "cp39-*"
- os: windows-latest
python_version: "cp313-*"
steps:
- name: Checkout repository (for non-windows)
if: matrix.os != 'windows-latest'
uses: actions/checkout@v4
with:
submodules: true
# - name: Install Ubuntu Dependencies
# if: matrix.os == 'ubuntu-latest' || matrix.os == 'ubuntu-24.04-arm'
# run: |
# sudo apt update
# sudo apt install -y wget gfortran cmake ninja-build libboost-all-dev libzip-dev libhdf5-dev libbz2-dev libssl-dev liblzma-dev
#
# # for some reason, there aren't headers included in libzip-dev???? so we're building from source!
# mkdir ../libzip-source
# wget https://libzip.org/download/libzip-1.11.3.tar.gz
# tar -xzvf libzip-1.11.3.tar.gz -C ../libzip-source
# cmake -S ../libzip-source/libzip-1.11.3 -B ../libzip-source/libzip-1.11.3/build -G Ninja
# cmake --build ../libzip-source/libzip-1.11.3/build
# sudo cmake --install ../libzip-source/libzip-1.11.3/build
# echo "Confirming header presence..."
- name: Install Intel MacOS Dependencies
if: matrix.os == 'macos-13'
shell: bash
run: |
brew install boost
brew install hdf5
brew install libzip
brew install ninja
brew install libaec
brew install llvm
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> /Users/runner/.bash_profile
source /Users/runner/.bash_profile
ln -s $(which gfortran-14) /usr/local/bin/gfortran
- name: Install ARM MacOS dependencies
if: matrix.os == 'macos-14'
shell: bash
run: |
brew install boost
brew install hdf5
brew install libzip
brew install ninja
brew install libaec
brew install llvm
echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> /Users/runner/.bash_profile
ln -s /opt/homebrew/bin/gfortran-14 /usr/local/bin/gfortran
# We're no longer using msys2, as it appears to not be able to give us native windows wheels.
# - name: Install Windows Dependencies
# if: matrix.os == 'windows-latest'
# run: |
# choco install msys2
# C:\tools\msys64\usr\bin\bash -lc "pacman -Sy --noconfirm \
# mingw-w64-clang-x86_64-cmake \
# mingw-w64-clang-x86_64-ninja \
# mingw-w64-clang-x86_64-toolchain \
# mingw-w64-clang-x86_64-boost \
# mingw-w64-clang-x86_64-hdf5 \
# mingw-w64-clang-x86_64-zlib \
# mingw-w64-clang-x86_64-libzip \
# mingw-w64-clang-x86_64-libaec"
# echo "C:\tools\msys64\clang64\bin" | Out-File -Append -Encoding ascii $env:GITHUB_PATH
# echo "C:\tools\msys64\clang64\lib" | Out-File -Append -Encoding ascii $env:GITHUB_PATH
# echo "C:\tools\msys64\clang64\include" | Out-File -Append -Encoding ascii $env:GITHUB_PATH
- name: Install Python for Windows (Python 3.9)
if: matrix.os == 'windows-latest' && matrix.python_version == 'cp39-*'
uses: actions/setup-python@v5
with:
python-version: '3.9'
- name: Install Python for Windows (Python 3.10)
if: matrix.os == 'windows-latest' && matrix.python_version == 'cp310-*'
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install Python for Windows (Python 3.11)
if: matrix.os == 'windows-latest' && matrix.python_version == 'cp311-*'
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install Python for Windows (Python 3.12)
if: matrix.os == 'windows-latest' && matrix.python_version == 'cp312-*'
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install Python for Windows (Python 3.13)
if: matrix.os == 'windows-latest' && matrix.python_version == 'cp313-*'
uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: Clean Windows Workspace
if: ${{ matrix.os == 'windows-latest'}}
run: Remove-Item * -Recurse -Force
- name: Install Windows Dependencies (Part 0a - Setup Flang Source Code)
if: ${{ matrix.os == 'windows-latest'}}
run: |
git clone --depth 1 https://github.com/flang-compiler/flang.git ${{ github.workspace }}
mv ${{ github.workspace }}/* ${{ github.workspace }}/..
- name: Install Windows Dependencies (Part 0b - Setup LLVM Build Env)
if: ${{ matrix.os == 'windows-latest'}}
uses: llvm/actions/setup-windows@main
with:
arch: amd64
- name: Install Windows Dependencies (Part 0c - Setup LLVM-style Ninja Build Env)
if: ${{ matrix.os == 'windows-latest'}}
uses: llvm/actions/setup-windows@main
with:
arch: amd64
- name: Install Windows Dependencies (Part 0d - Setup Graphviz for Doxygen)
if: ${{ matrix.os == 'windows-latest'}}
run: choco install graphviz wget
- name: Install Windows Dependencies (Part 0e - Setup Sphinx for Python)
if: ${{ matrix.os == 'windows-latest'}}
run: pip install sphinx
- name: Install Windows Dependencies (Part 0f - Download pre-built "cmade" LLVM)
run: |
cd ../..
# Search backwards in the workflow history for the specified branch
# for the first successful run that produced the desired artifact.
$build_name="llvm_build_win_amd64_clangcl_release_19x"
Invoke-WebRequest -Uri https://api.github.com/repos/flang-compiler/classic-flang-llvm-project/actions/workflows/pre-compile_llvm.yml/runs -OutFile llvm_runs.json
$urls = @($(jq -r --arg b release_19x '.workflow_runs[] | select(.head_branch == $b) | select (.conclusion == "success") | .artifacts_url?' llvm_runs.json))
Invoke-WebRequest "$(jq -r '.workflow_runs[0].artifacts_url?' llvm_runs.json)" -OutFile llvm_artifacts.json
for ($i = 0; $i -lt $urls.Count; $i++) {
$artifacts_url = $urls[$i]
Invoke-WebRequest -Uri "$artifacts_url" -OutFile llvm_artifacts.json
$archive_url = "$(jq -r --arg b $build_name '.artifacts[] | select(.name == $b) | .archive_download_url' llvm_artifacts.json)"
if (! $archive_url) {
Write-Output "$artifacts_url did not contain a $build_name archive; too old?"
continue
}
Write-Output "Downloading $archive_url."
$artifact_path = "$pwd\${build_name}.zip"
try {
$response = Invoke-WebRequest -Method Get -Uri $archive_url -OutFile $artifact_path -Headers @{ "Authorization" = "Bearer ${{ secrets.GITHUB_TOKEN }}" }
if ($response.StatusCode -lt 300) {
break
}
} catch {}
}
if (!(Test-Path "$artifact_path")) {
Write-Output "Could not download the correct prebuilt compiler; aborting."
exit 1
}
Expand-Archive -Force -Path "${build_name}.zip" -DestinationPath .
& 7z x "$pwd\llvm_build.7z" -o"$pwd\classic-flang-llvm-project\" -y
Write-Output "$(Get-ChildItem)"
- name: Install Windows Dependencies (Part 1a - Build Flang)
if: matrix.os == 'windows-latest'
shell: powershell
run: |
$pcount = $($(Get-WmiObject -class Win32_ComputerSystem).numberoflogicalprocessors)
python ..\scripts\build_flang.py -b "Release" -d build -t X86 -p "$(pwd)\..\..\classic-flang-llvm-project\classic-flang-llvm-project\build\" -j $pcount -v
$resolved = Resolve-Path "$(pwd)\..\..\classic-flang-llvm-project\classic-flang-llvm-project\build\bin\"
$resolved_path = $resolved.Path
$new_path = $resolved_path + ";" + [Environment]::GetEnvironmentVariable("GITHUB_PATH", "Machine")
$env:PATH = "$resolved_path;$env:PATH"
$resolved_path | Set-Content -Path $env:GITHUB_PATH
Write-Output "New GITHUB_PATH: "
Write-Output "$new_path"
[Environment]::SetEnvironmentVariable("GITHUB_PATH", "$new_path", "Machine")
flang --version
- name: Install Windows Dependencies (Part 2a - Reclean Windows Workspace)
if: ${{ matrix.os == 'windows-latest'}}
run: Remove-Item * -Recurse -Force
- name: Install Windows Dependencies (Part 2b - Setup Flang Source Code)
if: ${{ matrix.os == 'windows-latest'}}
uses: actions/checkout@v4
- name: Install Windows Dependencies (Part 2c - Configure Conan)
if: matrix.os == 'windows-latest'
shell: powershell
run: |
choco install conan -y
$conanDir = "C:\Program Files\Conan\conan"
$env:PATH = "$conanDir;$env:PATH"
$conanDir | Set-Content -Path $env:GITHUB_PATH
$env:CONAN_HOME = "C:\.conan"
"CONAN_HOME=C:\.conan" | Out-File -FilePath $env:GITHUB_ENV -Append
conan --version
- name: Install Windows Dependencies (Part 2d - Get Remaining Dependencies through Conan)
if: matrix.os == 'windows-latest'
run:
conan profile detect --force
conan install . --output-folder=build --build=missing -s cppstd=17 -s compiler="Visual Studio" -s toolset=llvm
- name: Build Wheels (Windows)
uses: pypa/[email protected]
if: matrix.os == 'windows-latest'
env:
CC: "clang"
CXX: "clang++"
FC: "flang"
CIBW_BUILD: ${{ matrix.python_version }}
CIBW_ARCHS_WINDOWS: "native"
CIBW_BEFORE_BUILD: "pip install cmake ninja"
CIBW_PYTHON_BIN: ${{ env.CUSTOM_PYTHON_BIN }}
CIBW_ENVIRONMENT: >
CC=clang
CXX=clang++
FC=flang
CMAKE_GENERATOR=Ninja
CMAKE_TOOLCHAIN_FILE=D:\\a\\vcell-fvsolver\\vcell-fvsolver\\build\\conan_toolchain.cmake
# with:
# package-dir: .
# output-dir: wheelhouse
# config-file: "{package}/pyproject.toml"
- name: Build Wheels (MacOS<x86_64>)
uses: pypa/[email protected]
if: matrix.os == 'macos-13'
env:
CIBW_BUILD: ${{ matrix.python_version }}
CIBW_ARCHES: "native"
CIBW_ENVIRONMENT: >
FC=/usr/local/bin/gfortran
MACOSX_DEPLOYMENT_TARGET="10.13"
# with:
# package-dir: .
# output-dir: wheelhouse
# config-file: "{package}/pyproject.toml"
- name: Build Wheels (MacOS<ARM>)
uses: pypa/[email protected]
if: matrix.os == 'macos-14'
env:
MACOSX_DEPLOYMENT_TARGET: 14.0
CIBW_BUILD: ${{ matrix.python_version }}
CIBW_ARCHES: "native"
CIBW_ENVIRONMENT: >
FC=/opt/homebrew/bin/gfortran-14
# with:
# package-dir: .
# output-dir: wheelhouse
# config-file: "{package}/pyproject.toml"
- name: Build Wheels (Linux<ARM>)
uses: pypa/[email protected]
if: matrix.os == 'ubuntu-24.04-arm'
env:
CIBW_BUILD: ${{ matrix.python_version }}
CIBW_SKIP: "*musllinux*"
CIBW_ARCHS_LINUX: "native"
CIBW_MANYLINUX_AARCH64_IMAGE: 'quay.io/pypa/manylinux_2_34_aarch64'
CIBW_REPAIR_WHEEL_COMMAND: 'auditwheel repair --disable-isa-ext-check {wheel} -w {dest_dir}'
CIBW_BEFORE_BUILD: "yum install -y wget boost-devel hdf5-devel zlib-devel libzip-devel bzip2-devel ninja-build openssl-devel xz-devel \
&& mkdir /xz_source \
&& wget https://github.com/tukaani-project/xz/releases/download/v5.8.1/xz-5.8.1.tar.gz \
&& tar -xzvf xz-5.8.1.tar.gz -C /xz_source \
&& cmake -S /xz_source/xz-5.8.1 -B /xz_source/xz-5.8.1/build \
&& cmake --build /xz_source/xz-5.8.1/build \
&& cmake --install /xz_source/xz-5.8.1/build \
&& pip install h5py"
# with:
# package-dir: .
# output-dir: wheelhouse
# config-file: "{package}/pyproject.toml"
- name: Build Wheels (Linux<x86_64>)
uses: pypa/[email protected]
if: matrix.os == 'ubuntu-latest'
env:
CIBW_BUILD: ${{ matrix.python_version }}
CIBW_SKIP: "*musllinux*"
CIBW_ARCHS_LINUX: "native"
CIBW_MANYLINUX_X86_64_IMAGE: 'quay.io/pypa/manylinux_2_34_x86_64'
CIBW_REPAIR_WHEEL_COMMAND: 'auditwheel repair --disable-isa-ext-check {wheel} -w {dest_dir}'
CIBW_BEFORE_BUILD: "yum install -y curl boost-devel hdf5-devel libzip-devel bzip2-devel ninja-build openssl-devel xz-devel \
&& pip install h5py \
"
# with:
# package-dir: .
# output-dir: wheelhouse
# config-file: "{package}/pyproject.toml"
# && mkdir /libzip_source \
# && curl -O https://libzip.org/download/libzip-1.11.3.tar.gz \
# && tar -xzvf libzip-1.11.3.tar.gz -C /libzip_source \
# && cmake -S ../libzip-source/libzip-1.11.3 -B ../libzip-source/libzip-1.11.3/build -G Ninja \
# && cmake --build ../libzip-source/libzip-1.11.3/build \
# && cmake --install ../libzip-source/libzip-1.11.3/build \
# && export LIBZIP_INCLUDE_DIR=/usr/local/include \
# && export LIBZIP_LIBRARY=/usr/local/lib/libzip.so
- name: Upload Artifact (Python 3.9)
uses: actions/upload-artifact@v4
if: matrix.python_version == 'cp39-*'
with:
name: pyvcell-fv-${{ matrix.os }}-cp39-cibw-wheels
path: ./wheelhouse/*.whl
- name: Upload Artifact (Python 3.10)
uses: actions/upload-artifact@v4
if: matrix.python_version == 'cp310-*'
with:
name: pyvcell-fv-${{ matrix.os }}-cp310-cibw-wheels
path: ./wheelhouse/*.whl
- name: Upload Artifact (Python 3.11)
uses: actions/upload-artifact@v4
if: matrix.python_version == 'cp311-*'
with:
name: pyvcell-fv-${{ matrix.os }}-cp311-cibw-wheels
path: ./wheelhouse/*.whl
- name: Upload Artifact (Python 3.12)
uses: actions/upload-artifact@v4
if: matrix.python_version == 'cp312-*'
with:
name: pyvcell-fv-${{ matrix.os }}-cp312-cibw-wheels
path: ./wheelhouse/*.whl
- name: Upload Artifact (Python 3.13)
uses: actions/upload-artifact@v4
if: matrix.python_version == 'cp313-*'
with:
name: pyvcell-fv-${{ matrix.os }}-cp313-cibw-wheels
path: ./wheelhouse/*.whl
- name: Setup tmate session on failure
uses: mxschmitt/action-tmate@v3
if: ${{ failure() }}
with:
limit-access-to-actor: true