forked from MeloNX/MeloNX
I spent ~7 hours debugging this. I searched for a bug in the Exec task and found nothing. I tried different ways to invoke the dotnet command to make sure PATH is always set before. I also modified Microsoft.NETCore.Native.Unix.targets to echo PATH via Exec and via Text. But in the end I was confused about seeing two PATH variables when checking the dotnet.exe subprocess with ProcessHacker. This made me try setting the Path variable instead of PATH and to my surprise this just worked. Turns out Windows environment variables are case-sensitive and Windows uses Path instead of PATH like Unix. God, I love Microsoft Windows. :)
140 lines
4.6 KiB
Groovy
140 lines
4.6 KiB
Groovy
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
|
|
|
|
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()
|
|
// Path to the dotnet executable This should be configured in your global gradle.properties
|
|
// See: https://docs.gradle.org/current/userguide/directory_layout.html#dir:gradle_user_home
|
|
def dotnetExecutable = providers.gradleProperty("org.ryujinx.dotnet.bin").getOrElse("dotnet")
|
|
// 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: ["auto", "-1", "true", "1", "false", "0"]
|
|
def stripSymbols = providers.gradleProperty("org.ryujinx.symbols.strip").getOrElse("")
|
|
//noinspection GroovyFallthrough
|
|
switch (stripSymbols) {
|
|
case "true":
|
|
case "1":
|
|
stripSymbols = true
|
|
break
|
|
case "false":
|
|
case "0":
|
|
stripSymbols = false
|
|
break
|
|
default:
|
|
stripSymbols = configuration == "release"
|
|
break
|
|
}
|
|
// 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 ext.outputTree.getFiles().collect { it.getName().toLowerCase() }.findAll { it.endsWith(".so") }
|
|
builtBy 'compileLibRyujinx'
|
|
}
|
|
|
|
// Tasks
|
|
|
|
tasks.register('compileLibRyujinx', Exec) {
|
|
def projectName = "LibRyujinx"
|
|
|
|
workingDir "../../${projectName}"
|
|
|
|
def solutionFiles = fileTree("../../") {
|
|
include '**/*.cs'
|
|
include '**/*.csproj'
|
|
exclude '**/bin/**'
|
|
exclude '**/obj/**'
|
|
exclude '**/RyujinxAndroid/**'
|
|
}
|
|
|
|
inputs.files(solutionFiles)
|
|
.withPropertyName('sourceFiles')
|
|
.withPathSensitivity(PathSensitivity.RELATIVE)
|
|
.ignoreEmptyDirectories()
|
|
|
|
outputs.file("${publishDirectory}/${projectName.toLowerCase()}.so")
|
|
|
|
OperatingSystem os = DefaultNativePlatform.currentOperatingSystem
|
|
if (toolchainPath != null) {
|
|
if (os.isWindows()) {
|
|
// NOTE: This is not a typo. dotnet.exe actually uses Path instead of PATH.
|
|
environment "Path", "${toolchainPath};${providers.environmentVariable("PATH").get()}"
|
|
}
|
|
else {
|
|
environment "PATH", "${toolchainPath}:${providers.environmentVariable("PATH").get()}"
|
|
}
|
|
}
|
|
|
|
doFirst {
|
|
println "Building ${projectName} in ${configuration} mode."
|
|
println "Configuration:"
|
|
println "\tusing: ${dotnetExecutable}"
|
|
println "\tStripSymbols: ${stripSymbols}"
|
|
println "\tadditional args: ${additionalArgs.split(" ")}"
|
|
println "\tcustom LLVM toolchain path: ${toolchainPath}"
|
|
}
|
|
|
|
executable dotnetExecutable
|
|
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()
|
|
duplicatesStrategy 'fail'
|
|
preserve {
|
|
include '.gitkeep'
|
|
include '*.so'
|
|
exclude {
|
|
project.ext.publishTree
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
tasks.register("cleanLibRyujinx", Delete) {
|
|
delete project.ext.publishTree.getFiles()
|
|
}
|
|
|
|
// Register tasks as standard lifecycle tasks
|
|
assemble.dependsOn("compileLibRyujinx")
|
|
clean.dependsOn("cleanLibRyujinx")
|