diff --git a/.github/workflows/conda-package.yml b/.github/workflows/conda-package.yml
index df6d1251a3a..d9a26970e87 100644
--- a/.github/workflows/conda-package.yml
+++ b/.github/workflows/conda-package.yml
@@ -57,8 +57,6 @@ jobs:
shell: ${{ matrix.os == 'windows-2022' && 'cmd /C CALL {0}' || 'bash -el {0}' }}
env:
- build-conda-pkg-env: 'environments/build_conda_pkg.yml'
- build-env-name: 'build'
python-label: ${{ endsWith(matrix.python_spec, 't') && format('{0}t', matrix.python) || matrix.python }}
python-conda-spec: ${{ matrix.python_spec || matrix.python }}
@@ -73,46 +71,74 @@ jobs:
with:
fetch-depth: 0
- - name: Setup miniconda
- id: setup_miniconda
- continue-on-error: true
- uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1
+ # rattler-build is a standalone binary with no conda/Python dependency,
+ # so building conda packages with it doesn't need a full conda
+ # distribution on the runner - only rattler-build itself needs to be on
+ # PATH
+ - name: Setup rattler-build
+ uses: prefix-dev/rattler-build-action@v0.2.39
with:
- miniforge-version: latest
- use-mamba: 'true'
- conda-remove-defaults: 'true'
- environment-file: ${{ env.build-conda-pkg-env }}
- activate-environment: ${{ env.build-env-name }}
-
- - name: ReSetup miniconda
- if: steps.setup_miniconda.outcome == 'failure'
- uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1
- with:
- miniforge-version: latest
- use-mamba: 'true'
- conda-remove-defaults: 'true'
- environment-file: ${{ env.build-conda-pkg-env }}
- activate-environment: ${{ env.build-env-name }}
+ setup-only: true
- - name: List installed packages
- run: mamba list
+ - name: Check rattler-build version
+ run: rattler-build --version
- - name: Store conda paths as envs
+ - name: Store build output paths
shell: bash -el {0}
run: |
- echo "CONDA_BLD=$CONDA_PREFIX/conda-bld/${{ runner.os == 'Linux' && 'linux' || 'win' }}-64/" | tr "\\\\" '/' >> "$GITHUB_ENV"
+ echo "CONDA_BLD=$GITHUB_WORKSPACE/output/${{ runner.os == 'Linux' && 'linux-64' || 'win-64' }}/" >> "$GITHUB_ENV"
echo "WHEELS_OUTPUT_FOLDER=$GITHUB_WORKSPACE${{ runner.os == 'Linux' && '/' || '\\' }}" >> "$GITHUB_ENV"
+ - name: Compute version from git describe
+ shell: bash -el {0}
+ run: |
+ DESCRIBE=$(git describe --tags --long)
+ echo "GIT_DESCRIBE_TAG=$(echo "$DESCRIBE" | sed -E 's/-[0-9]+-g[0-9a-f]+$//')" >> "$GITHUB_ENV"
+ echo "GIT_DESCRIBE_NUMBER=$(echo "$DESCRIBE" | sed -E 's/^.*-([0-9]+)-g[0-9a-f]+$/\1/')" >> "$GITHUB_ENV"
+
+ # rattler-build looks for build.bat on Windows (build.sh/build.bat is the
+ # symmetric naming it expects), while conda-build is still used for this
+ # recipe in non-GitHub CI and required bld.bat.
+ # Keep bld.bat as the single real source file and
+ # just copy it under the name rattler-build needs, so both build systems
+ # keep working off the same script without maintaining two duplicates
+ - name: Prepare build.bat for rattler-build
+ if: runner.os == 'Windows'
+ shell: bash -el {0}
+ run: cp conda-recipe/bld.bat conda-recipe/build.bat
+
- name: Build conda package
id: build_conda_pkg
continue-on-error: true
- run: conda-build --no-test --python "${{ env.python-conda-spec }}" --numpy 2.0 ${{ env.channels-list }} conda-recipe
+ shell: bash -el {0}
+ run: |
+ read -ra RATTLER_CHANNELS <<< "$(echo "${{ env.channels-list }}" | sed 's/--override-channels//')"
+ rattler-build build \
+ --recipe conda-recipe \
+ --no-include-recipe \
+ --channel-priority disabled \
+ --target-platform ${{ runner.os == 'Linux' && 'linux-64' || 'win-64' }} \
+ --variant-config conda-recipe/conda_build_config.yaml \
+ --variant "python=${{ env.python-conda-spec }}" \
+ --variant numpy=2 \
+ "${RATTLER_CHANNELS[@]}"
env:
MAX_BUILD_CMPL_MKL_VERSION: '2027.0a0'
- name: ReBuild conda package
if: steps.build_conda_pkg.outcome == 'failure'
- run: conda-build --no-test --python "${{ env.python-conda-spec }}" --numpy 2.0 ${{ env.channels-list }} conda-recipe
+ shell: bash -el {0}
+ run: |
+ read -ra RATTLER_CHANNELS <<< "$(echo "${{ env.channels-list }}" | sed 's/--override-channels//')"
+ rattler-build build \
+ --recipe conda-recipe \
+ --no-include-recipe \
+ --channel-priority disabled \
+ --target-platform ${{ runner.os == 'Linux' && 'linux-64' || 'win-64' }} \
+ --variant-config conda-recipe/conda_build_config.yaml \
+ --variant "python=${{ env.python-conda-spec }}" \
+ --variant numpy=2 \
+ "${RATTLER_CHANNELS[@]}"
env:
MAX_BUILD_CMPL_MKL_VERSION: '2027.0a0'
diff --git a/conda-recipe/recipe.yaml b/conda-recipe/recipe.yaml
new file mode 100644
index 00000000000..a049fed2d61
--- /dev/null
+++ b/conda-recipe/recipe.yaml
@@ -0,0 +1,121 @@
+schema_version: 1
+
+context:
+ max_compiler_and_mkl_version: ${{ env.get("MAX_BUILD_CMPL_MKL_VERSION", default="2027.0a0") }}
+ required_compiler_version: ${{ env.get("MIN_BUILD_CMPL_VERSION", default="2026.1.1") }}
+ required_mkl_version: "2026.0"
+ required_dpctl_version: 0.23.0dev0
+
+package:
+ name: dpnp
+ version: ${{ env.get("GIT_DESCRIBE_TAG") }}
+
+source:
+ path: ..
+
+build:
+ number: ${{ env.get("GIT_DESCRIBE_NUMBER") }}
+ script:
+ env:
+ WHEELS_OUTPUT_FOLDER: ${{ env.get("WHEELS_OUTPUT_FOLDER", default="") }}
+ OVERRIDE_INTEL_IPO: ${{ env.get("OVERRIDE_INTEL_IPO", default="") }}
+ # conda-build used to forward GIT_DESCRIBE_NUMBER into the build script
+ # automatically; rattler-build does not, so bld.bat's
+ # `wheel tags --remove --build %GIT_DESCRIBE_NUMBER%` was silently
+ # getting an empty value on Windows, which made that command fail and
+ # broke the wheel install step further down the script.
+ GIT_DESCRIBE_NUMBER: ${{ env.get("GIT_DESCRIBE_NUMBER") }}
+ dynamic_linking:
+ missing_dso_allowlist:
+ - "*DPCTLSyclInterface*"
+ - "*/dpnp_backend_c.dll"
+
+requirements:
+ host:
+ - python
+ - pip >=25.0
+ - pybind11 >=3.0.2
+ - python-build>=1.2.2
+ - cmake>=3.31.6
+ - cython>=3.1.0
+ - dpctl >=${{ required_dpctl_version }}
+ - if: not win
+ then: ninja>=1.11.1
+ - numpy
+ - scikit-build>=0.18.1
+ - setuptools>=79.0.1
+ - wheel>=0.45.1
+ - versioneer ==0.29
+ # versioneer dependency
+ - if: match(python, "<3.11")
+ then: tomli
+ # Do not use pyproject.toml for setting dependencies on OneAPI packages
+ - mkl-devel-dpcpp >=${{ required_mkl_version }},<${{ max_compiler_and_mkl_version }}
+ - onedpl-devel
+ - tbb-devel
+ - if: win
+ then: opencl-headers >=2025.06.13
+ build:
+ - ${{ compiler('cxx') }}
+ - ${{ stdlib('c') }}
+ - ${{ compiler('dpcpp') }} >=${{ required_compiler_version }},<${{ max_compiler_and_mkl_version }}
+ run:
+ - python
+ - ${{ pin_compatible('dpctl', lower_bound='x.x.x', upper_bound=None) }}
+ - ${{ pin_compatible('dpcpp-cpp-rt', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('intel-sycl-rt', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('intel-cmplr-lib-rt', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('mkl', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('onemkl-sycl-blas', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('onemkl-sycl-dft', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('onemkl-sycl-lapack', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('onemkl-sycl-rng', lower_bound='x.x', upper_bound='x') }}
+ - ${{ pin_compatible('onemkl-sycl-vm', lower_bound='x.x', upper_bound='x') }}
+ - numpy
+ - if: linux
+ then: ocl-icd-system
+ - if: win
+ then: khronos-opencl-icd-loader
+ ignore_run_exports:
+ by_name:
+ - dpctl
+ - numpy
+ - python
+ # building with Intel DPC++ and do not import the MSVC runtime DLLs
+ - if: win
+ then: vc14_runtime
+ - if: win
+ then: ucrt
+
+tests:
+ - script:
+ - python -c "import dpnp; print(dpnp.__version__)"
+ requirements:
+ run:
+ - pytest
+ - setuptools
+ - if: match(python, "<3.14")
+ then: scipy
+
+about:
+ license: BSD-3-Clause
+ license_file: LICENSE.txt
+ summary: Data Parallel Extension for NumPy
+ description: |
+ LEGAL NOTICE: Use of this software package is subject to the
+ software license agreement (as set forth above, in the license section of
+ the installed Conda package and/or the README file) and all notices,
+ disclaimers or license terms for third party or open source software
+ included in or with the software.
+
+ EULA: BSD-3-Clause
+
+
+
+ homepage: https://github.com/IntelPython/dpnp
+
+extra:
+ recipe-maintainers:
+ - antonwolfy
+ - vlad-perevezentsev
+ - ndgrigorian
diff --git a/environments/build_conda_pkg.yml b/environments/build_conda_pkg.yml
index de6579c776b..b4c46bb3693 100644
--- a/environments/build_conda_pkg.yml
+++ b/environments/build_conda_pkg.yml
@@ -2,5 +2,4 @@ name: Build DPNP conda package
channels:
- conda-forge
dependencies:
- - conda-build=25.11.1
- - conda-verify=3.4.2
+ - rattler-build