conda-forge/conda-forge.github.io

enable windows arm64

beckermr opened this issue ยท 42 comments

This is a tracking issue to enable windows arm64.

We think the path forward is to cross-compile and do out of band testing on native hardware.

Let's put todo items here:

cc @zooba @isuruf @jakirkham @jezdez @chenghlee

@zooba I added a few TODOs above if you or someone else want to help.

zooba commented

@finnagin is looking at the conda-build changes, and will probably have some Qs about any user visible changes (such as how best to inform conda-build it should be doing a cross-compile). Hopefully that will unblock us to start looking at recipe/feedstock changes and figuring out the best way to automatically migrate existing ones (if needed).

@zooba, @finnagin, task 4 needs to be done to build some packages. Task 5 is needed only after python itself is built.

zooba commented

Task 4 is definitely first, yeah, and part of that seems to be plugging in the arch and host_arch configs to allow running an ARM64 targeted build on AMD64 machine. That plus a few recipe updates should enable building Python - we don't actually need conda/conda-build itself to run natively (it'll be nice, but it's not essential).

msvc_env_cmd is a deprecated function, so we need not update it to actually work. We just need it to not error out. So, a check for bits to see if it is arm64 and returning without doing anything should be enough.

zooba commented

@isuruf You mentioned in the call that you got the zlib build working. Can you post how you did that for @finnagin's benefit?

See conda-forge/zlib-feedstock#72

conda build recipe -m .ci_support/win_arm64_.yaml

zooba commented

Ah neat, it's using CMake's support. I guess that means the env variables needed were already being set? Or did those get slipped in recently without me noticing?

No, we should add support for an env variable like CMAKE_ARGS which we use in Linux/macOS. The two systems are so similar that even if cmake is not told that it is cross compiling, things just work because the correct compiler is used.

zooba commented

Oh cool, I didn't see where the compiler was being picked. Just a vcvarsall call? That should work for anything with MSBuild or setuptools (if relatively up to date) too.

Just a vcvarsall call?

Yes.

C:\Program Files\Microsoft Visual Studio\2022\Enterprise>CALL "VC\Auxiliary\Build\vcvarsamd64_arm64.bat" -vcvars_ver=14.35 10.0.22621.0 

Thanks @isuruf! This is very helpful!

isuruf commented

There should be a zlib package for win-arm64 now. It's untested though.

isuruf commented

Can someone with hardware access check the zstd package?
Download https://anaconda.org/conda-forge/zstd/1.5.2/download/win-arm64/zstd-1.5.2-h45ec737_7.conda
and run

conda build -t /path/to/zstd-1.5.2-h45ec737_7.conda

Hey @isuruf I can try running that for you! However, I'm currently waiting for access to the network that the machine I would use is on so I likely won't be able to do it until tomorrow.

Can someone with hardware access check the zstd package? Download https://anaconda.org/conda-forge/zstd/1.5.2/download/win-arm64/zstd-1.5.2-h45ec737_7.conda and run

conda build -t /path/to/zstd-1.5.2-h45ec737_7.conda

yes, I download it, but how to run it? I get the error ">conda build -t zstd-1.5.2-h45ec737_7.conda
'conda' is not recognized as an internal or external command,
operable program or batch file."

yes, I download it, but how to run it?

You need to have conda installed and conda build available. Both of these don't exist for win-arm64 yet, so I think it will be tricky to test these artefacts natively until we've built conda & conda-build...

Looking at conda install -n test conda conda-build and filtering out the noarch/ packages, that would mean building at least:

