From 305eca7696e68f0e766e14ee703e4bc13147939e Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Fri, 20 Jan 2023 12:19:52 +1100 Subject: [PATCH 1/4] Initial support for x86_64 Android devices. --- Editor/CompileCesiumForUnityNative.cs | 32 ++++++++++++++++--- native~/CMakeLists.txt | 17 +++++----- native~/extern/android-toolchain-arm64.cmake | 2 ++ ...n.cmake => android-toolchain-common.cmake} | 1 - native~/extern/android-toolchain-x86_64.cmake | 2 ++ 5 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 native~/extern/android-toolchain-arm64.cmake rename native~/extern/{android-toolchain.cmake => android-toolchain-common.cmake} (92%) create mode 100644 native~/extern/android-toolchain-x86_64.cmake diff --git a/Editor/CompileCesiumForUnityNative.cs b/Editor/CompileCesiumForUnityNative.cs index b3f2ec47..b31dd7d5 100644 --- a/Editor/CompileCesiumForUnityNative.cs +++ b/Editor/CompileCesiumForUnityNative.cs @@ -145,7 +145,7 @@ private static void ConfigurePlugin(LibraryToBuild library, PluginImporter impor if (library.Platform == BuildTarget.Android) { - importer.SetPlatformData(BuildTarget.Android, "CPU", "ARM64"); + importer.SetPlatformData(BuildTarget.Android, "CPU", library.Cpu == "arm64" ? "ARM64" : library.Cpu); } else if (library.Platform == BuildTarget.StandaloneOSX) { @@ -188,6 +188,7 @@ private static void OnPostprocessAllAssets( /// public void OnPostBuildPlayerScriptDLLs(BuildReport report) { + if (report.summary.platform == BuildTarget.StandaloneOSX) { // On macOS, build for both ARM64 and x64, and then use the lipo tool to combine @@ -212,6 +213,24 @@ public void OnPostBuildPlayerScriptDLLs(BuildReport report) Directory.Delete(x64.InstallDirectory, true); Directory.Delete(arm64.InstallDirectory, true); } + else if (report.summary.platform == BuildTarget.Android) + { + // We support ARM64 and x86_64. If any other architectures are enabled, log a warning. + AndroidArchitecture supported = AndroidArchitecture.ARM64 | AndroidArchitecture.X86_64; + if ((PlayerSettings.Android.targetArchitectures & ~supported) != 0) + UnityEngine.Debug.LogWarning("Cesium for Unity only supports the ARM64 and x86_64 CPU architectures on Android. Other architectures will not work."); + + if (PlayerSettings.Android.targetArchitectures.HasFlag(AndroidArchitecture.ARM64)) + { + LibraryToBuild arm64 = GetLibraryToBuild(report.summary, "arm64"); + BuildNativeLibrary(arm64); + } + if (PlayerSettings.Android.targetArchitectures.HasFlag(AndroidArchitecture.X86_64)) + { + LibraryToBuild x64 = GetLibraryToBuild(report.summary, "x86_64"); + BuildNativeLibrary(x64); + } + } else { BuildNativeLibrary(GetLibraryToBuild(report.summary)); @@ -253,7 +272,11 @@ public static LibraryToBuild GetLibraryToBuild(PlatformToBuild platform, string library.ExtraConfigureArgs.Add("-DEDITOR=on"); if (platform.platformGroup == BuildTargetGroup.Android) - library.Toolchain = "extern/android-toolchain.cmake"; + { + if (cpu == null) + cpu = "arm64"; + library.Toolchain = $"extern/android-toolchain-${cpu}.cmake"; + } if (platform.platformGroup == BuildTargetGroup.iOS) { @@ -261,9 +284,10 @@ public static LibraryToBuild GetLibraryToBuild(PlatformToBuild platform, string library.ExtraConfigureArgs.Add("-GXcode"); } - if (platform.platform == BuildTarget.StandaloneOSX && cpu != null) + if (cpu != null) { - library.ExtraConfigureArgs.Add("-DCMAKE_OSX_ARCHITECTURES=" + cpu); + if (platform.platform == BuildTarget.StandaloneOSX) + library.ExtraConfigureArgs.Add("-DCMAKE_OSX_ARCHITECTURES=" + cpu); library.InstallDirectory = Path.Combine(library.InstallDirectory, cpu); library.BuildDirectory += "-" + cpu; } diff --git a/native~/CMakeLists.txt b/native~/CMakeLists.txt index 5b22e3bd..dcff01b3 100644 --- a/native~/CMakeLists.txt +++ b/native~/CMakeLists.txt @@ -25,7 +25,6 @@ set( SUPPORT_CONSOLE_APP OFF) add_subdirectory(extern/tidy-html5 EXCLUDE_FROM_ALL) if (${CMAKE_SYSTEM_NAME} STREQUAL "Android") - set(CESIUM_ARCHITECTURE "aarch64") set(HTTPLIB_USE_OPENSSL_IF_AVAILABLE OFF) set(ANDROID_ABI ${CMAKE_ANDROID_ARCH_ABI}) set(ANDROID_NDK ${CMAKE_ANDROID_NDK}) @@ -45,10 +44,10 @@ endif() # Specify all targets that need to compile bitcode if (${CMAKE_SYSTEM_NAME} STREQUAL "iOS") - set (ALL_TARGETS + set (ALL_TARGETS CesiumForUnityNative-Runtime Async++ - Cesium3DTilesSelection + Cesium3DTilesSelection CesiumAsync CesiumGeospatial CesiumGeometry @@ -58,15 +57,15 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "iOS") CesiumUtility draco_attributes draco_compression_attributes_dec - draco_compression_bit_coders - draco_compression_entropy + draco_compression_bit_coders + draco_compression_entropy draco_compression_decode draco_compression_mesh_dec draco_compression_point_cloud_dec draco_core draco_mesh - draco_metadata - draco_metadata_dec + draco_metadata + draco_metadata_dec draco_point_cloud draco_points_dec draco_static @@ -81,9 +80,9 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "iOS") tinyxml2 tidy-static uriparser - webpdecode + webpdecode webpdecoder - webpdspdecode + webpdspdecode webputils webputilsdecode ) diff --git a/native~/extern/android-toolchain-arm64.cmake b/native~/extern/android-toolchain-arm64.cmake new file mode 100644 index 00000000..9f658eec --- /dev/null +++ b/native~/extern/android-toolchain-arm64.cmake @@ -0,0 +1,2 @@ +include(android-toolchain-common.cmake) +SET(CMAKE_ANDROID_ARCH_ABI arm64-v8a) diff --git a/native~/extern/android-toolchain.cmake b/native~/extern/android-toolchain-common.cmake similarity index 92% rename from native~/extern/android-toolchain.cmake rename to native~/extern/android-toolchain-common.cmake index b7d185f6..e525187c 100644 --- a/native~/extern/android-toolchain.cmake +++ b/native~/extern/android-toolchain-common.cmake @@ -1,7 +1,6 @@ SET(CMAKE_SYSTEM_NAME Android) SET(CMAKE_SYSTEM_VERSION 21) -SET(CMAKE_ANDROID_ARCH_ABI arm64-v8a) SET(CMAKE_ANDROID_NDK "$ENV{ANDROID_NDK_ROOT}") SET(CMAKE_ANDROID_STL_TYPE c++_static) diff --git a/native~/extern/android-toolchain-x86_64.cmake b/native~/extern/android-toolchain-x86_64.cmake new file mode 100644 index 00000000..ad9f9948 --- /dev/null +++ b/native~/extern/android-toolchain-x86_64.cmake @@ -0,0 +1,2 @@ +include(android-toolchain-common.cmake) +SET(CMAKE_ANDROID_ARCH_ABI x86_64) From 77bc43f6d8ed08922bb22603397b96c129c5b3dc Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Fri, 20 Jan 2023 16:44:39 +1100 Subject: [PATCH 2/4] Fix Android x86_64 build. --- Editor/BuildCesiumForUnity.cs | 1 + Editor/CompileCesiumForUnityNative.cs | 84 ++++++++++++------- native~/extern/android-toolchain-arm64.cmake | 2 - native~/extern/android-toolchain-x86_64.cmake | 2 - ...n-common.cmake => android-toolchain.cmake} | 0 native~/extern/cesium-native | 2 +- 6 files changed, 54 insertions(+), 37 deletions(-) delete mode 100644 native~/extern/android-toolchain-arm64.cmake delete mode 100644 native~/extern/android-toolchain-x86_64.cmake rename native~/extern/{android-toolchain-common.cmake => android-toolchain.cmake} (100%) diff --git a/Editor/BuildCesiumForUnity.cs b/Editor/BuildCesiumForUnity.cs index ea033662..8842bc95 100644 --- a/Editor/BuildCesiumForUnity.cs +++ b/Editor/BuildCesiumForUnity.cs @@ -33,6 +33,7 @@ public static void CompileForAndroidAndExit() Directory.CreateDirectory(buildPath); try { + PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64 | AndroidArchitecture.X86_64; BuildPlayer(BuildTargetGroup.Android, BuildTarget.Android, Path.Combine(buildPath, "Android")); } finally diff --git a/Editor/CompileCesiumForUnityNative.cs b/Editor/CompileCesiumForUnityNative.cs index b31dd7d5..d974fcaa 100644 --- a/Editor/CompileCesiumForUnityNative.cs +++ b/Editor/CompileCesiumForUnityNative.cs @@ -76,10 +76,11 @@ public void OnPreprocessBuild(BuildReport report) AssetDatabase.StartAssetEditing(); try { - CreatePlaceholders( - GetLibraryToBuild(report.summary), - "CesiumForUnityNative-Runtime" - ); + LibraryToBuild[] libraries = GetLibrariesToBuildForPlatform(report.summary); + foreach (LibraryToBuild library in libraries) + { + CreatePlaceholders(library, "CesiumForUnityNative-Runtime"); + } } finally { @@ -188,32 +189,46 @@ private static void OnPostprocessAllAssets( /// public void OnPostBuildPlayerScriptDLLs(BuildReport report) { - + LibraryToBuild[] libraries = GetLibrariesToBuildForPlatform(report.summary); + foreach (LibraryToBuild library in libraries) + { + BuildNativeLibrary(library); + } + if (report.summary.platform == BuildTarget.StandaloneOSX) { // On macOS, build for both ARM64 and x64, and then use the lipo tool to combine // the libraries for the two CPUs into a single library. - LibraryToBuild x64 = GetLibraryToBuild(report.summary, "x86_64"); - BuildNativeLibrary(x64); - LibraryToBuild arm64 = GetLibraryToBuild(report.summary, "arm64"); - BuildNativeLibrary(arm64); - - string[] args = new[] + List args = new List(); + args.Add("-create"); + foreach (LibraryToBuild library in libraries) { - "-create", - Path.Combine(x64.InstallDirectory, "libCesiumForUnityNative-Runtime.dylib"), - Path.Combine(arm64.InstallDirectory, "libCesiumForUnityNative-Runtime.dylib"), - "-output", - Path.GetFullPath(Path.Combine(x64.InstallDirectory, "..", "libCesiumForUnityNative-Runtime.dylib")) - }; + args.Add(Path.Combine(library.InstallDirectory, "libCesiumForUnityNative-Runtime.dylib")); + } + args.Add("-output"); + args.Add(Path.GetFullPath(Path.Combine(libraries[0].InstallDirectory, "..", "libCesiumForUnityNative-Runtime.dylib"))); Process p = Process.Start("lipo", string.Join(' ', args)); p.WaitForExit(); if (p.ExitCode != 0) throw new Exception("lipo failed"); - Directory.Delete(x64.InstallDirectory, true); - Directory.Delete(arm64.InstallDirectory, true); + + foreach (LibraryToBuild library in libraries) + { + Directory.Delete(library.InstallDirectory, true); + } + } + } + + private static LibraryToBuild[] GetLibrariesToBuildForPlatform(BuildSummary summary) + { + List result = new List(); + + if (summary.platform == BuildTarget.StandaloneOSX) + { + result.Add(GetLibraryToBuild(summary, "x86_64")); + result.Add(GetLibraryToBuild(summary, "arm64")); } - else if (report.summary.platform == BuildTarget.Android) + else if (summary.platform == BuildTarget.Android) { // We support ARM64 and x86_64. If any other architectures are enabled, log a warning. AndroidArchitecture supported = AndroidArchitecture.ARM64 | AndroidArchitecture.X86_64; @@ -221,21 +236,18 @@ public void OnPostBuildPlayerScriptDLLs(BuildReport report) UnityEngine.Debug.LogWarning("Cesium for Unity only supports the ARM64 and x86_64 CPU architectures on Android. Other architectures will not work."); if (PlayerSettings.Android.targetArchitectures.HasFlag(AndroidArchitecture.ARM64)) - { - LibraryToBuild arm64 = GetLibraryToBuild(report.summary, "arm64"); - BuildNativeLibrary(arm64); - } + result.Add(GetLibraryToBuild(summary, "arm64")); if (PlayerSettings.Android.targetArchitectures.HasFlag(AndroidArchitecture.X86_64)) - { - LibraryToBuild x64 = GetLibraryToBuild(report.summary, "x86_64"); - BuildNativeLibrary(x64); - } + result.Add(GetLibraryToBuild(summary, "x86_64")); } else { - BuildNativeLibrary(GetLibraryToBuild(report.summary)); + result.Add(GetLibraryToBuild(summary)); } + + return result.ToArray(); } + public static LibraryToBuild GetLibraryToBuild(BuildSummary summary, string cpu = null) { return GetLibraryToBuild(new PlatformToBuild() @@ -273,9 +285,13 @@ public static LibraryToBuild GetLibraryToBuild(PlatformToBuild platform, string if (platform.platformGroup == BuildTargetGroup.Android) { + library.Toolchain = $"extern/android-toolchain.cmake"; if (cpu == null) cpu = "arm64"; - library.Toolchain = $"extern/android-toolchain-${cpu}.cmake"; + if (cpu == "x86_64") + library.ExtraConfigureArgs.Add("-DCMAKE_ANDROID_ARCH_ABI=x86_64"); + else + library.ExtraConfigureArgs.Add("-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a"); } if (platform.platformGroup == BuildTargetGroup.iOS) @@ -284,10 +300,14 @@ public static LibraryToBuild GetLibraryToBuild(PlatformToBuild platform, string library.ExtraConfigureArgs.Add("-GXcode"); } - if (cpu != null) + if (platform.platform == BuildTarget.StandaloneOSX) { - if (platform.platform == BuildTarget.StandaloneOSX) + if (cpu != null) library.ExtraConfigureArgs.Add("-DCMAKE_OSX_ARCHITECTURES=" + cpu); + } + + if (cpu != null) + { library.InstallDirectory = Path.Combine(library.InstallDirectory, cpu); library.BuildDirectory += "-" + cpu; } diff --git a/native~/extern/android-toolchain-arm64.cmake b/native~/extern/android-toolchain-arm64.cmake deleted file mode 100644 index 9f658eec..00000000 --- a/native~/extern/android-toolchain-arm64.cmake +++ /dev/null @@ -1,2 +0,0 @@ -include(android-toolchain-common.cmake) -SET(CMAKE_ANDROID_ARCH_ABI arm64-v8a) diff --git a/native~/extern/android-toolchain-x86_64.cmake b/native~/extern/android-toolchain-x86_64.cmake deleted file mode 100644 index ad9f9948..00000000 --- a/native~/extern/android-toolchain-x86_64.cmake +++ /dev/null @@ -1,2 +0,0 @@ -include(android-toolchain-common.cmake) -SET(CMAKE_ANDROID_ARCH_ABI x86_64) diff --git a/native~/extern/android-toolchain-common.cmake b/native~/extern/android-toolchain.cmake similarity index 100% rename from native~/extern/android-toolchain-common.cmake rename to native~/extern/android-toolchain.cmake diff --git a/native~/extern/cesium-native b/native~/extern/cesium-native index 8c7600d4..77c7badf 160000 --- a/native~/extern/cesium-native +++ b/native~/extern/cesium-native @@ -1 +1 @@ -Subproject commit 8c7600d4a472cb64fb3220e957db6a8deb59e048 +Subproject commit 77c7badf9e35ac5edb8030f6ddf07f59d5760aeb From 2d106e0c788b97a503e9381be059fb2e22fd47d9 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sat, 21 Jan 2023 10:12:19 +1100 Subject: [PATCH 3/4] Specify IL2CPP backend for Android. --- Editor/BuildCesiumForUnity.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Editor/BuildCesiumForUnity.cs b/Editor/BuildCesiumForUnity.cs index 8842bc95..a808fd08 100644 --- a/Editor/BuildCesiumForUnity.cs +++ b/Editor/BuildCesiumForUnity.cs @@ -33,6 +33,7 @@ public static void CompileForAndroidAndExit() Directory.CreateDirectory(buildPath); try { + PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP); PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64 | AndroidArchitecture.X86_64; BuildPlayer(BuildTargetGroup.Android, BuildTarget.Android, Path.Combine(buildPath, "Android")); } From 80d2b87d773773ded499e85f42f50c3e07e1d05e Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sat, 21 Jan 2023 11:37:08 +1100 Subject: [PATCH 4/4] Only create a placeholder for the universal lib on macOS. --- Editor/CompileCesiumForUnityNative.cs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/Editor/CompileCesiumForUnityNative.cs b/Editor/CompileCesiumForUnityNative.cs index d974fcaa..8e87f4bd 100644 --- a/Editor/CompileCesiumForUnityNative.cs +++ b/Editor/CompileCesiumForUnityNative.cs @@ -76,7 +76,7 @@ public void OnPreprocessBuild(BuildReport report) AssetDatabase.StartAssetEditing(); try { - LibraryToBuild[] libraries = GetLibrariesToBuildForPlatform(report.summary); + LibraryToBuild[] libraries = GetLibrariesToBuildForPlatform(report.summary, finalLibrariesOnly: true); foreach (LibraryToBuild library in libraries) { CreatePlaceholders(library, "CesiumForUnityNative-Runtime"); @@ -189,7 +189,7 @@ private static void OnPostprocessAllAssets( /// public void OnPostBuildPlayerScriptDLLs(BuildReport report) { - LibraryToBuild[] libraries = GetLibrariesToBuildForPlatform(report.summary); + LibraryToBuild[] libraries = GetLibrariesToBuildForPlatform(report.summary, finalLibrariesOnly: false); foreach (LibraryToBuild library in libraries) { BuildNativeLibrary(library); @@ -219,14 +219,31 @@ public void OnPostBuildPlayerScriptDLLs(BuildReport report) } } - private static LibraryToBuild[] GetLibrariesToBuildForPlatform(BuildSummary summary) + /// + /// + /// + /// + /// + /// True if only the final libraries shipped to end users should be included, not any intermediate libraries created along the way. + /// This affects the macOS libraries, where two libraries are built (for x64 and ARM64), but then they are compiled into a + /// single library supporting both platforms. + /// + /// + private static LibraryToBuild[] GetLibrariesToBuildForPlatform(BuildSummary summary, bool finalLibrariesOnly) { List result = new List(); if (summary.platform == BuildTarget.StandaloneOSX) { - result.Add(GetLibraryToBuild(summary, "x86_64")); - result.Add(GetLibraryToBuild(summary, "arm64")); + if (finalLibrariesOnly) + { + result.Add(GetLibraryToBuild(summary, "x86_64")); + } + else + { + result.Add(GetLibraryToBuild(summary, "x86_64")); + result.Add(GetLibraryToBuild(summary, "arm64")); + } } else if (summary.platform == BuildTarget.Android) {