From 0ed0fcf042cdbc95fdb39935ea89664aa9447c8f Mon Sep 17 00:00:00 2001
From: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
Date: Thu, 20 Jul 2023 22:50:12 +0200
Subject: [PATCH] Add gradle module for libryujinx

---
 src/RyujinxAndroid/app/build.gradle        |  2 +-
 src/RyujinxAndroid/gradle.properties       |  8 +-
 src/RyujinxAndroid/libryujinx/build.gradle | 88 ++++++++++++++++++++++
 src/RyujinxAndroid/settings.gradle         |  1 +
 4 files changed, 97 insertions(+), 2 deletions(-)
 create mode 100644 src/RyujinxAndroid/libryujinx/build.gradle

diff --git a/src/RyujinxAndroid/app/build.gradle b/src/RyujinxAndroid/app/build.gradle
index 2f0fa7a96..870e4c8cb 100644
--- a/src/RyujinxAndroid/app/build.gradle
+++ b/src/RyujinxAndroid/app/build.gradle
@@ -69,7 +69,7 @@ android {
 }
 
 dependencies {
-
+    runtimeOnly project(":libryujinx")
     implementation 'androidx.core:core-ktx:1.10.1'
     implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0')
     implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
diff --git a/src/RyujinxAndroid/gradle.properties b/src/RyujinxAndroid/gradle.properties
index 3c5031eb7..f1ef5b6a3 100644
--- a/src/RyujinxAndroid/gradle.properties
+++ b/src/RyujinxAndroid/gradle.properties
@@ -20,4 +20,10 @@ kotlin.code.style=official
 # Enables namespacing of each library's R class so that its R class includes only the
 # resources declared in the library itself and none from the library's dependencies,
 # thereby reducing the size of the R class for that library
-android.nonTransitiveRClass=true
\ No newline at end of file
+android.nonTransitiveRClass=true
+# Build configuration
+# It needs to be set to either "debug" or "release" and can also be overriden on a per build basis
+# by adding -Dorg.ryujinx.config=NAME to the command line.
+org.ryujinx.config=debug
+# Output path of libRyujinx.so
+org.ryujinx.publish.path=app/src/main/jniLibs/arm64-v8a
\ No newline at end of file
diff --git a/src/RyujinxAndroid/libryujinx/build.gradle b/src/RyujinxAndroid/libryujinx/build.gradle
new file mode 100644
index 000000000..3c4872912
--- /dev/null
+++ b/src/RyujinxAndroid/libryujinx/build.gradle
@@ -0,0 +1,88 @@
+plugins {
+    id 'base'
+}
+
+// Configurable properties
+
+// Path to the LLVM toolchain to use. This should be configured in your global gradle.properties
+// See: https://docs.gradle.org/current/userguide/directory_layout.html#dir:gradle_user_home
+def toolchainPath = providers.gradleProperty("org.ryujinx.llvm.toolchain.path").getOrNull()
+// Build configuration
+def configuration = providers.gradleProperty("org.ryujinx.config").getOrElse("debug").toLowerCase()
+// Publish directory
+def publishDirectory = providers.gradleProperty("org.ryujinx.publish.path").getOrNull()
+// Should the symbols be stripped from the published library?
+// Per default the symbols will be stripped for release builds, but not for debug builds.
+// This can be overridden using this property.
+// Valid values are: ["true", "1", "false", "0"]
+def stripSymbols = false
+if (project.hasProperty("org.ryujinx.symbols.strip")) {
+    stripSymbols = project.property("org.ryujinx.symbols.strip") == "true" || project.property("org.ryujinx.symbols.strip") == "1"
+}
+else {
+    stripSymbols = configuration == "release"
+}
+// Additional arguments for the dotnet publish command.
+def additionalArgs = project.hasProperty("org.ryujinx.args") ? project.property("org.ryujinx.args") : ""
+
+configuration = configuration.substring(0, 1).toUpperCase() + configuration.substring(1)
+
+if (publishDirectory != null) {
+    publishDirectory = "${rootProject.projectDir}/${publishDirectory}"
+}
+else {
+    publishDirectory = libsDirectory.get().toString()
+}
+
+// Trees
+
+ext.outputTree = fileTree("${buildDir}/publish") {
+    include '**/*'
+    builtBy 'compileLibRyujinx'
+}
+
+ext.publishTree = fileTree(publishDirectory) {
+    include '**/*.so'
+    builtBy 'compileLibRyujinx'
+}
+
+// Tasks
+
+tasks.register('compileLibRyujinx', Exec) {
+    workingDir '../../LibRyujinx'
+
+    if (toolchainPath != null) {
+        environment "PATH", "${toolchainPath}:${providers.environmentVariable("PATH").get()}"
+    }
+
+    executable 'dotnet'
+    args 'publish',
+            '-r', 'linux-bionic-arm64',
+            '-c', configuration,
+            "-p:DisableUnsupportedError=true",
+            "-p:PublishAotUsingRuntimePack=true",
+            "-p:StripSymbols=${stripSymbols}",
+            "--artifacts-path", buildDir
+
+    args additionalArgs.split(" ")
+
+    doLast {
+        project.sync {
+            from project.ext.outputTree.getFiles()
+            include '*.so'
+            into publishDirectory
+            rename (String originalName) -> originalName.toLowerCase()
+            preserve {
+                include '.*'
+            }
+        }
+    }
+}
+
+tasks.register("cleanLibRyujinx", Delete) {
+    delete project.ext.publishTree.getFiles()
+}
+
+// Register tasks as standard lifecycle tasks
+assemble.dependsOn("compileLibRyujinx")
+clean.dependsOn("cleanLibRyujinx")
diff --git a/src/RyujinxAndroid/settings.gradle b/src/RyujinxAndroid/settings.gradle
index 50231595d..0c8087171 100644
--- a/src/RyujinxAndroid/settings.gradle
+++ b/src/RyujinxAndroid/settings.gradle
@@ -16,3 +16,4 @@ dependencyResolutionManagement {
 }
 rootProject.name = "RyujinxAndroid"
 include ':app'
+include ':libryujinx'