The following NEW packages will be INSTALLED:

  brotli-python      conda-forge/win-64::brotli-python-1.0.9-py311h12c1d0e_9
  bzip2              conda-forge/win-64::bzip2-1.0.8-h8ffe710_4
  ca-certificates    conda-forge/win-64::ca-certificates-2023.5.7-h56e8100_0
  cffi               conda-forge/win-64::cffi-1.15.1-py311h7d9ee11_3
  chardet            conda-forge/win-64::chardet-5.1.0-py311h1ea47a8_0
  conda              conda-forge/win-64::conda-23.5.0-py311h1ea47a8_1
  conda-build        conda-forge/win-64::conda-build-3.25.0-py311h1ea47a8_0
  cryptography       conda-forge/win-64::cryptography-41.0.2-py311h28e9c30_0
  libarchive         conda-forge/win-64::libarchive-3.6.2-h6f8411a_1
  libexpat           conda-forge/win-64::libexpat-2.5.0-h63175ca_1
  libffi             conda-forge/win-64::libffi-3.4.2-h8ffe710_5
  libiconv           conda-forge/win-64::libiconv-1.17-h8ffe710_0
  liblief            conda-forge/win-64::liblief-0.12.3-h63175ca_0
  libsqlite          conda-forge/win-64::libsqlite-3.42.0-hcfcfb64_0
  libxml2            conda-forge/win-64::libxml2-2.11.4-hc3477c8_0
  libzlib            conda-forge/win-64::libzlib-1.2.13-hcfcfb64_5
  lz4-c              conda-forge/win-64::lz4-c-1.9.4-hcfcfb64_0
  lzo                conda-forge/win-64::lzo-2.10-he774522_1000
  m2-msys2-runtime   conda-forge/win-64::m2-msys2-runtime-2.5.0.17080.65c939c-3
  m2-patch           conda-forge/win-64::m2-patch-2.7.5-2
  m2w64-gcc-libgfor~ conda-forge/win-64::m2w64-gcc-libgfortran-5.3.0-6
  m2w64-gcc-libs     conda-forge/win-64::m2w64-gcc-libs-5.3.0-7
  m2w64-gcc-libs-co~ conda-forge/win-64::m2w64-gcc-libs-core-5.3.0-7
  m2w64-gmp          conda-forge/win-64::m2w64-gmp-6.1.0-2
  m2w64-libwinpthre~ conda-forge/win-64::m2w64-libwinpthread-git-5.0.0.4634.697f757-2
  markupsafe         conda-forge/win-64::markupsafe-2.1.3-py311ha68e1ae_0
  menuinst           conda-forge/win-64::menuinst-1.4.19-py311h1ea47a8_1
  msys2-conda-epoch  conda-forge/win-64::msys2-conda-epoch-20160418-1
  openssl            conda-forge/win-64::openssl-3.1.1-hcfcfb64_1
  psutil             conda-forge/win-64::psutil-5.9.5-py311ha68e1ae_0
  py-lief            conda-forge/win-64::py-lief-0.12.3-py311h12c1d0e_0
  pycosat            conda-forge/win-64::pycosat-0.6.4-py311ha68e1ae_1
  python             conda-forge/win-64::python-3.11.4-h2628c8c_0_cpython
  python-libarchive~ conda-forge/win-64::python-libarchive-c-4.0-py311h1ea47a8_2
  python_abi         conda-forge/win-64::python_abi-3.11-3_cp311
  pyyaml             conda-forge/win-64::pyyaml-6.0-py311ha68e1ae_5
  ripgrep            conda-forge/win-64::ripgrep-13.0.0-h7f3b576_2
  ruamel.yaml        conda-forge/win-64::ruamel.yaml-0.17.32-py311ha68e1ae_0
  ruamel.yaml.clib   conda-forge/win-64::ruamel.yaml.clib-0.2.7-py311ha68e1ae_1
  tk                 conda-forge/win-64::tk-8.6.12-h8ffe710_0
  ucrt               conda-forge/win-64::ucrt-10.0.22621.0-h57928b3_0
  vc                 conda-forge/win-64::vc-14.3-h64f974e_17                           โœ… exists for win-arm64
  vc14_runtime       conda-forge/win-64::vc14_runtime-14.36.32532-hfdfe4a8_17          โœ… exists for win-arm64
  vs2015_runtime     conda-forge/win-64::vs2015_runtime-14.36.32532-h05e6639_17        โœ… exists for win-arm64
  xz                 conda-forge/win-64::xz-5.2.6-h8d14728_0
  yaml               conda-forge/win-64::yaml-0.2.5-h8ffe710_2
  zstandard          conda-forge/win-64::zstandard-0.19.0-py311he5d195f_2
  zstd               conda-forge/win-64::zstd-1.5.2-h12be248_7                         โœ… exists for win-arm64

I think it should be possible to stub out m2-patch (at least as long as we're not applying patches, which isn't necessary for testing artefacts), so we avoid having to build the msys2-stack

isuruf commented

Just install an x86_64 version of conda and conda-build (and windows 11 for x86_64 emulation) and run the command.

@isuruf when I run conda build -t /path/to/zstd-1.5.2-h45ec737_7.conda I get the following error:

Solving environment: ...working... failed
failed to get install actions, retrying.  exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', 'pkg-config'}
WARNING:conda_build.build:failed to get install actions, retrying.  exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', 'pkg-config'}

looks like cmake and pkg-config need arm64 versions first?

@isuruf when I run conda build -t /path/to/zstd-1.5.2-h45ec737_7.conda I get the following error:

Solving environment: ...working... failed
failed to get install actions, retrying.  exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', 'pkg-config'}
WARNING:conda_build.build:failed to get install actions, retrying.  exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', 'pkg-config'}

looks like cmake and pkg-config need arm64 versions first?

