diff --git a/Jenkinsfile b/Jenkinsfile
index dbc15d6d3bb..949e72d21f7 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -51,6 +51,18 @@ spec:
/** Returns the download URL of the JDK against whoose C headers (in the 'include/' folder) and native libaries the SWT natives are compiled.*/
def getNativeJdkUrl(String os, String arch){ // To update the used JDK version update the URL template below
+ if('win32'.equals(os) && 'aarch64'.equals(arch)) {
+ // Temporary workaround until there are official Temurin GA releases for Windows on ARM that can be consumed through JustJ
+ dir("${WORKSPACE}/repackage-win32.aarch64-jdk") {
+ sh """
+ curl -L 'https://github.com/adoptium/temurin17-binaries/releases/download/jdk17u-2024-02-07-14-14-beta/OpenJDK17U-jdk_aarch64_windows_hotspot_2024-02-07-14-14.zip' > jdk.zip
+ unzip -q jdk.zip jdk-17.0.11+1/include/** jdk-17.0.11+1/lib/**
+ cd jdk-17.0.11+1
+ tar -czf ../jdk.tar.gz include/ lib/
+ """
+ }
+ return "file://${WORKSPACE}/repackage-win32.aarch64-jdk/jdk.tar.gz"
+ }
return "https://download.eclipse.org/justj/jres/17/downloads/20230428_1804/org.eclipse.justj.openjdk.hotspot.jre.minimal.stripped-17.0.7-${os}-${arch}.tar.gz"
}
@@ -177,7 +189,7 @@ pipeline {
axes {
axis {
name 'PLATFORM'
- values 'cocoa.macosx.aarch64' , 'cocoa.macosx.x86_64', 'gtk.linux.aarch64', 'gtk.linux.ppc64le', 'gtk.linux.x86_64', 'win32.win32.x86_64'
+ values 'cocoa.macosx.aarch64' , 'cocoa.macosx.x86_64', 'gtk.linux.aarch64', 'gtk.linux.ppc64le', 'gtk.linux.x86_64', 'win32.win32.aarch64', 'win32.win32.x86_64'
}
}
stages {
diff --git a/binaries/org.eclipse.swt.win32.win32.aarch64/.project b/binaries/org.eclipse.swt.win32.win32.aarch64/.project
new file mode 100644
index 00000000000..b90f3ddaf24
--- /dev/null
+++ b/binaries/org.eclipse.swt.win32.win32.aarch64/.project
@@ -0,0 +1,117 @@
+
+
+ org.eclipse.swt.win32.win32.aarch64
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ org.eclipse.pde.api.tools.apiAnalysisBuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.pde.PluginNature
+ org.eclipse.pde.api.tools.apiAnalysisNature
+
+
+
+ .classpath
+ 1
+ PARENT-1-PROJECT_LOC/.classpath_win32
+
+
+ .settings/.api_filters
+ 1
+ PROJECT_LOC/.settings/.api_filters
+
+
+ .settings
+ 2
+ PARENT-1-PROJECT_LOC/.settings
+
+
+ Eclipse SWT
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT
+
+
+ Eclipse SWT Accessibility
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20Accessibility
+
+
+ Eclipse SWT AWT
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20AWT
+
+
+ Eclipse SWT Browser
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20Browser
+
+
+ Eclipse SWT Custom Widgets
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20Custom%20Widgets
+
+
+ Eclipse SWT Drag and Drop
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20Drag%20and%20Drop
+
+
+ Eclipse SWT OLE Win32
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20OLE%20Win32
+
+
+ Eclipse SWT OpenGL
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20OpenGL
+
+
+ Eclipse SWT PI
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20PI
+
+
+ Eclipse SWT Printing
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20Printing
+
+
+ Eclipse SWT Program
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20Program
+
+
+ Eclipse SWT WebKit
+ 2
+ SWT_HOST_PLUGIN/Eclipse%20SWT%20WebKit
+
+
+
+
+ SWT_HOST_PLUGIN
+ $%7BPARENT-2-PROJECT_LOC%7D/bundles/org.eclipse.swt
+
+
+
diff --git a/binaries/org.eclipse.swt.win32.win32.aarch64/.settings/.api_filters b/binaries/org.eclipse.swt.win32.win32.aarch64/.settings/.api_filters
new file mode 100644
index 00000000000..a33ae19da25
--- /dev/null
+++ b/binaries/org.eclipse.swt.win32.win32.aarch64/.settings/.api_filters
@@ -0,0 +1,603 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/org.eclipse.swt.win32.win32.aarch64/META-INF/MANIFEST.MF b/binaries/org.eclipse.swt.win32.win32.aarch64/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..163eced13bb
--- /dev/null
+++ b/binaries/org.eclipse.swt.win32.win32.aarch64/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Fragment-Host: org.eclipse.swt;bundle-version="[3.125.100,4.0.0)"
+Bundle-Name: %fragmentName
+Bundle-Vendor: %providerName
+Bundle-SymbolicName: org.eclipse.swt.win32.win32.aarch64; singleton:=true
+Bundle-Version: 3.126.0.qualifier
+Bundle-ManifestVersion: 2
+Bundle-Localization: fragment
+Export-Package:
+ org.eclipse.swt,
+ org.eclipse.swt.accessibility,
+ org.eclipse.swt.awt,
+ org.eclipse.swt.browser,
+ org.eclipse.swt.custom,
+ org.eclipse.swt.dnd,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.opengl,
+ org.eclipse.swt.printing,
+ org.eclipse.swt.program,
+ org.eclipse.swt.widgets,
+ org.eclipse.swt.internal; x-friends:="org.eclipse.ui",
+ org.eclipse.swt.internal.image; x-internal:=true,
+ org.eclipse.swt.ole.win32,
+ org.eclipse.swt.internal.gdip; x-internal:=true,
+ org.eclipse.swt.internal.ole.win32; x-internal:=true,
+ org.eclipse.swt.internal.win32; x-internal:=true,
+ org.eclipse.swt.internal.opengl.win32; x-internal:=true
+Eclipse-PlatformFilter: (& (osgi.ws=win32) (osgi.os=win32) (osgi.arch=aarch64))
+SWT-WS: win32
+SWT-OS: win32
+SWT-Arch: aarch64
+Automatic-Module-Name: org.eclipse.swt.win32.win32.aarch64
diff --git a/binaries/org.eclipse.swt.win32.win32.aarch64/WebView2Loader.dll b/binaries/org.eclipse.swt.win32.win32.aarch64/WebView2Loader.dll
new file mode 100644
index 00000000000..e36ef5cec20
--- /dev/null
+++ b/binaries/org.eclipse.swt.win32.win32.aarch64/WebView2Loader.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dac2c67e5a21ba0a40a1a3ecdc9b7723708f10f5ecab26f2ddb729c2e27396ca
+size 127912
diff --git a/binaries/org.eclipse.swt.win32.win32.aarch64/build.properties b/binaries/org.eclipse.swt.win32.win32.aarch64/build.properties
new file mode 100644
index 00000000000..a229d438259
--- /dev/null
+++ b/binaries/org.eclipse.swt.win32.win32.aarch64/build.properties
@@ -0,0 +1,41 @@
+###############################################################################
+# Copyright (c) 2023, 2024 Tue Ton and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Tue Ton - initial API and implementation
+# Hannes Wellmann - Leverage Tycho pomless
+###############################################################################
+custom = true
+bin.includes = .,*.dll,fragment.properties
+bin.excludes = library/
+source.. = \
+ ../legal_files/win32.win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT PI/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT PI/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT OLE Win32/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Accessibility/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT AWT/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT AWT/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Printing/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Printing/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Program/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Program/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Browser/common,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT Browser/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT OpenGL/win32,\
+ ../../bundles/org.eclipse.swt/Eclipse SWT OpenGL/common
+output.. = bin/
+
+pom.model.property.os=win32
+pom.model.property.ws=win32
+pom.model.property.arch=aarch64
diff --git a/binaries/org.eclipse.swt.win32.win32.aarch64/fragment.properties b/binaries/org.eclipse.swt.win32.win32.aarch64/fragment.properties
new file mode 100644
index 00000000000..d4274553418
--- /dev/null
+++ b/binaries/org.eclipse.swt.win32.win32.aarch64/fragment.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2023, 2024 Tue Ton and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Tue Ton - initial API and implementation
+###############################################################################
+fragmentName = Standard Widget Toolkit for Windows on aarch64
+providerName = Eclipse.org
diff --git a/binaries/pom.xml b/binaries/pom.xml
index d85276be719..3c90d81a1ce 100644
--- a/binaries/pom.xml
+++ b/binaries/pom.xml
@@ -38,6 +38,7 @@
org.eclipse.swt.gtk.linux.aarch64
org.eclipse.swt.gtk.linux.ppc64le
org.eclipse.swt.gtk.linux.x86_64
+ org.eclipse.swt.win32.win32.aarch64
org.eclipse.swt.win32.win32.x86_64
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/build.bat b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/build.bat
index 0fb28068c28..a70696f1f31 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/build.bat
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/build.bat
@@ -13,7 +13,6 @@
@rem ***************************************************************************
@rem The original build.bat source is located in /org.eclipse.swt/Eclipse SWT PI/win32/library/build.bat. It is copied during various build(s).
-@rem Typically it's not ran directly, instead it is reached by build.xml's build_libraries target found in eclipse.platform.swt\bundles\org.eclipse.swt.win32.win32.x86*
@echo off
echo
@@ -51,15 +50,44 @@ IF NOT EXIST "%MSVC_HOME%" (
@rem Check for a usable JDK
IF "%SWT_JAVA_HOME%"=="" CALL :ECHO "'SWT_JAVA_HOME' was not provided"
IF NOT EXIST "%SWT_JAVA_HOME%" (
- CALL :ECHO "WARNING: x64 Java JDK not found. Please set SWT_JAVA_HOME to the JDK directory containing the intended JDK native headers."
+ CALL :ECHO "WARNING: 64-bit Java JDK not found. Please set SWT_JAVA_HOME to the JDK directory containing the intended JDK native headers."
)
-@rem -----------------------
-set PROCESSOR_ARCHITECTURE=AMD64
-IF "x.%OUTPUT_DIR%"=="x." set OUTPUT_DIR=..\..\..\org.eclipse.swt.win32.win32.x86_64
+@REM Compose host architecture string for MSVC
+IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
+ SET HOST_ARCH=x64
+) ELSE IF "%PROCESSOR_ARCHITECTURE%"=="ARM64" (
+ SET HOST_ARCH=arm64
+) ELSE (
+ CALL :ECHO "ERROR: Unknown host architecture: %PROCESSOR_ARCHITECTURE%."
+ EXIT /B 1
+)
+
+@REM %TARGET_ARCH% may be specified by the caller for cross-compiling.
+@REM If not, build for builder machine's architecture
+IF "%TARGET_ARCH%"=="" (
+ SET TARGET_ARCH=%HOST_ARCH%
+)
+
+@REM Compose build argument for MSVC
+IF "%TARGET_ARCH%"=="%HOST_ARCH%" (
+ SET BUILD_ARCH=%TARGET_ARCH%
+) ELSE (
+ SET BUILD_ARCH=%HOST_ARCH%_%TARGET_ARCH%
+)
+
+@REM Select build's output directory (if not specified) based on target arch
+IF "%TARGET_ARCH%"=="x64" (
+ IF "x.%OUTPUT_DIR%"=="x." SET OUTPUT_DIR=..\..\..\org.eclipse.swt.win32.win32.x86_64
+) ELSE IF "%TARGET_ARCH%"=="arm64" (
+ IF "x.%OUTPUT_DIR%"=="x." SET OUTPUT_DIR=..\..\..\org.eclipse.swt.win32.win32.aarch64
+) ELSE (
+ CALL :ECHO "ERROR: Unknown target architecture: %TARGET_ARCH%."
+ EXIT /B 1
+)
set CFLAGS=-DJNI64
-call "%MSVC_HOME%\VC\Auxiliary\Build\vcvarsall.bat" x64
+call "%MSVC_HOME%\VC\Auxiliary\Build\vcvarsall.bat" %BUILD_ARCH%
@rem if call to vcvarsall.bat (which sets up environment) silently fails, then provide advice to user.
WHERE cl
diff --git a/local-build/org.eclipse.swt.fragments.localbuild/META-INF/p2.inf b/local-build/org.eclipse.swt.fragments.localbuild/META-INF/p2.inf
index 078e5e94e51..60341a0650a 100644
--- a/local-build/org.eclipse.swt.fragments.localbuild/META-INF/p2.inf
+++ b/local-build/org.eclipse.swt.fragments.localbuild/META-INF/p2.inf
@@ -28,3 +28,8 @@ requires.6.namespace = org.eclipse.equinox.p2.iu
requires.6.name = org.eclipse.swt.cocoa.macosx.aarch64
requires.6.range = 0.0.0
requires.6.filter = (&(osgi.os=macosx)(osgi.ws=cocoa)(osgi.arch=aarch64))
+
+requires.7.namespace = org.eclipse.equinox.p2.iu
+requires.7.name = org.eclipse.swt.win32.win32.aarch64
+requires.7.range = 0.0.0
+requires.7.filter = (&(osgi.os=win32)(osgi.ws=win32)(osgi.arch=aarch64))
diff --git a/pom.xml b/pom.xml
index a8fd8340a1a..8e8d601ce56 100644
--- a/pom.xml
+++ b/pom.xml
@@ -172,6 +172,11 @@
win32
x86_64
+
+ win32
+ win32
+ aarch64
+