* feat: native Windows ARM64 build support Builds on the merged DEPS_ARCH=arm64 plumbing (#13424) by adding the dependency and source fixes needed for a green native ARM64 build on the windows-11-arm runner. Validated end-to-end on Snapdragon X Elite hardware (via a downstream fork using the same fixes); see OrcaSlicer/OrcaSlicer#8271 for the full writeup. Dependencies: - OpenEXR 2.5.5: ImfSimd.h hard-codes IMF_HAVE_SSE2 for any MSVC, pulling in <emmintrin.h> (x86-only) -> C1189. Patch the header to require an x86 target and force SSE cache vars off on ARM64. - Boost.Context: use the winfib implementation on ARM64 (Windows Fiber API) to avoid the armasm64 / CMake ASM_ARMASM linker-module bug, while keeping the Boost::context target Boost.Asio needs. - OpenCV: disable WITH_IPP on ARM64 (Intel IPP/IPP-ICV is x86/x64 only; otherwise ~200 unresolved ippicv* externals at link). - OpenSSL: use VC-WIN64-ARM on ARM64. - FindGLEW: add an ARM64 arch branch. Sources: - clipper Int128.hpp: _mul128 is an x64-only intrinsic guarded by _WIN64 (true on ARM64); guard on _M_X64 and use the portable path. - imgui imgui_widgets.cpp: fix va_start(vaList, &text) -> va_start(vaList, text) (the &-form compiled on x64 but is invalid on ARM64). - crash reporter: StackWalker.cpp gains an _M_ARM64 branch; BaseException.cpp uses Cpsr instead of the x86-only EFlags on ARM64. CI: - New build_windows_arm64.yml on windows-11-arm: pins CMake 3.31.x, stages ARM64 GMP/MPFR from MSYS2 clangarm64 (with llvm-dlltool import libs), caches deps with a fixed-depth hashFiles key, builds and uploads the binary. OCCT/STEP, SVG-to-3D and text emboss all build and work on ARM64 (no stubs needed). Full feature parity with x64. * fix(ci): use forward-slash DESTDIR to avoid CMake '\a' escape error deps configure failed at GMP/GMP.cmake: "Invalid character escape '\a'" because DESTDIR carried Windows backslashes (C:\a\...) and is re-parsed when re-set with the /usr/local suffix. Pass DESTDIR (and the slicer's DEPS prefix) with forward slashes via %CD:\=/%. * fix(ci): don't export DESTDIR env var (CMake staged-install doubles paths) Setting a DESTDIR *environment* variable made CMake treat it as the staged install prefix and prepend it to every dependency's install path, so e.g. FreeType installed to <DESTDIR>/a/.../OrcaSlicer_dep/usr/local and OCCT then couldn't find its headers. Compute the forward-slash path into a differently-named var (ORCA_DESTDIR) and pass it only via -DDESTDIR. * ci(windows-arm64): fold ARM64 build into the standard Windows matrix Replace the standalone build_windows_arm64.yml with a matrix entry on the existing build_windows job, so x64 and ARM64 share one reusable workflow chain (build_all -> build_check_cache -> build_deps -> build_orca), per review feedback on #14059. - build_all.yml: build_windows now matrices over {x64: windows-latest, arm64: windows-11-arm} and threads `arch` through. Self-hosted runner stays x64-only. - build_check_cache.yml: cache key and dep-prefix path are now architecture-specific on Windows (deps/build-arm64/OrcaSlicer_dep). - build_release_vs.bat: accept an `arm64` argument (mirrors build_release_vs2022.bat) -> uses `-A ARM64` and the build-arm64 tree. The top-level CMake auto-derives CMAKE_PREFIX_PATH from the build dir, so no explicit prefix is needed. - build_deps.yml / build_orca.yml: gate the ARM64-only prep behind `inputs.arch == 'arm64'` -- pin CMake 3.31.x, and stage MSYS2 clangarm64 GMP/MPFR import libs. NSIS installer/PDB/profile_validator remain x64-only; ARM64 ships the portable zip. Artifact names get an arch suffix to avoid collisions between the two Windows jobs. https://claude.ai/code/session_0164c7ZhCLsYBmCiVN9pWDjK * ci(temp): generate GMP/MPFR win-arm64 blobs to commit to repo * feat(deps): add prebuilt GMP/MPFR win-arm64 blobs The repo ships prebuilt GMP/MPFR import libs + DLLs for win-x64 and win-x86; the Windows ARM64 build path copies from win-${DEPS_ARCH} (CMakeLists.txt) but the win-arm64 blobs were missing, so the slicer configure failed at "file COPY cannot find .../win-arm64/libgmp-10.dll". Add win-arm64 libgmp-10.{dll,lib} and libmpfr-4.{dll,lib}, generated from the MSYS2 clangarm64 gmp/mpfr packages with MSVC-compatible import libs via llvm-dlltool. Headers are shared across arches and unchanged. * simplify OpenEXR.cmake * set default arch * support msix * ship installer * try to fix webview2runtime issue --------- Co-authored-by: Adam Behrman <adam.behrman@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Adam Behrman <abehrman@users.noreply.github.com>
172 lines
5.1 KiB
Batchfile
172 lines
5.1 KiB
Batchfile
@REM OrcaSlicer build script for Windows with VS auto-detect
|
|
@echo off
|
|
set WP=%CD%
|
|
set _START_TIME=%TIME%
|
|
|
|
@REM Default target architecture to the host CPU arch; override by passing
|
|
@REM "x64" or "arm64" as an argument. PROCESSOR_ARCHITEW6432 covers a 32-bit
|
|
@REM shell running on a 64-bit OS, where PROCESSOR_ARCHITECTURE reads "x86".
|
|
set arch=x64
|
|
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set arch=ARM64
|
|
if /I "%PROCESSOR_ARCHITEW6432%"=="ARM64" set arch=ARM64
|
|
if /I "%1"=="arm64" set arch=ARM64
|
|
if /I "%2"=="arm64" set arch=ARM64
|
|
if /I "%1"=="x64" set arch=x64
|
|
if /I "%2"=="x64" set arch=x64
|
|
|
|
@REM Check for Ninja Multi-Config option (-x)
|
|
set USE_NINJA=0
|
|
for %%a in (%*) do (
|
|
if "%%a"=="-x" set USE_NINJA=1
|
|
)
|
|
|
|
if "%USE_NINJA%"=="1" (
|
|
echo Using Ninja Multi-Config generator
|
|
set CMAKE_GENERATOR="Ninja Multi-Config"
|
|
set VS_VERSION=Ninja
|
|
goto :generator_ready
|
|
)
|
|
|
|
@REM Detect Visual Studio version using msbuild
|
|
echo Detecting Visual Studio version using msbuild...
|
|
|
|
@REM Try to get MSBuild version - the output format varies by VS version
|
|
set VS_MAJOR=
|
|
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
|
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
|
set MSBUILD_OUTPUT=%%i
|
|
goto :version_found
|
|
)
|
|
|
|
@REM Alternative method for newer MSBuild versions
|
|
if "%VS_MAJOR%"=="" (
|
|
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
|
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
|
set MSBUILD_OUTPUT=%%i
|
|
goto :version_found
|
|
)
|
|
)
|
|
|
|
:version_found
|
|
echo MSBuild version detected: %MSBUILD_OUTPUT%
|
|
echo Major version: %VS_MAJOR%
|
|
|
|
if "%VS_MAJOR%"=="" (
|
|
echo Error: Could not determine Visual Studio version from msbuild
|
|
echo Please ensure Visual Studio and MSBuild are properly installed
|
|
exit /b 1
|
|
)
|
|
|
|
if "%VS_MAJOR%"=="16" (
|
|
set VS_VERSION=2019
|
|
set CMAKE_GENERATOR="Visual Studio 16 2019"
|
|
) else if "%VS_MAJOR%"=="17" (
|
|
set VS_VERSION=2022
|
|
set CMAKE_GENERATOR="Visual Studio 17 2022"
|
|
) else if "%VS_MAJOR%"=="18" (
|
|
set VS_VERSION=2026
|
|
set CMAKE_GENERATOR="Visual Studio 18 2026"
|
|
) else (
|
|
echo Error: Unsupported Visual Studio version: %VS_MAJOR%
|
|
echo Supported versions: VS2019 (16.x^), VS2022 (17.x^), VS2026 (18.x^)
|
|
exit /b 1
|
|
)
|
|
|
|
echo Detected Visual Studio %VS_VERSION% (version %VS_MAJOR%)
|
|
echo Using CMake generator: %CMAKE_GENERATOR%
|
|
|
|
:generator_ready
|
|
|
|
@REM Pack deps
|
|
if "%1"=="pack" (
|
|
setlocal ENABLEDELAYEDEXPANSION
|
|
cd %WP%/deps/build
|
|
if "%arch%"=="ARM64" cd %WP%/deps/build-arm64
|
|
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
|
|
echo packing deps: OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip
|
|
|
|
%WP%/tools/7z.exe a OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip OrcaSlicer_dep
|
|
goto :done
|
|
)
|
|
|
|
set debug=OFF
|
|
set debuginfo=OFF
|
|
if "%1"=="debug" set debug=ON
|
|
if "%2"=="debug" set debug=ON
|
|
if "%1"=="debuginfo" set debuginfo=ON
|
|
if "%2"=="debuginfo" set debuginfo=ON
|
|
if "%debug%"=="ON" (
|
|
set build_type=Debug
|
|
set build_dir=build-dbg
|
|
) else (
|
|
if "%debuginfo%"=="ON" (
|
|
set build_type=RelWithDebInfo
|
|
set build_dir=build-dbginfo
|
|
) else (
|
|
set build_type=Release
|
|
set build_dir=build
|
|
)
|
|
)
|
|
if "%arch%"=="ARM64" set build_dir=%build_dir%-arm64
|
|
echo build type set to %build_type%, arch=%arch%
|
|
|
|
setlocal DISABLEDELAYEDEXPANSION
|
|
cd deps
|
|
mkdir %build_dir%
|
|
cd %build_dir%
|
|
set "SIG_FLAG="
|
|
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
|
|
|
if "%1"=="slicer" (
|
|
GOTO :slicer
|
|
)
|
|
echo "building deps.."
|
|
|
|
echo on
|
|
REM Set minimum CMake policy to avoid <3.5 errors
|
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
if "%USE_NINJA%"=="1" (
|
|
cmake ../ -G %CMAKE_GENERATOR% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target deps
|
|
) else (
|
|
cmake ../ -G %CMAKE_GENERATOR% -A %arch% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target deps -- -m
|
|
)
|
|
@echo off
|
|
|
|
if "%1"=="deps" goto :done
|
|
|
|
:slicer
|
|
echo "building Orca Slicer..."
|
|
cd %WP%
|
|
mkdir %build_dir%
|
|
cd %build_dir%
|
|
|
|
echo on
|
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
if "%USE_NINJA%"=="1" (
|
|
cmake .. -G %CMAKE_GENERATOR% -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target ALL_BUILD
|
|
) else (
|
|
cmake .. -G %CMAKE_GENERATOR% -A %arch% -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
|
)
|
|
@echo off
|
|
cd ..
|
|
call scripts/run_gettext.bat
|
|
cd %build_dir%
|
|
cmake --build . --target install --config %build_type%
|
|
|
|
:done
|
|
@echo off
|
|
for /f "tokens=1-3 delims=:.," %%a in ("%_START_TIME: =0%") do set /a "_start_s=%%a*3600+%%b*60+%%c"
|
|
for /f "tokens=1-3 delims=:.," %%a in ("%TIME: =0%") do set /a "_end_s=%%a*3600+%%b*60+%%c"
|
|
set /a "_elapsed=_end_s - _start_s"
|
|
if %_elapsed% lss 0 set /a "_elapsed+=86400"
|
|
set /a "_hours=_elapsed / 3600"
|
|
set /a "_remainder=_elapsed - _hours * 3600"
|
|
set /a "_mins=_remainder / 60"
|
|
set /a "_secs=_remainder - _mins * 60"
|
|
echo.
|
|
echo Build completed in %_hours%h %_mins%m %_secs%s
|