(base) C:\Users\shijunz\Downloads>conda build -t zstd-1.5.2-h45ec737_7.conda
TEST START: zstd-1.5.2-h45ec737_7.conda
Copying package to conda-build croot. No packages otherwise alongside yours will be available unless you specify -c local.
To avoid this warning, your package must reside in a channel structure with platform-subfolders. See more info on what a
valid channel is at https://conda.io/docs/user-guide/tasks/create-custom-channels.html
WARNING:conda_build.build:Copying package to conda-build croot. No packages otherwise alongside yours will be available un
less you specify -c local. To avoid this warning, your package must reside in a channel structure with platform-subfolders
. See more info on what a valid channel is at https://conda.io/docs/user-guide/tasks/create-custom-channels.html
INFO:conda_index.index.convert_cache:Migrate database
INFO:conda_index.index.convert_cache:CONVERT .cache
INFO:conda_index.index.convert_cache:Migrate database
INFO:conda_index.index:noarch cached 0 B from 0 packages at 0 B/second
INFO:conda_index.index.convert_cache:Migrate database
INFO:conda_index.index.convert_cache:CONVERT .cache
INFO:conda_index.index.convert_cache:Migrate database
INFO:conda_index.index:win-arm64 cached 253 KB from 1 packages at 22.5 MB/second
INFO:conda_index.index:Subdir: noarch Gathering repodata
INFO:conda_index.index:noarch Writing pre-patch repodata
INFO:conda_index.index:noarch Applying patch instructions
INFO:conda_index.index:noarch Writing patched repodata
INFO:conda_index.index:noarch Building current_repodata subset
INFO:conda_index.index:noarch Writing current_repodata subset
INFO:conda_index.index:noarch Writing index HTML
INFO:conda_index.index:Completed noarch
INFO:conda_index.index:Subdir: win-arm64 Gathering repodata
INFO:conda_index.index:win-arm64 Writing pre-patch repodata
INFO:conda_index.index:win-arm64 Applying patch instructions
INFO:conda_index.index:win-arm64 Writing patched repodata
INFO:conda_index.index:win-arm64 Building current_repodata subset
INFO:conda_index.index:win-arm64 Writing current_repodata subset
INFO:conda_index.index:win-arm64 Writing index HTML
INFO:conda_index.index:Completed win-arm64
INFO:conda_index.index:Channeldata subdir: noarch
INFO:conda_index.index:Channeldata subdir: win-arm64
Multiple meta files found. The meta.yaml file in the base directory (C:\Users\shijunz\AppData\Local\Temp\tmpgcv9dcgo\info\r
ecipe) will be used.
WARNING:conda_build.utils:Multiple meta files found. The meta.yaml file in the base directory (C:\Users\shijunz\AppData\Loc
al\Temp\tmpgcv9dcgo\info\recipe) will be used.
No numpy version specified in conda_build_config.yaml. Falling back to default numpy value of 1.22
WARNING:conda_build.metadata:No numpy version specified in conda_build_config.yaml. Falling back to default numpy value of
1.22
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... failed
failed to get install actions, retrying. exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', "libz
lib[version='>=1.2.13,<1.3.0a0']", 'pkg-config', "vc14_runtime[version='>=14.36.32532']", "vc[version='>=14.3,<15']", 'vs20
22_win-arm64'}
WARNING:conda_build.build:failed to get install actions, retrying. exception was: Unsatisfiable dependencies for platform
win-arm64: {'cmake', "libzlib[version='>=1.2.13,<1.3.0a0']", 'pkg-config', "vc14_runtime[version='>=14.36.32532']", "vc[ver
sion='>=14.3,<15']", 'vs2022_win-arm64'}

Leaving build/test directories:
Work:
C:\ProgramData\miniconda3\conda-bld\work
Test:
C:\ProgramData\miniconda3\conda-bld\test_tmp
Leaving build/test environments:
Test:
source activate C:\ProgramData\miniconda3\conda-bld_test_env
Build:
source activate C:\ProgramData\miniconda3\conda-bld_build_env

TESTS FAILED: zstd-1.5.2-h45ec737_7.tar.bz2

(base) C:\Users\shijunz\Downloads>

@isuruf when I run conda build -t /path/to/zstd-1.5.2-h45ec737_7.conda I get the following error:

Solving environment: ...working... failed
failed to get install actions, retrying.  exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', 'pkg-config'}
WARNING:conda_build.build:failed to get install actions, retrying.  exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', 'pkg-config'}

looks like cmake and pkg-config need arm64 versions first?

cmake should be ok, I build a lot windows on arm64 app using the x64 version cmake. it support crossing build. maybe we should not check the it? or just tell the cmake -A arm64.

but the pkg-config I have no idea.

Just install an x86_64 version of conda and conda-build (and windows 11 for x86_64 emulation) and run the command.

