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