From a89909578b349e9b5fdd485e51700f9dec1b1f37 Mon Sep 17 00:00:00 2001 From: zivito Date: Wed, 5 Aug 2026 21:43:35 -0300 Subject: [PATCH] Add macOS Apple Silicon native support --- .../java/me/walkerknapp/devolay/Devolay.java | 12 +-- devolay-natives/build.gradle.kts | 79 ++++++++++++++++--- devolay-natives/gradle/toolchains.gradle.kts | 8 ++ 3 files changed, 85 insertions(+), 14 deletions(-) diff --git a/devolay-java/src/main/java/me/walkerknapp/devolay/Devolay.java b/devolay-java/src/main/java/me/walkerknapp/devolay/Devolay.java index c5726f8..b99fd10 100644 --- a/devolay-java/src/main/java/me/walkerknapp/devolay/Devolay.java +++ b/devolay-java/src/main/java/me/walkerknapp/devolay/Devolay.java @@ -20,7 +20,7 @@ public class Devolay { String libraryExtension = devolayLibraryName.substring(devolayLibraryName.indexOf('.')); String osDirectory = getOsDirectory(); - String archDirectory = getArchDirectory(); + String archDirectory = getArchDirectory(osDirectory); if (!osDirectory.equals("android")) { Path devolayNativesPath = extractNative("devolay-natives", libraryExtension, @@ -81,11 +81,13 @@ private static String getOsDirectory() { } } - private static String getArchDirectory() { + private static String getArchDirectory(String osDirectory) { final String osArchProperty = System.getProperty("os.arch").toLowerCase(); - if (osArchProperty.contains("aarch64") || (osArchProperty.contains("arm") && (osArchProperty.contains("64") || osArchProperty.contains("v8")))) { - return "arm64-v8a"; - } else if (osArchProperty.contains("aarch32") || (osArchProperty.contains("arm") && (osArchProperty.contains("32") || osArchProperty.contains("v7")))) { + if (osArchProperty.contains("aarch64") || osArchProperty.contains("arm64") + || (osArchProperty.contains("arm") && (osArchProperty.contains("64") || osArchProperty.contains("v8")))) { + return osDirectory.equals("android") ? "arm64-v8a" : "aarch64"; + } else if (osArchProperty.contains("aarch32") + || (osArchProperty.contains("arm") && (osArchProperty.contains("32") || osArchProperty.contains("v7")))) { return "armv7a"; } else if (osArchProperty.contains("64")) { return "x86-64"; diff --git a/devolay-natives/build.gradle.kts b/devolay-natives/build.gradle.kts index 4458b22..7b4ac18 100644 --- a/devolay-natives/build.gradle.kts +++ b/devolay-natives/build.gradle.kts @@ -45,15 +45,36 @@ tasks.withType(CppCompile::class).configureEach { if (this@configureEach.name.toLowerCase().contains("windows")) { when (toolChain) { is VisualCpp -> listOf("/std:c++11") - is Gcc -> listOf("-lstdc++", "-std=c++11", "-static-libgcc", "-static-libstdc++") - is Clang -> listOf("-lstdc++", "-std=c++11", "-static-libstdc++") + is Gcc -> listOf( + "-lstdc++", + "-std=c++11", + "-static-libgcc", + "-static-libstdc++") + is Clang -> listOf( + "-lstdc++", + "-std=c++11", + "-static-libstdc++") + else -> listOf() + } + } else if (OperatingSystem.current().isMacOsX && this@configureEach.name.toLowerCase().contains("macos")) { + when (toolChain) { + is Gcc, is Clang -> listOf("-std=c++11") else -> listOf() } } else { when (toolChain) { is VisualCpp -> listOf("/std:c++11") - is Gcc -> listOf("-lstdc++", "-std=c++11", "-static-libgcc", "-static-libstdc++", "-ldl") - is Clang -> listOf("-lstdc++", "-std=c++11", "-static-libstdc++", "-ldl") + is Gcc -> listOf( + "-lstdc++", + "-std=c++11", + "-static-libgcc", + "-static-libstdc++", + "-ldl") + is Clang -> listOf( + "-lstdc++", + "-std=c++11", + "-static-libstdc++", + "-ldl") else -> listOf() } } @@ -67,16 +88,55 @@ tasks.withType(CppCompile::class).configureEach { tasks.withType(LinkSharedLibrary::class).configureEach { linkerArgs.addAll(toolChain.map { toolChain -> - if (this@configureEach.name.toLowerCase().contains("windows")) { + val taskName = this@configureEach.name.toLowerCase() + + if (taskName.contains("windows")) { when (toolChain) { - is Gcc -> listOf("-shared", "-static-libgcc", "-static-libstdc++") - is Clang -> listOf("-shared", "-static-libstdc++") + is Gcc -> listOf( + "-shared", + "-static-libgcc", + "-static-libstdc++") + is Clang -> listOf( + "-shared", + "-static-libstdc++") else -> listOf() } + } else if (taskName.contains("macos")) { + if (OperatingSystem.current().isMacOsX) { + when (toolChain) { + is Gcc, is Clang -> listOf( + "-shared", + "-Wl,-install_name,@rpath/libdevolay-natives.dylib") + else -> listOf() + } + } else { + // Preserve the existing osxcross behavior on Linux. + when (toolChain) { + is Gcc -> listOf( + "-shared", + "-static-libgcc", + "-static-libstdc++", + "-ldl", + "-Wl,-install_name,@rpath/libdevolay-natives.dylib") + is Clang -> listOf( + "-shared", + "-static-libstdc++", + "-ldl", + "-Wl,-install_name,@rpath/libdevolay-natives.dylib") + else -> listOf() + } + } } else { when (toolChain) { - is Gcc -> listOf("-shared", "-static-libgcc", "-static-libstdc++", "-ldl") - is Clang -> listOf("-shared", "-static-libstdc++", "-ldl") + is Gcc -> listOf( + "-shared", + "-static-libgcc", + "-static-libstdc++", + "-ldl") + is Clang -> listOf( + "-shared", + "-static-libstdc++", + "-ldl") else -> listOf() } } @@ -92,6 +152,7 @@ library { targetMachines.set(listOf( machines.windows.x86, machines.windows.x86_64, machines.macOS.x86_64, + machines.macOS.architecture("aarch64"), machines.linux.x86, machines.linux.x86_64, machines.os("android").architecture("armv7a"), machines.os("android").architecture("arm64-v8a"), diff --git a/devolay-natives/gradle/toolchains.gradle.kts b/devolay-natives/gradle/toolchains.gradle.kts index b53dabb..1f12be5 100644 --- a/devolay-natives/gradle/toolchains.gradle.kts +++ b/devolay-natives/gradle/toolchains.gradle.kts @@ -74,6 +74,14 @@ open class ToolchainConfiguration : RuleSource() { } } + // On macOS, use the locally installed Apple Clang toolchain. + if (OperatingSystem.current().isMacOsX) { + register("appleClang") { + target("macos_x86-64") + target("macos_aarch64") + } + } + // On windows, compile using visualcpp or gcc. Unfortunately, cross compile from windows isn't really possible if (OperatingSystem.current().isWindows) { register("visualCpp")