From 4baa061b8d757def5905d37f676090db945fa54f Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Mon, 4 Sep 2023 15:26:17 +0200 Subject: [PATCH] gradle: add native-image plugin --- build.gradle | 51 +++- java/reflect-config.json | 503 +++++++++++++++++++++++++++++++++++++++ settings.gradle | 6 + 3 files changed, 559 insertions(+), 1 deletion(-) create mode 100644 java/reflect-config.json diff --git a/build.gradle b/build.gradle index 9baef79c3..6840ea384 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,9 @@ +// sudo apt install libfreetype-dev plugins { id 'application' id 'com.diffplug.spotless' version '6.23.3' id 'net.ltgt.errorprone' version '3.1.0' + id 'org.graalvm.buildtools.native' version '0.9.28' } group = 'org.contikios.cooja' @@ -89,6 +91,7 @@ sourceSets { application { mainClass = 'org.contikios.cooja.Main' applicationDefaultJvmArgs = ['-Xms400M', '-Xmx2048M', +// '-agentlib:native-image-agent=config-output-dir=' + buildscript.sourceFile.getParent() + "/trace", // Several Contiki-NG tests crash the JVM without these flags with Java 17, // 08-ipv6-unicast.csc is one example. Unclear why, the JVM should not // do anything with the pointers in C-land part of ContikiMoteType. @@ -97,6 +100,51 @@ application { '--enable-preview', '--enable-native-access', 'ALL-UNNAMED'] } +graalvmNative { + metadataRepository { + enabled = true + } + binaries { + main { + // resources.autodetect() + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(javaVersion) + vendor = JvmVendorSpec.matching("Oracle Corporation") + } + fallback = true + useFatJar = true + configurationFileDirectories.from(file('java')) + buildArgs.add('--enable-preview') + buildArgs.add('--strict-image-heap') + buildArgs.add('--report-unsupported-elements-at-runtime') + buildArgs.add('--initialize-at-build-time=org.slf4j.LoggerFactory,ch.qos.logback') + // buildArgs.add('--verbose') + buildArgs.add('--trace-class-initialization=ch.qos.logback.classic.Logger') + buildArgs.add('--trace-object-instantiation=ch.qos.logback.core.AsyncAppenderBase$Worker') + // Permit java.lang.foreign.SymbolLookup::libraryLookup. + buildArgs.add('--enable-native-access=ALL-UNNAMED') + // native-image will use 32 cores on a 48 core machine by default, + // and all cores on a 20 core machine. + // buildArgs.add('--parallelism=11') + // native-image will use 24G ram on a 128G machine by default, and + // 10G on a 24G machine. + buildArgs.add('-J-Xmx10G') + // FIXME: no support for nativeRun --args? + // FIXME: unclear status of AWT support in native-image. + //runtimeArgs.add("--no-gui") + // FIXME: no support for symbol lookup in native-image 21.0.1. + // runtimeArgs.add("../../tests/07-simulation-base/02-ringbufindex.csc") + //runtimeArgs.add("/home/user/contiki-ng/tests/07-simulation-base/01-hello-world-sky.csc") + runtimeArgs.add("/home/user/contiki-ng/tests/07-simulation-base/23-rpl-tsch-z1.csc") + } + } +} + +tasks.named("nativeCompile") { + dependsOn fullJar + classpathJar = layout.buildDirectory.file("libs/cooja-full.jar") +} + tasks.withType(JavaCompile).configureEach { // ErrorProne is slow, only enable with ./gradlew build -Perrorprone. options.errorprone.enabled = project.hasProperty('errorprone') @@ -135,7 +183,8 @@ tasks.withType(JavaCompile).configureEach { options.errorprone.disable('UnusedMethod') options.errorprone.disable('UnusedVariable') options.compilerArgs += ['-Werror', '--enable-preview', - "-Aproject=${project.group}/${project.name}"] + "-Aproject=${project.group}/${project.name}", + "-Aother.resource.patterns=.*"] } tasks.withType(AbstractArchiveTask).configureEach { diff --git a/java/reflect-config.json b/java/reflect-config.json new file mode 100644 index 000000000..2af1f9605 --- /dev/null +++ b/java/reflect-config.json @@ -0,0 +1,503 @@ +[ + { + "name": "ch.qos.logback.core.ConsoleAppender", + "allDeclaredConstructors": true, + "allPublicConstructors": true, + "allDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredFields": true, + "allPublicFields": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name" : "org.contikios.cooja.interfaces.Battery", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiVib", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiMoteID", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiRS232", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiBeeper", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiRadio", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiButton", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiPIR", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiClock", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiLED", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiCFS", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.contikimote.interfaces.ContikiEEPROM", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.interfaces.Position", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.interfaces.IPAddress", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.interfaces.Mote2MoteRelations", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.interfaces.MoteAttributes", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspClock", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspMoteID", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspButton", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.SkyButton", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.SkyFlash", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.SkyCoffeeFilesystem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.Msp802154Radio", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.Msp802154BitErrorRadio", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspDefaultSerial", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspSerial", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspLED", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.MspDebugOutput", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.SkyTemperature", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.CC1101Radio", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.CC1120Radio", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.UsciA1Serial", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.mspmote.interfaces.Exp5438LED", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "se.sics.mspsim.cli.CommandHandler", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "se.sics.mspsim.cli.StreamCommandHandler", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.BaseRSSIconf", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.BufferListener", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.DGRMConfigurator", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.LogListener", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.Mobility", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.MoteInformation", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.MoteInterfaceViewer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.Notes", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.PowerTracker", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.RadioLogger", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.ScriptRunner", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.TimeLine", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.VariableWatcher", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.Visualizer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.VisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.FragHeadPacketAnalyzer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.ICMPv6Analyzer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.IEEE802154Analyzer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.IPHCPacketAnalyzer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.IPv6PacketAnalyzer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.PacketAnalyzer", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.PcapExporter", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.analyzers.RadioLoggerAnalyzerSuite", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.AddressVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.AttributeVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.DGRMVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.GridVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.IDVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.LEDVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.LogisticLossVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.LogVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.MoteTypeVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.PositionVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.TrafficVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + }, + { + "name" : "org.contikios.cooja.plugins.skins.UDGMVisualizerSkin", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true + } +] diff --git a/settings.gradle b/settings.gradle index 565e0a59c..a6f7402b6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,9 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + } +} plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' }