Skip to content

Windows ARM64EC support (replaces 32-bit builds); update iPlug2 to current master#659

Draft
olilarkin wants to merge 8 commits into
sdatkinson:mainfrom
olilarkin:iplug2-master
Draft

Windows ARM64EC support (replaces 32-bit builds); update iPlug2 to current master#659
olilarkin wants to merge 8 commits into
sdatkinson:mainfrom
olilarkin:iplug2-master

Conversation

@olilarkin

@olilarkin olilarkin commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Hey steve,

here is an example of how you can add ARM64EC support to NeuralAmplModelerPlugin and update the iPlug2 submodule with a couple of your changes reapplied on master. Should be similar for Gateway.

Oli

Summary

Adds Windows on ARM support by replacing the 32-bit (Win32) MSVC configurations with ARM64EC, and retargets the iPlug2 submodule to a branch based on current official iPlug2 master (which has upstream ARM64EC support) plus the two NAM-specific fixes from the sdatkinson/iPlug2 fork.

ARM64EC binaries run natively on ARM64 Windows while remaining loadable by x64 hosts running under emulation. The VST3 is a single multi-arch bundle (Contents/x86_64-win + Contents/arm64ec-win), so one bundle serves both architectures.

iPlug2 submodule

The submodule now points at the nam-fixes branch of olilarkin/iPlug2: official iPlug2 master (b64192fe1) with two cherry-picks from the sdatkinson fork:

  • Fix standalone app channel selection (Fix standalone app channel selection iPlug2#16), adapted to master's RtAudio code
  • Windows: fix VST3 bundle resource path and create_bundle for spaced paths, merged with master's ARM64EC handling (the arch folder is now selected via _M_ARM64EC, fixing ARM64EC VST3 resource resolution — ARM64EC also defines _WIN64, so the previous ARCH_64BIT check picked the wrong folder)

The unicode commits from the old fork are already present in current iPlug2 master in updated form. .gitmodules temporarily points at olilarkin/iPlug2; once nam-fixes is merged into sdatkinson/iPlug2 it can be flipped back.

Plugin changes

  • MSVC projects/solution: Win32 platform → ARM64EC (Debug/Release/Tracer), x86-only SSE2 flags removed; property macros renamed to the current iPlug2 scheme (VST3_32/64_*VST3_ARM64EC/X64_*, etc.)
  • WDL/win32_utf8.c compiled into app/vst3/aax projects (current iPlug2 routes fopen/strftime through WDL's UTF-8 wrappers)
  • postbuild/makedist/makezip: ARM64EC pass added; the Windows zip now ships the whole multi-arch .vst3 bundle (previously the two inner binaries collided on the same archive name) plus NeuralAmpModeler_ARM64EC.exe; build failures now abort the script instead of leaving CI green
  • macOS: AU target's Carbon Rez phase removed (unsupported by modern Xcode; IPlugAU.r moved to Copy Bundle Resources); AudioDSPTools' vendored WDL headers removed from Xcode project membership (the headermap let them shadow iPlug2's ptrlist.h, breaking the build against current WDL)
  • CI: Windows jobs pinned to windows-2022windows-latest images ship VS2026, which lacks the v143 ARM64EC toolset

Building ARM64EC

Requires VS2022 with both "MSVC v143 – C++ ARM64EC build tools" and "MSVC v143 – C++ ARM64/ARM64EC build tools" components (the ARM64 component provides Microsoft.Cpp.BuildAsX.Common.targets). makedist-win.bat builds x64 and ARM64EC in sequence.

Verification

  • Release x64 and ARM64EC builds of APP and VST3 verified locally (ARM64EC binaries confirmed as ARM64X hybrids via dumpbin) and on CI: green Build Native run with inspected artifacts containing both architectures
  • macOS CI builds unchanged formats successfully
  • Not yet tested on ARM64 Windows hardware

🤖 Generated with Claude Code

olilarkin and others added 8 commits July 23, 2026 21:47
Port of iPlug2OOS ARM64EC support (iPlug2OOS 38f729e / iPlug2 PR #1238)
to the NeuralAmpModeler MSVC projects:

- Replace the Win32 platform with ARM64EC in the solution and the
  app/vst3/aax projects (Debug/Release/Tracer), dropping the x86-only
  SSE2 EnableEnhancedInstructionSet settings
- Rename property macros to the current iPlug2 naming scheme:
  VST3_32/64_* -> VST3_ARM64EC/X64_*, AAX_32/64_* -> AAX_ARM64EC/X64_*
- postbuild-win.bat: ARM64EC binaries go to the arm64ec-win folder of
  the multi-arch VST3 bundle, NAME_ARM64EC.exe for the standalone
- makedist-win.bat: use VS2022 vcvarsall and build both x64 and ARM64EC
- makezip-win.py: include ARM64EC vst3/exe binaries and pdbs
- Bump iPlug2 submodule (arm64ec branch) with the runtime/bundle-script
  backport: arm64ec-win VST3 bundle arch folder in BundleResourcePath
  and create_bundle.bat

ARM64EC builds require VS2022 with the MSVC v143 ARM64EC build tools
component installed (Microsoft.VisualStudio.Component.VC.Tools.ARM64EC).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Move the iPlug2 submodule from the sdatkinson fork (based on Dec 2023
iPlug2) to a new nam-fixes branch: official iPlug2 master (b64192fe1,
which includes upstream ARM64EC support from PR #1238) plus the two
NAM-specific fixes cherry-picked from the fork:

- Fix standalone app channel selection
- Windows: fix VST3 bundle resource path and create_bundle for spaced
  paths (adapted to also resolve arm64ec-win via _M_ARM64EC, since
  ARM64EC defines _WIN64/ARCH_64BIT)

Plugin-side changes needed for current iPlug2:

- Compile WDL/win32_utf8.c in the app/vst3/aax projects (IPlugPlatform.h
  now routes fopen/strftime etc. through WDL UTF-8 wrappers)
- common-win.props: REAPER SDK dependency dir renamed to REAPER_SDK

The VST3 SDK under iPlug2/Dependencies/IPlug must be re-downloaded via
download-vst3-sdk.sh; other SDK deps (RTAudio, RTMidi, REAPER_SDK,
CLAP, AAX stub) and the NanoVG-family IGraphics deps are now vendored
in the iPlug2 repo.

Verified: Release x64 and ARM64EC builds of APP and VST3 both link, and
the ARM64EC binaries are ARM64X hybrids.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The pinned commit lives on the nam-fixes branch of olilarkin/iPlug2
(official iPlug2 master + NAM fixes) until it is merged into
sdatkinson/iPlug2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Xcode no longer supports Build Carbon Resources phases. Move IPlugAU.r
to the AU target Copy Bundle Resources phase, matching the current
iPlug2 template project.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
xcpretty swallows the diagnostics in CI; grep the teed build-mac.log
for errors when xcodebuild fails.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… project

AudioDSPTools ships its own copy of WDL ptrlist.h/heapbuf.h for the
ResamplingContainer. With both copies as project members, the Xcode
headermap resolves #include ptrlist.h by basename and could pick the
vendored copy, whose InsertSorted comparator signature no longer
matches current iPlug2 WDL. AudioDSPTools includes its copy via a
relative path, so it does not need project membership.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The previous run passed while the ARM64EC msbuild pass actually failed:
makedist-win.bat ignored msbuild/makezip exit codes, so the job went
green with an artifact missing the ARM64EC binaries and pdbs.

- makedist-win.bat: abort on msbuild or makezip-win.py failure
- Workflows: pin the Windows job to windows-2022. windows-latest images
  now ship VS2026, which provides v143 x64 tools but not the v143
  ARM64EC toolset the projects target.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ries

The x86_64-win and arm64ec-win inner .vst3 files were added to the zip
under the same basename, so one overwrote the other on extraction. Zip
the whole NeuralAmpModeler.vst3 bundle with its folder structure
(pruning the stale x86-win folder and dev files) so users get a single
bundle that works on both x64 and ARM64 Windows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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