llecting package metadata (repodata.json): ...working... done
Solving environment: ...working... failed
failed to get install actions, retrying. exception was: Unsatisfiable dependencies for platform win-arm64: {'pkg-config', "vc[version='>=14.3,<15']", "vc14_runtime[version='>=14.36.32532']", 'cmake', "libzlib[version='>=1.2.13,<1.3.0a0']", 'vs2022_win-arm64'}
WARNING:conda_build.build:failed to get install actions, retrying. exception was: Unsatisfiable dependencies for platform win-arm64: {'pkg-config', "vc[version='>=14.3,<15']", "vc14_runtime[version='>=14.36.32532']", 'cmake', "libzlib[version='>=1.2.13,<1.3.0a0']", 'vs2022_win-arm64'}

yes, I run it on the windows 11 for x86-64 emulation mode) and get the similar error.

cmake should be ok, I build a lot windows on arm64 app using the x64 version cmake. it support crossing build.

If it's relevant, in addition to cross-compiling with the x64 version cmake also has arm64 Windows releases.

isuruf commented

We'll need to disable those tests for now. In the meantime, can you do,

set CONDA_SUBDIR=win-arm64
conda create -n arm64 zstd
set CONDA_SUBDIR=
conda activate arm64
conda config --env --set subdir win-arm64

and then try zstd --version?

Sure!

>zstd --version
*** Zstandard CLI (64-bit) v1.5.5, by Yann Collet ***

(arm64) C:\Windows\System32>conda install zstd
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

  • zstd

Current channels:

To search for alternate channels that may provide the conda package you're
looking for, navigate to

https://anaconda.org

and use the search bar at the top of the page.

isuruf commented

@shijunz, you need to add conda-forge to the list of channels.
@finnagin, thanks.

@shijunz, you need to add conda-forge to the list of channels. @finnagin, thanks.

(env_win-arm64) C:>conda install -c conda-forge zstd
Collecting package metadata (current_repodata.json): done
Solving environment: done

Package Plan

environment location: C:\Users\shijunz\AppData\Local\miniconda3\envs\env_win-arm64

added / updated specs:
- zstd

The following packages will be downloaded:

package                    |            build
---------------------------|-----------------
libzlib-1.2.13             |       h50ba5a6_5          52 KB  conda-forge
vc-14.3                    |      h6ed9334_17          16 KB  conda-forge
vc14_runtime-14.36.32532   |      he64ce00_17        14.4 MB  conda-forge
zstd-1.5.2                 |       h45ec737_7         253 KB  conda-forge
------------------------------------------------------------
                                       Total:        14.7 MB

The following NEW packages will be INSTALLED:

libzlib conda-forge/win-arm64::libzlib-1.2.13-h50ba5a6_5
vc conda-forge/win-arm64::vc-14.3-h6ed9334_17
vc14_runtime conda-forge/win-arm64::vc14_runtime-14.36.32532-he64ce00_17
zstd conda-forge/win-arm64::zstd-1.5.2-h45ec737_7

Proceed ([y]/n)? y

Downloading and Extracting Packages

Preparing transaction: done
Verifying transaction: done
Executing transaction: done

but, in window on arm, I can NOT run ' conda build -t /path/to/zstd-1.5.2-h45ec737_7.conda', because I try to

(env_win-arm64) C:\Users\shijunz\Downloads>conda install -c conda-forge conda-build
Collecting package metadata (current_repodata.json): done
Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

  • conda-build

Current channels:

To search for alternate channels that may provide the conda package you're
looking for, navigate to

https://anaconda.org

and use the search bar at the top of the page.

I run conda install conda-build at the x64 env, and conda info show the conda-build is ok, but run : conda build -t zstd-1.5.2-h45ec737_7.tar.bz2n and get the same error.
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... failed
failed to get install actions, retrying. exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', "vc14_runtime[version='>=14.36.32532']", 'pkg-config', "libzlib[version='>=1.2.13,<1.3.0a0']", "vc[version='>=14.3,<15']", 'vs2022_win-arm64'}
WARNING:conda_build.build:failed to get install actions, retrying. exception was: Unsatisfiable dependencies for platform win-arm64: {'cmake', "vc14_runtime[version='>=14.36.32532']", 'pkg-config', "libzlib[version='>=1.2.13,<1.3.0a0']", "vc[version='>=14.3,<15']", 'vs2022_win-arm64'}

win_arm64 should be added to the provider section of the docs

I'm going to unpin this for now to make space for the numpy migration in the top bar, which is going to hit a lot of feedstocks now. We can repin it of course once things calm down there.

Repinning this now that a slot opened up again, after the stdlib migration has been unpinned

cc @arnabanimesh (as this context may also be useful in your efforts to rebuild for Windows ARM ๐Ÿ™‚)