From 3d7bf40b19274c652a87123161f4ac396450d5cb Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 16:56:10 +0800 Subject: [PATCH 1/8] Add Windows ARM64 wheel support --- .github/workflows/ci.yml | 62 +++++++++++++++++++ continuous-delivery/build-wheels-winarm64.bat | 36 +++++++++++ setup.py | 28 +++++++++ 3 files changed, 126 insertions(+) create mode 100644 continuous-delivery/build-wheels-winarm64.bat diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 77e98ae8e..5451dce6d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -308,6 +308,68 @@ jobs: python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" python builder.pyz build -p ${{ env.PACKAGE_NAME }} --python "${{ steps.python38.outputs.python-path }}" + windows-arm64: + runs-on: windows-11-arm + strategy: + fail-fast: false + matrix: + include: + - build-python: '3.11' + test-python: '3.11' + - build-python: '3.11' + test-python: '3.12' + - build-python: '3.13' + test-python: '3.13' + - build-python: '3.13' + test-python: '3.14' + - build-python: '3.13t' + test-python: '3.13t' + - build-python: '3.14t' + test-python: '3.14t' + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.build-python }} + architecture: arm64 + - uses: ilammy/msvc-dev-cmd@v1 + with: + arch: arm64 + - name: Build Windows ARM64 wheel + shell: pwsh + run: | + python -m pip install --upgrade build + python -m build --wheel + $wheel = @(Get-Item dist\*win_arm64.whl) + if ($wheel.Count -ne 1) { + throw 'Expected exactly one win_arm64 wheel' + } + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.test-python }} + architecture: arm64 + - name: Test installed wheel + shell: pwsh + env: + AWS_TEST_LOCALHOST: '1' + run: | + python -m venv ..\awscrt-test + $wheel = @(Get-Item dist\*win_arm64.whl) + if ($wheel.Count -ne 1) { + throw 'Expected exactly one win_arm64 wheel' + } + ..\awscrt-test\Scripts\python.exe -m pip install $wheel[0].FullName + ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' + Copy-Item test "$env:RUNNER_TEMP\test" -Recurse + Push-Location $env:RUNNER_TEMP + try { + & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" -m unittest discover --failfast --verbose + } finally { + Pop-Location + } + macos: runs-on: macos-14 # latest permissions: diff --git a/continuous-delivery/build-wheels-winarm64.bat b/continuous-delivery/build-wheels-winarm64.bat new file mode 100644 index 000000000..3b96f9f83 --- /dev/null +++ b/continuous-delivery/build-wheels-winarm64.bat @@ -0,0 +1,36 @@ +@echo off + +if not defined PYTHON311_ARM64 goto missing_python +if not defined PYTHON313_ARM64 goto missing_python +if not defined PYTHON313T_ARM64 goto missing_python +if not defined PYTHON314T_ARM64 goto missing_python + +for %%P in ("%PYTHON311_ARM64%" "%PYTHON313_ARM64%" "%PYTHON313T_ARM64%" "%PYTHON314T_ARM64%") do ( + "%%~P" -c "import sysconfig; raise SystemExit(0 if sysconfig.get_platform() == 'win-arm64' else 1)" || goto wrong_architecture +) + +"%PYTHON313_ARM64%" continuous-delivery\update-version.py || goto error + +:: The 3.11 stable ABI wheel also supports Python 3.12. +"%PYTHON311_ARM64%" -m build || goto error + +:: Use the 3.13 stable ABI from 3.13 onwards because of deprecated functions. +"%PYTHON313_ARM64%" -m build || goto error + +:: Free-threaded builds do not support the Limited C API or stable ABI. +"%PYTHON313T_ARM64%" -m build || goto error +"%PYTHON314T_ARM64%" -m build || goto error + +goto :EOF + +:missing_python +echo PYTHON311_ARM64, PYTHON313_ARM64, PYTHON313T_ARM64, and PYTHON314T_ARM64 must point to native ARM64 Python executables. +exit /b 1 + +:wrong_architecture +echo All configured Python executables must target win-arm64. +exit /b 1 + +:error +echo Failed with error #%errorlevel%. +exit /b %errorlevel% \ No newline at end of file diff --git a/setup.py b/setup.py index bcf0b0456..7a1e28809 100644 --- a/setup.py +++ b/setup.py @@ -48,6 +48,10 @@ def is_32bit(): return is_64bit() == False +def is_windows_arm64(): + return sys.platform == 'win32' and sysconfig.get_platform() == 'win-arm64' + + # TODO: Fix this. Since adding pyproject.toml, it always returns False def is_development_mode(): """Return whether we're building in Development Mode (a.k.a. “Editable Installs”). @@ -196,6 +200,20 @@ def determine_generator_args(cmake_version=None, windows_sdk_version=None): print('Using Visual Studio', vs_version, vs_year) + if is_windows_arm64(): + if not shutil.which('clang-cl'): + raise RuntimeError('clang-cl is required to build for Windows ARM64') + print('Using Ninja and clang-cl for Windows ARM64') + return [ + '-G', 'Ninja', + f'-DCMAKE_SYSTEM_VERSION={windows_sdk_version}', + '-DCMAKE_C_COMPILER=clang-cl', + '-DCMAKE_CXX_COMPILER=clang-cl', + '-DCMAKE_ASM_COMPILER=clang-cl', + # The optimized ARM checksum sources do not compile with clang-cl. + '-DUSE_CPU_EXTENSIONS=OFF', + ] + if vs_year <= 2017: # For VS2017 and earlier, architecture goes at end of generator string if is_64bit(): @@ -325,6 +343,16 @@ def __init__(self, name, extra_cmake_args=[], libname=None): class awscrt_build_ext(setuptools.command.build_ext.build_ext): + def build_extensions(self): + if is_windows_arm64(): + if not self.compiler.initialized: + self.compiler.initialize() + clang_cl = shutil.which('clang-cl') + if not clang_cl: + raise RuntimeError('clang-cl is required to build for Windows ARM64') + self.compiler.cc = clang_cl + super().build_extensions() + def _build_dependencies_impl(self, build_dir, install_path, osx_arch=None): cmake = get_cmake_path() From cca25c3b83afc7946ad594937b4c61e1a92628cc Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:03:57 +0800 Subject: [PATCH 2/8] Stage HTTP test server for ARM64 CI --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5451dce6d..b2b1891e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -363,6 +363,10 @@ jobs: ..\awscrt-test\Scripts\python.exe -m pip install $wheel[0].FullName ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' Copy-Item test "$env:RUNNER_TEMP\test" -Recurse + $httpTests = "$env:RUNNER_TEMP\crt\aws-c-http\tests" + New-Item $httpTests -ItemType Directory -Force | Out-Null + Copy-Item crt\aws-c-http\tests\mock_server $httpTests -Recurse + Copy-Item crt\aws-c-http\tests\resources $httpTests -Recurse Push-Location $env:RUNNER_TEMP try { & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" -m unittest discover --failfast --verbose From 29b62b6e3521c91f8135a08424f39fa49f0d5c13 Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:13:17 +0800 Subject: [PATCH 3/8] Isolate unavailable httpbin test in ARM64 CI --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2b1891e9..1d34428cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -361,7 +361,7 @@ jobs: throw 'Expected exactly one win_arm64 wheel' } ..\awscrt-test\Scripts\python.exe -m pip install $wheel[0].FullName - ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' + ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' 'pytest>=8.4' Copy-Item test "$env:RUNNER_TEMP\test" -Recurse $httpTests = "$env:RUNNER_TEMP\crt\aws-c-http\tests" New-Item $httpTests -ItemType Directory -Force | Out-Null @@ -369,7 +369,8 @@ jobs: Copy-Item crt\aws-c-http\tests\resources $httpTests -Recurse Push-Location $env:RUNNER_TEMP try { - & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" -m unittest discover --failfast --verbose + # This test depends on httpbin.org returning 404, but the service currently returns 503. + & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" -m pytest test --maxfail=1 --verbose -k 'not test_h2_remote_end_stream_ordering' } finally { Pop-Location } From 69bbcffd9e1d26e461983bf460e4594831e2ef89 Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:20:21 +0800 Subject: [PATCH 4/8] Run filtered ARM64 tests with unittest --- .github/workflows/ci.yml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d34428cd..4e083a24f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -361,7 +361,7 @@ jobs: throw 'Expected exactly one win_arm64 wheel' } ..\awscrt-test\Scripts\python.exe -m pip install $wheel[0].FullName - ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' 'pytest>=8.4' + ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' Copy-Item test "$env:RUNNER_TEMP\test" -Recurse $httpTests = "$env:RUNNER_TEMP\crt\aws-c-http\tests" New-Item $httpTests -ItemType Directory -Force | Out-Null @@ -370,7 +370,24 @@ jobs: Push-Location $env:RUNNER_TEMP try { # This test depends on httpbin.org returning 404, but the service currently returns 503. - & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" -m pytest test --maxfail=1 --verbose -k 'not test_h2_remote_end_stream_ordering' + @' + import unittest + + excluded = 'test.test_aiohttp_client.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering' + discovered = unittest.defaultTestLoader.discover('test') + filtered = unittest.TestSuite() + + def add_tests(suite): + for test in suite: + if isinstance(test, unittest.TestSuite): + add_tests(test) + elif test.id() != excluded: + filtered.addTest(test) + + add_tests(discovered) + result = unittest.TextTestRunner(verbosity=2, failfast=True).run(filtered) + raise SystemExit(0 if result.wasSuccessful() else 1) + '@ | & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" - } finally { Pop-Location } From 6d9c7f21ad32a15ce1671df34287bba3b19a7de6 Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:26:54 +0800 Subject: [PATCH 5/8] Avoid here-string indentation in ARM64 CI --- .github/workflows/ci.yml | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e083a24f..e77c72175 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -370,24 +370,22 @@ jobs: Push-Location $env:RUNNER_TEMP try { # This test depends on httpbin.org returning 404, but the service currently returns 503. - @' - import unittest - - excluded = 'test.test_aiohttp_client.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering' - discovered = unittest.defaultTestLoader.discover('test') - filtered = unittest.TestSuite() - - def add_tests(suite): - for test in suite: - if isinstance(test, unittest.TestSuite): - add_tests(test) - elif test.id() != excluded: - filtered.addTest(test) - - add_tests(discovered) - result = unittest.TextTestRunner(verbosity=2, failfast=True).run(filtered) - raise SystemExit(0 if result.wasSuccessful() else 1) - '@ | & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" - + $testScript = @( + 'import unittest' + "excluded = 'test.test_aiohttp_client.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering'" + "discovered = unittest.defaultTestLoader.discover('test')" + 'filtered = unittest.TestSuite()' + 'def add_tests(suite):' + ' for test in suite:' + ' if isinstance(test, unittest.TestSuite):' + ' add_tests(test)' + ' elif test.id() != excluded:' + ' filtered.addTest(test)' + 'add_tests(discovered)' + 'result = unittest.TextTestRunner(verbosity=2, failfast=True).run(filtered)' + 'raise SystemExit(0 if result.wasSuccessful() else 1)' + ) -join "`n" + & "$env:GITHUB_WORKSPACE\..\awscrt-test\Scripts\python.exe" -c $testScript } finally { Pop-Location } From 4995f43c47b4fa0624c6600e622a261cfd5bd267 Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:35:27 +0800 Subject: [PATCH 6/8] Match isolated HTTP test ID --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e77c72175..c29819d47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -372,14 +372,14 @@ jobs: # This test depends on httpbin.org returning 404, but the service currently returns 503. $testScript = @( 'import unittest' - "excluded = 'test.test_aiohttp_client.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering'" + "excluded = '.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering'" "discovered = unittest.defaultTestLoader.discover('test')" 'filtered = unittest.TestSuite()' 'def add_tests(suite):' ' for test in suite:' ' if isinstance(test, unittest.TestSuite):' ' add_tests(test)' - ' elif test.id() != excluded:' + ' elif not test.id().endswith(excluded):' ' filtered.addTest(test)' 'add_tests(discovered)' 'result = unittest.TextTestRunner(verbosity=2, failfast=True).run(filtered)' From 46c0b26d476b782623775ae95be2f878faf6d258 Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:44:39 +0800 Subject: [PATCH 7/8] Exclude both unavailable httpbin tests --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c29819d47..7f4d8e6f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -369,17 +369,17 @@ jobs: Copy-Item crt\aws-c-http\tests\resources $httpTests -Recurse Push-Location $env:RUNNER_TEMP try { - # This test depends on httpbin.org returning 404, but the service currently returns 503. + # These tests depend on httpbin.org returning 404, but the service currently returns 503. $testScript = @( 'import unittest' - "excluded = '.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering'" + "excluded = ('.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering', '.Http2RemoteEndStreamTest.test_h2_remote_end_stream_ordering')" "discovered = unittest.defaultTestLoader.discover('test')" 'filtered = unittest.TestSuite()' 'def add_tests(suite):' ' for test in suite:' ' if isinstance(test, unittest.TestSuite):' ' add_tests(test)' - ' elif not test.id().endswith(excluded):' + ' elif not any(test.id().endswith(test_id) for test_id in excluded):' ' filtered.addTest(test)' 'add_tests(discovered)' 'result = unittest.TextTestRunner(verbosity=2, failfast=True).run(filtered)' From ef45c356a7e8970eed3aa85306bf738150075b07 Mon Sep 17 00:00:00 2001 From: ssss141414 Date: Fri, 21 Aug 2026 17:55:47 +0800 Subject: [PATCH 8/8] Harden ARM64 wheel validation --- .github/workflows/ci.yml | 27 ++++++++++++++----- continuous-delivery/build-wheels-winarm64.bat | 11 ++++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f4d8e6f3..df35b5191 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -316,16 +316,22 @@ jobs: include: - build-python: '3.11' test-python: '3.11' + expected-tag: 'cp311-abi3-win_arm64' - build-python: '3.11' test-python: '3.12' + expected-tag: 'cp311-abi3-win_arm64' - build-python: '3.13' test-python: '3.13' + expected-tag: 'cp313-abi3-win_arm64' - build-python: '3.13' test-python: '3.14' + expected-tag: 'cp313-abi3-win_arm64' - build-python: '3.13t' test-python: '3.13t' + expected-tag: 'cp313-cp313t-win_arm64' - build-python: '3.14t' test-python: '3.14t' + expected-tag: 'cp314-cp314t-win_arm64' steps: - uses: actions/checkout@v4 with: @@ -342,10 +348,12 @@ jobs: run: | python -m pip install --upgrade build python -m build --wheel - $wheel = @(Get-Item dist\*win_arm64.whl) - if ($wheel.Count -ne 1) { - throw 'Expected exactly one win_arm64 wheel' + $wheel = @(Get-Item "dist\awscrt-*-${{ matrix.expected-tag }}.whl") + $allWheels = @(Get-Item dist\*.whl) + if ($wheel.Count -ne 1 -or $allWheels.Count -ne 1) { + throw 'Expected exactly one wheel with tag ${{ matrix.expected-tag }}' } + python -c "import sys, zipfile; p=sys.argv[1]; expected='Tag: ' + sys.argv[2]; z=zipfile.ZipFile(p); wheel=z.read(next(n for n in z.namelist() if n.endswith('.dist-info/WHEEL'))).decode().splitlines(); assert expected in wheel, (expected, wheel)" $wheel[0].FullName '${{ matrix.expected-tag }}' - uses: actions/setup-python@v5 with: python-version: ${{ matrix.test-python }} @@ -356,9 +364,9 @@ jobs: AWS_TEST_LOCALHOST: '1' run: | python -m venv ..\awscrt-test - $wheel = @(Get-Item dist\*win_arm64.whl) + $wheel = @(Get-Item "dist\awscrt-*-${{ matrix.expected-tag }}.whl") if ($wheel.Count -ne 1) { - throw 'Expected exactly one win_arm64 wheel' + throw 'Expected exactly one wheel with tag ${{ matrix.expected-tag }}' } ..\awscrt-test\Scripts\python.exe -m pip install $wheel[0].FullName ..\awscrt-test\Scripts\python.exe -m pip install 'websockets>=13.1' 'h2==4.1.0' @@ -372,16 +380,21 @@ jobs: # These tests depend on httpbin.org returning 404, but the service currently returns 503. $testScript = @( 'import unittest' - "excluded = ('.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering', '.Http2RemoteEndStreamTest.test_h2_remote_end_stream_ordering')" + "excluded = {'test_aiohttp_client.AIOHttp2RemoteEndStreamTest.test_h2_remote_end_stream_ordering', 'test_http_client.Http2RemoteEndStreamTest.test_h2_remote_end_stream_ordering'}" + 'excluded_found = set()' "discovered = unittest.defaultTestLoader.discover('test')" 'filtered = unittest.TestSuite()' 'def add_tests(suite):' ' for test in suite:' ' if isinstance(test, unittest.TestSuite):' ' add_tests(test)' - ' elif not any(test.id().endswith(test_id) for test_id in excluded):' + ' elif test.id() in excluded:' + ' excluded_found.add(test.id())' + ' else:' ' filtered.addTest(test)' 'add_tests(discovered)' + "if excluded_found != excluded: raise RuntimeError(f'Expected exclusions {excluded}, found {excluded_found}')" + "if filtered.countTestCases() == 0: raise RuntimeError('No tests discovered')" 'result = unittest.TextTestRunner(verbosity=2, failfast=True).run(filtered)' 'raise SystemExit(0 if result.wasSuccessful() else 1)' ) -join "`n" diff --git a/continuous-delivery/build-wheels-winarm64.bat b/continuous-delivery/build-wheels-winarm64.bat index 3b96f9f83..cff24192d 100644 --- a/continuous-delivery/build-wheels-winarm64.bat +++ b/continuous-delivery/build-wheels-winarm64.bat @@ -5,9 +5,10 @@ if not defined PYTHON313_ARM64 goto missing_python if not defined PYTHON313T_ARM64 goto missing_python if not defined PYTHON314T_ARM64 goto missing_python -for %%P in ("%PYTHON311_ARM64%" "%PYTHON313_ARM64%" "%PYTHON313T_ARM64%" "%PYTHON314T_ARM64%") do ( - "%%~P" -c "import sysconfig; raise SystemExit(0 if sysconfig.get_platform() == 'win-arm64' else 1)" || goto wrong_architecture -) +"%PYTHON311_ARM64%" -c "import sys, sysconfig; raise SystemExit(0 if sys.version_info[:2] == (3, 11) and sysconfig.get_platform() == 'win-arm64' and not sysconfig.get_config_var('Py_GIL_DISABLED') else 1)" || goto wrong_python +"%PYTHON313_ARM64%" -c "import sys, sysconfig; raise SystemExit(0 if sys.version_info[:2] == (3, 13) and sysconfig.get_platform() == 'win-arm64' and not sysconfig.get_config_var('Py_GIL_DISABLED') else 1)" || goto wrong_python +"%PYTHON313T_ARM64%" -c "import sys, sysconfig; raise SystemExit(0 if sys.version_info[:2] == (3, 13) and sysconfig.get_platform() == 'win-arm64' and sysconfig.get_config_var('Py_GIL_DISABLED') else 1)" || goto wrong_python +"%PYTHON314T_ARM64%" -c "import sys, sysconfig; raise SystemExit(0 if sys.version_info[:2] == (3, 14) and sysconfig.get_platform() == 'win-arm64' and sysconfig.get_config_var('Py_GIL_DISABLED') else 1)" || goto wrong_python "%PYTHON313_ARM64%" continuous-delivery\update-version.py || goto error @@ -27,8 +28,8 @@ goto :EOF echo PYTHON311_ARM64, PYTHON313_ARM64, PYTHON313T_ARM64, and PYTHON314T_ARM64 must point to native ARM64 Python executables. exit /b 1 -:wrong_architecture -echo All configured Python executables must target win-arm64. +:wrong_python +echo Configured Python executables must have the expected version, win-arm64 platform, and free-threaded status. exit /b 1 :error