X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/8e8eed7b061f1ed47cf9e30abb5e29ee08e3a3dc..7aafb05995ee09305fa36bcb79a03dc1d057a0eb:/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 70f2a2b4..6feb1b8b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,30 +3,94 @@ plugins { application eclipse `check-lib-versions` + id("org.graalvm.buildtools.native") version "0.10.6" } -version = "0.8.3" +allprojects { + group = "org.asamk" + version = "0.13.15-SNAPSHOT" +} java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + + if (!JavaVersion.current().isCompatibleWith(targetCompatibility)) { + toolchain { + languageVersion.set(JavaLanguageVersion.of(targetCompatibility.majorVersion)) + } + } } application { mainClass.set("org.asamk.signal.Main") + applicationDefaultJvmArgs = listOf("--enable-native-access=ALL-UNNAMED") } -repositories { - mavenLocal() - mavenCentral() +graalvmNative { + binaries { + this["main"].run { + buildArgs.add("--install-exit-handlers") + buildArgs.add("-Dfile.encoding=UTF-8") + buildArgs.add("-J-Dfile.encoding=UTF-8") + buildArgs.add("-march=compatibility") + resources.autodetect() + configurationFileDirectories.from(file("graalvm-config-dir")) + if (System.getenv("GRAALVM_HOME") == null) { + toolchainDetection.set(true) + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(21)) + }) + } else { + toolchainDetection.set(false) + } + } + } } +val artifactType = Attribute.of("artifactType", String::class.java) +val minified = Attribute.of("minified", Boolean::class.javaObjectType) dependencies { - implementation("org.bouncycastle:bcprov-jdk15on:1.68") - implementation("net.sourceforge.argparse4j:argparse4j:0.9.0") - implementation("com.github.hypfvieh:dbus-java:3.3.0") - implementation("org.slf4j:slf4j-simple:1.7.30") - implementation(project(":lib")) + attributesSchema { + attribute(minified) + } + artifactTypes.getByName("jar") { + attributes.attribute(minified, false) + } +} + +configurations.runtimeClasspath.configure { + attributes { + attribute(minified, true) + } +} +val excludePatterns = mapOf( + "libsignal-client" to setOf( + "libsignal_jni_testing_amd64.so", + "signal_jni_testing_amd64.dll", + "libsignal_jni_testing_amd64.dylib", + "libsignal_jni_testing_aarch64.dylib", + ) +) + +dependencies { + registerTransform(JarFileExcluder::class) { + from.attribute(minified, false).attribute(artifactType, "jar") + to.attribute(minified, true).attribute(artifactType, "jar") + + parameters { + excludeFilesByArtifact = excludePatterns + } + } + + implementation(libs.bouncycastle) + implementation(libs.jackson.databind) + implementation(libs.argparse4j) + implementation(libs.dbusjava) + implementation(libs.slf4j.api) + implementation(libs.slf4j.jul) + implementation(libs.logback) + implementation(project(":libsignal-cli")) } configurations { @@ -48,55 +112,28 @@ tasks.withType { tasks.withType { manifest { attributes( - "Implementation-Title" to project.name, - "Implementation-Version" to project.version, - "Main-Class" to application.mainClass.get() + "Implementation-Title" to project.name, + "Implementation-Version" to project.version, + "Main-Class" to application.mainClass.get(), + "Enable-Native-Access" to "ALL-UNNAMED", ) } } -tasks.withType { - val appArgs: String? by project - if (appArgs != null) { - // allow passing command-line arguments to the main application e.g.: - // $ gradle run -PappArgs="['-u', '+...', 'daemon', '--json']" - args = groovy.util.Eval.me(appArgs) as MutableList - } -} - -val assembleNativeImage by tasks.registering { - dependsOn("assemble") - - var graalVMHome = "" +tasks.register("fatJar", type = Jar::class) { + archiveBaseName.set("${project.name}-fat") + exclude( + "META-INF/*.SF", + "META-INF/*.DSA", + "META-INF/*.RSA", + "META-INF/NOTICE*", + "META-INF/LICENSE*", + "META-INF/INDEX.LIST", + "**/module-info.class", + ) + duplicatesStrategy = DuplicatesStrategy.WARN doFirst { - graalVMHome = System.getenv("GRAALVM_HOME") - ?: throw GradleException("Required GRAALVM_HOME environment variable not set.") - } - - doLast { - val nativeBinaryOutputPath = "$buildDir/native-image" - val nativeBinaryName = "signal-cli" - - mkdir(nativeBinaryOutputPath) - - exec { - workingDir = File(".") - commandLine("$graalVMHome/bin/native-image", - "-H:Path=$nativeBinaryOutputPath", - "-H:Name=$nativeBinaryName", - "-H:JNIConfigurationFiles=graalvm-config-dir/jni-config.json", - "-H:DynamicProxyConfigurationFiles=graalvm-config-dir/proxy-config.json", - "-H:ResourceConfigurationFiles=graalvm-config-dir/resource-config.json", - "-H:ReflectionConfigurationFiles=graalvm-config-dir/reflect-config.json", - "--no-fallback", - "--allow-incomplete-classpath", - "--report-unsupported-elements-at-runtime", - "--enable-url-protocols=http,https", - "--enable-https", - "--enable-all-security-services", - "-cp", - sourceSets.main.get().runtimeClasspath.asPath, - application.mainClass.get()) - } + from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) } + with(tasks.jar.get()) }