Skip to content

Build and test conda packages and wheels - #294

Open
jharlow-intel wants to merge 2 commits into
mainfrom
ci/intel-python-ci
Open

jharlow-intel wants to merge 2 commits into
mainfrom
ci/intel-python-ci

Conversation

@jharlow-intel

@jharlow-intel jharlow-intel commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Adds ci/ and .github/workflows/intel-ci.yml, which build the conda packages and the wheels for Linux and Windows, on every declared Python, and test each in a clean environment. The recipe skips macOS, as conda-forge/mkl_umath-feedstock does.

  • conda-recipe/ is now the only recipe: the conda-forge one that was conda-recipe-cf/. The Intel-channel recipe and conda-package.yml are removed; conda-package-cf.yml builds conda-recipe/ and keeps its check names.
  • The conda packages build Python 3.10 to 3.15 plus 3.14t, from the python: list in conda_build_config.yaml. The wheels follow the pyproject.toml classifiers: 3.10 to 3.15 plus 3.14t and 3.15t.
  • Wheels build with cibuildwheel and icx: on Linux from Intel's oneAPI yum repository, on Windows from conda-forge's dpcpp_win-64, which ci/install_icx.py installs. They leave MKL and the compiler runtime out and require mkl, intel-openmp and intel-cmplr-lib-rt >=2026.2,<2027 through [tool.gh-ci] wheel-requires, which ci/build.py adds to each wheel.
  • meson.build adds Library to CMake's search path on Windows, where mkl-devel puts its CMake config.
  • ci/test.py runs pytest --pyargs mkl_umath on the installed package.
  • ci/benchmark.py runs the asv suite in benchmarks/ against the installed package: one quick sample of each benchmark on a pull request, a full measurement on a tag.

Miniforge is pinned to 26.7.2-0, as 26.9.4-0 makes setup-miniconda's conda init fail on Windows runners.

Validation: run 42099116172 built and tested the conda packages and the wheels for 3.10 and 3.15 on Linux and Windows; all 17 jobs passed. Not run yet: the full matrix, which only main and tags build.

@jharlow-intel
jharlow-intel marked this pull request as ready for review October 23, 2026 20:42
@jharlow-intel jharlow-intel self-assigned this Oct 28, 2026
@jharlow-intel
jharlow-intel force-pushed the ci/intel-python-ci branch 12 times, most recently from 02315bd to f53b1ce Compare November 3, 2026 18:00
@jharlow-intel jharlow-intel changed the title Build and test conda-recipe-cf for Intel Python CI Build and test conda packages and wheels Nov 5, 2026
Adds a ci/ directory and .github/workflows/intel-ci.yml. The workflow builds
conda-recipe/ with conda-build and the wheels with cibuildwheel, for every
platform and Python version the recipe and pyproject.toml declare, and tests
each package in a clean environment with ci/test.py.

conda-recipe/ is now the only recipe, the conda-forge one that was
conda-recipe-cf/; the Intel-channel recipe and conda-package.yml, which copied
wheels out through WHEELS_OUTPUT_FOLDER, are removed. conda-package-cf.yml
reports the same check names, so the required checks still run.
conda_build_config.yaml now lists the Python versions.

The wheels link MKL's layers, the Intel OpenMP runtime and icx's runtime, so
their run-time requirements on mkl, intel-openmp and intel-cmplr-lib-rt come
from [tool.gh-ci] wheel-requires in pyproject.toml, which ci/build.py adds to
each wheel: in [project] they would fail the recipe's pip check, as
conda-forge's mkl has no pip metadata.

The wheels build against mkl-devel >=2026.2,<2027, the range they require
at run time, and the Linux wheels are tagged manylinux_2_28 only, like the
mkl wheel. ci/build.py keeps only the $ORIGIN entries of each ELF file's
RPATH and RUNPATH in a wheel, as meson-python keeps the isolated build
env's absolute lib directory, and refuses a file that would be left with
none. ci/hooks.py tests each wheel in a venv made from conda-forge's
Python, as pip users install it. Every python: entry in
conda_build_config.yaml names its ABI, which ci/matrix.py requires, and
every push and tag run gets a concurrency group of its own.
conda-build reads x86 as any x86 CPU and has no osx64 selector, while
rattler-build has x86 for 32-bit only and osx64 for Intel macOS, so
ci/matrix.py now gives conda-build its own values for both and refuses a
conda-build skip that uses osx64.

ci/build.py keeps a search path entry only when it is $ORIGIN or a
directory under it, names RPATH and RUNPATH entries apart, and rewrites
the wheels in scratch, so a refused wheel never reaches --output.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant