Repository: cryptomator/integrations-win
Pull request #106: Make library compatible to Windows ARM64 as well
Author: login: purejava
Created: 2025-04-21T11:34:37Z | Merged: 2025-05-30T08:46:40Z

This requires the component "MSVC v143 VS 2022 C++ ARM64/ARM64EC-Buildtools" for compiling. These [are included](https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md#workloads-components-and-extensions) in the GitHub windows runner-image, so no adjustment is needed for the GitHub workflow of this lib.


Diff:
diff --git a/Makefile b/Makefile
index 3002902e..5db947a3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,5 @@
 # Note: make apparently thinks, that options specified with "/" are absolute paths and resolves them. see also https://stackoverflow.com/questions/17012419/d9024-make-unrecognized-source-file-type
+ARCH ?= x64
 WIN_SDK_VERSION ?= 10.0.22621.0
 MSVC_VERSION ?= 14.41.34120
 HEADERS := -I"src\main\headers" \
@@ -6,16 +7,22 @@ HEADERS := -I"src\main\headers" \
 	-I"${JAVA_HOME}\include\win32" \
 	-I"C:\Program Files (x86)\Windows Kits\10\Include\$(WIN_SDK_VERSION)\cppwinrt"
 SOURCES := $(wildcard src/main/native/*.cpp)
+OUT_DIR := target/$(ARCH)
+OUT_DLL := src/main/resources/integrations-$(ARCH).dll
+OUT_LIB := $(OUT_DIR)/integrations.lib
 
 ########
 
 all: install
 
 install:
+ifeq "$(wildcard $(OUT_DIR))" ""
+	mkdir "$(OUT_DIR)"
+endif
 	cl -EHsc -std:c++17 -LD -W4 -guard:cf \
-		-Fe"src/main/resources/integrations.dll" \
-		-Fo"target/" \
+		-Fe"$(OUT_DLL)" \
+		-Fo"$(OUT_DIR)/" \
 		$(HEADERS) $(SOURCES) \
 		-link -NXCOMPAT -DYNAMICBASE \
-		-implib:target/integrations.lib \
+		-implib:$(OUT_LIB) \
 		crypt32.lib shell32.lib ole32.lib uuid.lib user32.lib Advapi32.lib windowsapp.lib
diff --git a/README.md b/README.md
index 2f8217aa..de7ccaeb 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ This project uses the following JVM properties:
 
 * JDK 22
 * Maven
-* MSVC 2022 toolset (e.g. by installing Visual Studio 2022, Workset "Desktop development with C++")
+* MSVC 2022 toolset (e.g. by installing Visual Studio 2022, Workset "Desktop development with C++" and component "MSVC v143 VS 2022 C++ ARM64/ARM64EC-Buildtools")
 * Make (`choco install make`)
 
 ### Build
diff --git a/pom.xml b/pom.xml
index a943c02d..12203c67 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,6 +121,13 @@
 								<include>*.h</include>
 							</includes>
 						</fileset>
+						<fileset>
+							<directory>${project.basedir}/src/main/resources</directory>
+							<followSymlinks>false</followSymlinks>
+							<includes>
+								<include>*.dll</include>
+							</includes>
+						</fileset>
 					</filesets>
 				</configuration>
 			</plugin>
@@ -336,24 +343,40 @@
 						<groupId>org.codehaus.mojo</groupId>
 						<artifactId>exec-maven-plugin</artifactId>
 						<version>3.5.0</version>
+						<configuration>
+							<executable>cmd</executable>
+							<workingDirectory>${project.basedir}</workingDirectory>
+							<environmentVariables>
+								<JAVA_HOME>${java.home}</JAVA_HOME>
+							</environmentVariables>
+						</configuration>
 						<executions>
 							<execution>
+								<id>compile-x64</id>
 								<goals>
 									<goal>exec</goal>
 								</goals>
 								<phase>compile</phase>
 								<configuration>
-									<executable>cmd</executable>
-									<workingDirectory>${project.basedir}</workingDirectory>
-									<environmentVariables>
-										<JAVA_HOME>${java.home}</JAVA_HOME>
-									</environmentVariables>
 									<arguments>
 										<argument>/c</argument>
 										<argument>"${devCommandFileDir}\vcvars64.bat" &amp;&amp; make install</argument>
 									</arguments>
 								</configuration>
 							</execution>
+							<execution>
+								<id>compile-arm64</id>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+								<phase>compile</phase>
+								<configuration>
+									<arguments>
+										<argument>/c</argument>
+										<argument>"${devCommandFileDir}\vcvarsamd64_arm64.bat" &amp;&amp; make install ARCH=arm64</argument>
+									</arguments>
+								</configuration>
+							</execution>
 						</executions>
 					</plugin>
 				</plugins>
diff --git a/src/main/java/org/cryptomator/windows/common/NativeLibLoader.java b/src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
index 9031c5ca..c5aa572d 100644
--- a/src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
+++ b/src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
@@ -12,27 +12,42 @@
 public class NativeLibLoader {
 
 	private static final Logger LOG = LoggerFactory.getLogger(NativeLibLoader.class);
-	private static final String LIB = "/integrations.dll";
+	private static final String X64_LIB = "/integrations-x64.dll";
+	private static final String ARM64_LIB = "/integrations-arm64.dll";
 	private static volatile boolean loaded = false;
 
 	/**
 	 * Attempts to load the .dll file required for native calls.
+	 *
 	 * @throws UnsatisfiedLinkError If loading the library failed.
 	 */
 	public static synchronized void loadLib() {
 		if (!loaded) {
-			try (var dll = NativeLibLoader.class.getResourceAsStream(LIB)) {
+			var arch = System.getProperty("os.arch");
+			final String LIBNAME;
+			if (arch.contains("amd64")) {
+				LOG.debug("Loading library for x86_64 architecture");
+				LIBNAME = X64_LIB;
+			} else if (arch.contains("aarch64")) {
+				LOG.debug("Loading library for aarch64 architecture");
+				LIBNAME = ARM64_LIB;
+			} else {
+				LOG.warn("Unrecognized architecture: {}. Defaulting to x86_64 architecture", arch);
+				LIBNAME = X64_LIB;
+			}
+
+			try (var dll = NativeLibLoader.class.getResourceAsStream(LIBNAME)) {
 				Objects.requireNonNull(dll);
 				Path tmpPath = Files.createTempFile("lib", ".dll");
 				Files.copy(dll, tmpPath, StandardCopyOption.REPLACE_EXISTING);
 				System.load(tmpPath.toString());
 				loaded = true;
 			} catch (NullPointerException e) {
-				LOG.error("Did not find resource " + LIB, e);
+				LOG.error("Did not find resource " + LIBNAME, e);
 			} catch (IOException e) {
-				LOG.error("Failed to copy " + LIB + " to temp dir.", e);
+				LOG.error("Failed to copy " + LIBNAME + " to temp dir.", e);
 			} catch (UnsatisfiedLinkError e) {
-				LOG.error("Failed to load lib from " + LIB, e);
+				LOG.error("Failed to load lib from " + LIBNAME, e);
 			}
 		}
 	}


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between cc6ac29176befaa4549f68d1c9561b6260a62f37 and 41a68e3ff8e300920ab31fd99be57f23bbd40234.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `Makefile` (1 hunks)
* `README.md` (1 hunks)
* `pom.xml` (1 hunks)
* `src/main/java/org/cryptomator/windows/common/NativeLibLoader.java` (2 hunks)

</details>

<details>
<summary>🔇 Additional comments (10)</summary><blockquote>

<details>
<summary>src/main/java/org/cryptomator/windows/common/NativeLibLoader.java (3)</summary>

`15-17`: **Good addition of architecture-specific constants.**

The constants for x64 and ARM64 libraries are well-defined, allowing for architecture-specific loading.

---

`34-34`: **LGTM! Resource loading with dynamic library path.**

The code correctly uses the dynamically determined library path.

---

`41-46`: **LGTM! Updated error logging.**

Error logging now includes the dynamically selected library path.

</details>
<details>
<summary>README.md (1)</summary>

`19-19`: **Clear documentation of ARM64 build requirements.**

The updated README clearly specifies that the MSVC v143 VS 2022 C++ ARM64/ARM64EC-Buildtools component is required for ARM64 support.

</details>
<details>
<summary>pom.xml (1)</summary>

`353-353`: **Efficient dual-architecture build implementation.**

The command efficiently builds for both x64 and ARM64 architectures in a single execution. The approach of initializing the appropriate environment for each architecture before building is correct.


Note: If the x64 build fails, the ARM64 build won't execute since they're chained with `&&`. This might be intentional as a fail-fast approach, but you may want to consider separating these into two separate executions if independent builds are desired.

</details>
<details>
<summary>Makefile (5)</summary>

`2-2`: **Good parameterization with default architecture.**

Adding the `ARCH` variable with a default value of `x64` is a clean approach for enabling multi-architecture builds.

---

`10-12`: **Well-structured architecture-specific output paths.**

The output directory and filenames now incorporate the architecture parameter, allowing for clean separation of build artifacts.

---

`19-19`: **Directory creation using parameterized path.**

The updated directory creation command correctly uses the architecture-specific output directory.

---

`21-23`: **Architecture-specific DLL and object file output paths.**

The compiler output paths correctly use the architecture parameter, ensuring that build artifacts for different architectures don't conflict.

---

`25-25`: **Architecture-specific import library path.**

The import library path is correctly parameterized with the architecture.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-21T11:36:17Z
user: login: infeo
body: I adjusted the pom to contain two executions.

When I inspect the generated jar, there are 3 dll files:
* integrations-x64.dll
* integrations-arm64.dll
* integrations.dll

Where is the third one coming from?
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-05-21T15:05:21Z
user: login: overheadhunter
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-05-21T20:00:46Z
user: login: infeo
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-22T08:23:57Z
user: login: infeo
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-22T08:24:38Z
user: login: overheadhunter
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-22T20:14:24Z
user: login: infeo
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-26T08:49:59Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>Makefile (1)</summary><blockquote>

`19-21`: **Ensure output directory exists before compilation**  
Using Make's `ifeq` with `wildcard` to check and create `$(OUT_DIR)` is correct. Just confirm that the `mkdir` line is indented with a **tab** (required by Make) and not spaces to avoid execution errors.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 9ea53f6c5564e56aa4fc4450e96da0a9103acd58 and d4669a4e605a381807d767aa820a66ebec5b5d26.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `Makefile` (1 hunks)
* `pom.xml` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (4)</summary><blockquote>

<details>
<summary>Makefile (2)</summary>

`2-2`: **Parameterize build outputs for multiple architectures**  
The new `ARCH` variable and related `OUT_DIR`, `OUT_DLL`, and `OUT_LIB` definitions effectively allow targeting different architectures without duplicating targets. The default of `x64` is sensible, and overriding via `make ARCH=arm64` aligns with common patterns. 


Also applies to: 10-12

---

`23-24`: **Emit artifacts to the correct architecture-specific paths**  
The updated `-Fe`, `-Fo`, and `-implib` flags direct the DLL and import library into the new `$(OUT_DLL)` and `$(OUT_LIB)` locations. This aligns perfectly with the parameterized outputs. 


Also applies to: 27-27

</details>
<details>
<summary>pom.xml (2)</summary>

`339-345`: **Centralize `exec-maven-plugin` environment configuration**  
Adding a plugin-level `<configuration>` with `cmd` as the executable, the project root as `workingDirectory`, and propagating `JAVA_HOME` is a clean way to avoid duplication across executions. This will apply consistently to all `<execution>` blocks below.

---

`348-348`: **Use clear execution IDs for architecture targets**  
Naming the executions `compile-x64` and `compile-arm64` makes the build steps explicit and easy to track in the Maven logs.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-26T08:53:04Z
user: login: overheadhunter
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-26T09:26:17Z
user: login: infeo
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-29T20:25:54Z
user: login: purejava
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-30T06:11:42Z
user: login: infeo
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-30T08:15:25Z
user: login: coderabbitai[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-30T08:15:54Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>pom.xml (1)</summary><blockquote>

`367-379`: **Add ARM64 compilation execution**  
The new `compile-arm64` execution mirrors the x64 flow using `vcvarsamd64_arm64.bat` and `make install ARCH=arm64`, enabling seamless cross‐compilation on the GitHub runner.  
  
You may optionally simplify maintenance by switching to `vcvarsall.bat amd64_arm64` instead of the dedicated script, e.g.:  
```xml
<argument>/c</argument>
<argument>"%VSINSTALLDIR%VC\Auxiliary\Build\vcvarsall.bat" amd64_arm64 && make install ARCH=arm64</argument>
```  
This approach reduces the number of hard-coded batch filenames and leverages the generic `vcvarsall.bat` with explicit architecture arguments.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between d776bcb38a9fa48304c7554284bcc32db6e4696b and a93444605e4c81dabefa5d472a6d92807312cf54.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `pom.xml` (2 hunks)
* `src/main/java/org/cryptomator/windows/common/NativeLibLoader.java` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* src/main/java/org/cryptomator/windows/common/NativeLibLoader.java

</details>

<details>
<summary>🔇 Additional comments (2)</summary><blockquote>

<details>
<summary>pom.xml (2)</summary>

`124-130`: **Include DLLs in clean phase**  
Adding a `<fileset>` to remove `.dll` resources during `maven clean` ensures no stale native artifacts linger between builds. This aligns with the new ARM64 outputs and avoids accidentally bundling outdated binaries.

---

`346-352`: **Centralize Exec Plugin configuration**  
Moving `executable`, `workingDirectory`, and `environmentVariables` to the plugin level DRYs up the executions and guarantees consistency across architectures. Confirm that `${java.home}` correctly points to your JDK rather than just the JRE (if native tools need a full JDK).

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-30T08:28:38Z

Review comments:
diff_hunk: @@ -21,18 +23,26 @@ public class NativeLibLoader {
 	 */
 	public static synchronized void loadLib() {
 		if (!loaded) {
-			try (var dll = NativeLibLoader.class.getResourceAsStream(LIB)) {
+			var arch = System.getProperty("os.arch");
+			if (arch.contains("amd64")) {
+				LOG.debug("Loading library for x86_64 architecture");
+				LIBNAME = X64_LIB;
+			} else if (arch.contains("aarch64")) {
+				LOG.debug("Loading library for aarch64 architecture");
+				LIBNAME = ARM64_LIB;
+			}
path: src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Add a fallback for unrecognized architectures.**

The current implementation only handles "amd64" and "aarch64" architectures but doesn't provide a fallback for unrecognized architectures. This could lead to a `NullPointerException` when using `LIBNAME` on line 34.


```diff
 var arch = System.getProperty("os.arch");
 if (arch.contains("amd64")) {
 	LOG.debug("Loading library for x86_64 architecture");
 	LIBNAME = X64_LIB;
 } else if (arch.contains("aarch64")) {
 	LOG.debug("Loading library for aarch64 architecture");
 	LIBNAME = ARM64_LIB;
+} else {
+	LOG.warn("Unrecognized architecture: {}. Defaulting to x86_64 architecture", arch);
+	LIBNAME = X64_LIB;
 }
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
			var arch = System.getProperty("os.arch");
			if (arch.contains("amd64")) {
				LOG.debug("Loading library for x86_64 architecture");
				LIBNAME = X64_LIB;
			} else if (arch.contains("aarch64")) {
				LOG.debug("Loading library for aarch64 architecture");
				LIBNAME = ARM64_LIB;
			} else {
				LOG.warn("Unrecognized architecture: {}. Defaulting to x86_64 architecture", arch);
				LIBNAME = X64_LIB;
			}
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commits e8a7737 to a934446
created_at: 2025-04-21T11:36:16Z
author_association: NONE
diff_hunk: @@ -12,7 +12,9 @@
 public class NativeLibLoader {
 
 	private static final Logger LOG = LoggerFactory.getLogger(NativeLibLoader.class);
-	private static final String LIB = "/integrations.dll";
+	private static final String X64_LIB = "/integrations-x64.dll";
+	private static final String ARM64_LIB = "/integrations-arm64.dll";
+	private static String LIBNAME;
path: src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
user: login: infeo
body: LIBNAME variable is only used inside the only static method. `loadLib()`. And the result is not reused. Hence, removed it from the class and onyl define inside the method.
created_at: 2025-05-21T15:04:29Z
author_association: MEMBER
diff_hunk: @@ -4,9 +4,6 @@ on:
   pull_request_target:
     types: [labeled]
 
-defaults:
-  run:
-    shell: bash
path: .github/workflows/build.yml
user: login: overheadhunter
body: If you remove this, I believe you need to specify the shell explicitly on each command that uses bash syntax, as Windows runners default to pwsh otherwise.
created_at: 2025-05-21T19:56:57Z
author_association: MEMBER
diff_hunk: @@ -338,23 +338,39 @@
 						<version>3.5.0</version>
 						<executions>
 							<execution>
+								<id>compile-x64</id>
 								<goals>
 									<goal>exec</goal>
 								</goals>
 								<phase>compile</phase>
 								<configuration>
-									<executable>cmd</executable>
-									<workingDirectory>${project.basedir}</workingDirectory>
-									<environmentVariables>
-										<JAVA_HOME>${java.home}</JAVA_HOME>
-									</environmentVariables>
 									<arguments>
 										<argument>/c</argument>
 										<argument>"${devCommandFileDir}\vcvars64.bat" &amp;&amp; make install</argument>
 									</arguments>
 								</configuration>
 							</execution>
+							<execution>
+								<id>compile-arm64</id>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+								<phase>compile</phase>
+								<configuration>
+									<arguments>
+										<argument>/c</argument>
+										<argument>"${devCommandFileDir}\vcvarsamd64_arm64.bat" &amp;&amp; make install ARCH=arm64</argument>
+									</arguments>
+								</configuration>
+							</execution>
 						</executions>
+						<configuration>
+							<executable>cmd</executable>
+							<workingDirectory>${project.basedir}</workingDirectory>
+							<environmentVariables>
+								<JAVA_HOME>${java.home}</JAVA_HOME>
+							</environmentVariables>
+						</configuration>
path: pom.xml
user: login: overheadhunter
body: Usually we have the general config before the execution-specific.
created_at: 2025-05-21T19:59:19Z
author_association: MEMBER
diff_hunk: @@ -4,9 +4,6 @@ on:
   pull_request_target:
     types: [labeled]
 
-defaults:
-  run:
-    shell: bash
path: .github/workflows/build.yml
user: login: infeo
body: Oh, you are right with `pwsh` (instead of cmd as written in the commit). Nonetheless, it does not matter the workflow runs without errors. We use bash syntax in only one step and there the shell is explicitly set.
created_at: 2025-05-22T08:23:57Z
author_association: MEMBER
diff_hunk: @@ -338,23 +338,39 @@
 						<version>3.5.0</version>
 						<executions>
 							<execution>
+								<id>compile-x64</id>
 								<goals>
 									<goal>exec</goal>
 								</goals>
 								<phase>compile</phase>
 								<configuration>
-									<executable>cmd</executable>
-									<workingDirectory>${project.basedir}</workingDirectory>
-									<environmentVariables>
-										<JAVA_HOME>${java.home}</JAVA_HOME>
-									</environmentVariables>
 									<arguments>
 										<argument>/c</argument>
 										<argument>"${devCommandFileDir}\vcvars64.bat" &amp;&amp; make install</argument>
 									</arguments>
 								</configuration>
 							</execution>
+							<execution>
+								<id>compile-arm64</id>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+								<phase>compile</phase>
+								<configuration>
+									<arguments>
+										<argument>/c</argument>
+										<argument>"${devCommandFileDir}\vcvarsamd64_arm64.bat" &amp;&amp; make install ARCH=arm64</argument>
+									</arguments>
+								</configuration>
+							</execution>
 						</executions>
+						<configuration>
+							<executable>cmd</executable>
+							<workingDirectory>${project.basedir}</workingDirectory>
+							<environmentVariables>
+								<JAVA_HOME>${java.home}</JAVA_HOME>
+							</environmentVariables>
+						</configuration>
path: pom.xml
user: login: infeo
body: Done in https://github.com/cryptomator/integrations-win/pull/106/commits/9ea53f6c5564e56aa4fc4450e96da0a9103acd58
created_at: 2025-05-22T08:24:38Z
author_association: MEMBER
diff_hunk: @@ -4,9 +4,6 @@ on:
   pull_request_target:
     types: [labeled]
 
-defaults:
-  run:
-    shell: bash
path: .github/workflows/build.yml
user: login: overheadhunter
body: `mvn` uses bash syntax, therefore I'd prefer to run it inside bash. I know it accidentally works, but the syntax suggests one could use bash-style variables and features when in reality it is pwsh. Avoid developer confusion. 
created_at: 2025-05-22T20:14:24Z
author_association: MEMBER
diff_hunk: @@ -4,9 +4,6 @@ on:
   pull_request_target:
     types: [labeled]
 
-defaults:
-  run:
-    shell: bash
path: .github/workflows/build.yml
user: login: infeo
body: I reverted it.
created_at: 2025-05-26T08:49:58Z
author_association: MEMBER
diff_hunk: @@ -336,24 +336,40 @@
 						<groupId>org.codehaus.mojo</groupId>
 						<artifactId>exec-maven-plugin</artifactId>
 						<version>3.5.0</version>
+						<configuration>
+							<executable>cmd</executable>
+							<workingDirectory>${project.basedir}</workingDirectory>
+							<environmentVariables>
+								<JAVA_HOME>${java.home}</JAVA_HOME>
+							</environmentVariables>
+						</configuration>
 						<executions>
 							<execution>
+								<id>compile-x64</id>
 								<goals>
 									<goal>exec</goal>
 								</goals>
 								<phase>compile</phase>
 								<configuration>
-									<executable>cmd</executable>
-									<workingDirectory>${project.basedir}</workingDirectory>
-									<environmentVariables>
-										<JAVA_HOME>${java.home}</JAVA_HOME>
-									</environmentVariables>
 									<arguments>
 										<argument>/c</argument>
 										<argument>"${devCommandFileDir}\vcvars64.bat" &amp;&amp; make install</argument>
 									</arguments>
 								</configuration>
 							</execution>
+							<execution>
+								<id>compile-arm64</id>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+								<phase>compile</phase>
+								<configuration>
+									<arguments>
+										<argument>/c</argument>
+										<argument>"${devCommandFileDir}\vcvarsamd64_arm64.bat" &amp;&amp; make install ARCH=arm64</argument>
+									</arguments>
+								</configuration>
+							</execution>
path: pom.xml
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Critical: Fix path quoting and edition-specific toolset path**  
The `<argument>` strings wrap the call to `vcvars*.bat` in quotes, but since `${devCommandFileDir}` ends with a backslash (e.g. `...\Build\`), it will escape the closing quote and break the command. Moreover, the hardcoded path points to the **Community** edition, whereas GitHub's Windows runner ships Visual Studio **Enterprise** by default.  
- Remove the trailing slash from `devCommandFileDir` or escape it properly.  
- Consider parameterizing the edition (`Community` vs. `Enterprise`) or using the generic `vcvarsall.bat amd64` / `vcvarsall.bat arm64` invocation found at:  
  ```xml
  <argument>/c</argument>
  <argument>\"%VSINSTALLDIR%VC/Auxiliary/Build/vcvarsall.bat amd64\" && make install</argument>
  ```  
Would you like assistance refactoring this to use `vcvarsall.bat` with arch arguments or to automatically detect `VSINSTALLDIR`?

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In pom.xml around lines 360 to 372, the argument string for executing the batch
file improperly quotes the path, which causes issues if `${devCommandFileDir}`
ends with a backslash, and it hardcodes the Visual Studio edition path. Remove
the trailing backslash from `${devCommandFileDir}` or escape it properly, and
consider switching to a more robust approach by using
`%VSINSTALLDIR%VC/Auxiliary/Build/vcvarsall.bat` with the appropriate
architecture argument to ensure compatibility across different Visual Studio
editions. This will make the command more reliable and adaptable.
```

</details>

<!-- This is an auto-generated reply by CodeRabbit -->
created_at: 2025-05-26T08:53:01Z
author_association: NONE
diff_hunk: @@ -12,7 +12,9 @@
 public class NativeLibLoader {
 
 	private static final Logger LOG = LoggerFactory.getLogger(NativeLibLoader.class);
-	private static final String LIB = "/integrations.dll";
+	private static final String X64_LIB = "/integrations-x64.dll";
+	private static final String ARM64_LIB = "/integrations-arm64.dll";
+	private static String LIBNAME;
path: src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
user: login: infeo
body: @purejava reminder
created_at: 2025-05-29T20:25:54Z
author_association: MEMBER
diff_hunk: @@ -12,7 +12,9 @@
 public class NativeLibLoader {
 
 	private static final Logger LOG = LoggerFactory.getLogger(NativeLibLoader.class);
-	private static final String LIB = "/integrations.dll";
+	private static final String X64_LIB = "/integrations-x64.dll";
+	private static final String ARM64_LIB = "/integrations-arm64.dll";
+	private static String LIBNAME;
path: src/main/java/org/cryptomator/windows/common/NativeLibLoader.java
user: login: purejava
body: @infeo Done with d776bcb38a9fa48304c7554284bcc32db6e4696b.
created_at: 2025-05-30T06:11:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -336,24 +336,40 @@
 						<groupId>org.codehaus.mojo</groupId>
 						<artifactId>exec-maven-plugin</artifactId>
 						<version>3.5.0</version>
+						<configuration>
+							<executable>cmd</executable>
+							<workingDirectory>${project.basedir}</workingDirectory>
+							<environmentVariables>
+								<JAVA_HOME>${java.home}</JAVA_HOME>
+							</environmentVariables>
+						</configuration>
 						<executions>
 							<execution>
+								<id>compile-x64</id>
 								<goals>
 									<goal>exec</goal>
 								</goals>
 								<phase>compile</phase>
 								<configuration>
-									<executable>cmd</executable>
-									<workingDirectory>${project.basedir}</workingDirectory>
-									<environmentVariables>
-										<JAVA_HOME>${java.home}</JAVA_HOME>
-									</environmentVariables>
 									<arguments>
 										<argument>/c</argument>
 										<argument>"${devCommandFileDir}\vcvars64.bat" &amp;&amp; make install</argument>
 									</arguments>
 								</configuration>
 							</execution>
+							<execution>
+								<id>compile-arm64</id>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+								<phase>compile</phase>
+								<configuration>
+									<arguments>
+										<argument>/c</argument>
+										<argument>"${devCommandFileDir}\vcvarsamd64_arm64.bat" &amp;&amp; make install ARCH=arm64</argument>
+									</arguments>
+								</configuration>
+							</execution>
path: pom.xml
user: login: infeo
body: > it will escape the closing quote and break the command

This is not possible, since the ${devCommandFileDir} is followed by a constant string before the closing quote.

> whereas GitHub's Windows runner ships Visual Studio Enterprise by default.

In the CI script the property is overwritten during the maven run.
created_at: 2025-05-30T08:15:25Z
author_association: MEMBER
diff_hunk: @@ -336,24 +336,40 @@
 						<groupId>org.codehaus.mojo</groupId>
 						<artifactId>exec-maven-plugin</artifactId>
 						<version>3.5.0</version>
+						<configuration>
+							<executable>cmd</executable>
+							<workingDirectory>${project.basedir}</workingDirectory>
+							<environmentVariables>
+								<JAVA_HOME>${java.home}</JAVA_HOME>
+							</environmentVariables>
+						</configuration>
 						<executions>
 							<execution>
+								<id>compile-x64</id>
 								<goals>
 									<goal>exec</goal>
 								</goals>
 								<phase>compile</phase>
 								<configuration>
-									<executable>cmd</executable>
-									<workingDirectory>${project.basedir}</workingDirectory>
-									<environmentVariables>
-										<JAVA_HOME>${java.home}</JAVA_HOME>
-									</environmentVariables>
 									<arguments>
 										<argument>/c</argument>
 										<argument>"${devCommandFileDir}\vcvars64.bat" &amp;&amp; make install</argument>
 									</arguments>
 								</configuration>
 							</execution>
+							<execution>
+								<id>compile-arm64</id>
+								<goals>
+									<goal>exec</goal>
+								</goals>
+								<phase>compile</phase>
+								<configuration>
+									<arguments>
+										<argument>/c</argument>
+										<argument>"${devCommandFileDir}\vcvarsamd64_arm64.bat" &amp;&amp; make install ARCH=arm64</argument>
+									</arguments>
+								</configuration>
+							</execution>
path: pom.xml
user: login: coderabbitai[bot]
body: @infeo You're absolutely right on both points. I apologize for the confusion in my initial analysis.

1. **Quote escaping**: You're correct that there's no escaping issue. The `${devCommandFileDir}` variable is followed by the constant string `\vcvars64.bat"`, so even with a trailing backslash, the result would be something like `"...\Build\\vcvars64.bat"` where the double backslash is just interpreted as a single path separator, not as an escape sequence for the quote.

2. **Visual Studio edition**: Thank you for clarifying that the property gets overridden in CI. The hardcoded Community path in the POM is just a reasonable default for local development environments.

My concerns were based on incorrect assumptions. The configuration as implemented is actually correct and robust.


<!-- <agentComponentType>chat-answer</agentComponentType> -->

<!-- <rawResChunk><answer>@infeo You're absolutely right on both points. I apologize for the confusion in my initial analysis.

1. **Quote escaping**: You're correct that there's no escaping issue. The `${devCommandFileDir}` variable is followed by the constant string `\vcvars64.bat"`, so even with a trailing backslash, the result would be something like `"...\Build\\vcvars64.bat"` where the double backslash is just interpreted as a single path separator, not as an escape sequence for the quote.

2. **Visual Studio edition**: Thank you for clarifying that the property gets overridden in CI. The hardcoded Community path in the POM is just a reasonable default for local development environments.

My concerns were based on incorrect assumptions. The configuration as implemented is actually correct and robust.</answer></rawResChunk> -->

<!-- This is an auto-generated reply by CodeRabbit -->
created_at: 2025-05-30T08:15:54Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-21T11:36:13Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

The changes introduce architecture-specific handling for building and loading native DLLs within the project. The Makefile is updated to parameterize build outputs by architecture, with new variables and logic to ensure correct output paths and directory creation. The `pom.xml` is modified to extend the Maven build process, adding executions for both x64 and ARM64 architectures, including environment setup for cross-compilation. The Java class responsible for loading native libraries now selects the appropriate DLL at runtime based on the system architecture. The README is updated to clarify the MSVC toolset requirements for ARM64 builds.

## Possibly related issues

- cryptomator/cli#84: This issue discusses the need to publish Windows ARM64 builds, which is addressed by the introduction of ARM64-specific build and loading logic in this PR.

## Possibly related PRs

- cryptomator/integrations-win#87: This PR is closely related as it also modifies build scripts and configurations to support MSVC and Windows-specific build setups, aligning with the architecture-specific changes introduced here.

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=cryptomator/integrations-win&utm_content=106):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: purejava
created_at: 2025-05-28T09:17:03Z
body: > I adjusted the pom to contain two executions.
> 
> When I inspect the generated jar, there are 3 dll files:
> 
> * integrations-x64.dll
> * integrations-arm64.dll
> * integrations.dll
> 
> Where is the third one coming from?

Hi @infeo,

I found the time to look into it.
Maybe I am doing something wrong or misunderstood you, but on compiling `integrations-win` and using it as a dependency in the app, inspecting the jar lloks like this for me (ok):

<img width="410" alt="Bildschirmfoto 2025-05-28 um 10 02 01" src="https://github.com/user-attachments/assets/f1b385dc-7cca-4b82-9fba-7968b90e6bcc" />
author_association: CONTRIBUTOR
user: login: infeo
created_at: 2025-05-29T20:25:23Z
body: > Maybe I am doing something wrong or misunderstood you, but on compiling integrations-win and using it as a dependency in the app, inspecting the jar lloks like this for me (ok)

Thanks for checking. I didn't cleaned my environment properly, `integrations.dll` was a leftover artifact.
author_association: MEMBER