44 * You should have received a copy of the CC0 legalcode along with this
55 * work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
66 */
7+ import groovy.json.JsonOutput
78import groovy.json.JsonSlurper
89import org.graalvm.internal.tck.utils.DynamicAccessUtils
910import org.graalvm.internal.tck.utils.BaseLayerUtils
@@ -398,6 +399,17 @@ Provider<Directory> dedicatedLayerJUnitTestListDirectory = layout.buildDirectory
398399 " native/generated/dedicatedLayerJUnitTestList" )
399400Provider<Directory > dedicatedLayerConfigurationDirectory = layout. buildDirectory. dir(
400401 " native/generated/dedicatedLayerConfiguration" )
402+ Provider<Directory > dedicatedLayerReachabilityMetadataDirectory = layout. buildDirectory. dir(
403+ " native/generated/dedicatedLayerReachabilityMetadata" )
404+
405+ if (dedicatedLayer) {
406+ tasks. named(" processTestResources" ). configure { task ->
407+ task. exclude(" META-INF/native-image/**/reachability-metadata.json" )
408+ }
409+ tasks. named(" generateTestResourcesConfigFile" ). configure { task ->
410+ task. dependsOn(tasks. named(" processTestResources" ))
411+ }
412+ }
401413
402414tasks. register(" generateDedicatedLayerJUnitTestList" ) { task ->
403415 task. setDescription(" Generates engine-root JUnit selectors for the dedicated layer" )
@@ -419,10 +431,70 @@ tasks.register("generateDedicatedLayerJUnitTestList") { task ->
419431 }
420432}
421433
434+ Closure<List<File > > resolveTestReachabilityMetadataFiles = {
435+ return sourceSets. test. resources. srcDirs. collectMany { File resourceDirectory ->
436+ fileTree(resourceDirectory) {
437+ include(" META-INF/native-image/**/reachability-metadata.json" )
438+ }. files
439+ }. unique(). sort { File file -> file. absolutePath }
440+ }
441+
442+ tasks. register(" prepareDedicatedLayerReachabilityMetadata" ) { task ->
443+ task. setDescription(" Prepares test-scoped reachability metadata for dedicated-layer builds" )
444+ task. setGroup(" build" )
445+ task. inputs. files(providers. provider { resolveTestReachabilityMetadataFiles() })
446+ .withPropertyName(" testReachabilityMetadata" )
447+ .withPathSensitivity(PathSensitivity . RELATIVE )
448+ task. outputs. dir(dedicatedLayerReachabilityMetadataDirectory)
449+ task. doLast {
450+ File outputDirectory = dedicatedLayerReachabilityMetadataDirectory. get(). asFile
451+ delete(outputDirectory)
452+ if (! outputDirectory. mkdirs()) {
453+ throw new GradleException (" Failed to create dedicated-layer reachability metadata directory: " +
454+ outputDirectory. absolutePath)
455+ }
456+ resolveTestReachabilityMetadataFiles(). eachWithIndex { File metadataFile , int index ->
457+ File metadataDirectory = new File (outputDirectory, " entry-${ index} " )
458+ if (! metadataDirectory. mkdirs()) {
459+ throw new GradleException (" Failed to create dedicated-layer metadata entry: " +
460+ metadataDirectory. absolutePath)
461+ }
462+ Closure<Object > withoutConditions
463+ withoutConditions = { Object value ->
464+ if (value instanceof Map ) {
465+ Map<String , Object > result = new LinkedHashMap<> ()
466+ value. each { Object key , Object nestedValue ->
467+ if (key != " condition" ) {
468+ result. put(key. toString(), withoutConditions(nestedValue))
469+ }
470+ }
471+ return result
472+ }
473+ if (value instanceof List ) {
474+ return value. collect { Object nestedValue -> withoutConditions(nestedValue) }
475+ }
476+ return value
477+ }
478+ Object metadata = new JsonSlurper (). parse(metadataFile)
479+ String json = JsonOutput . prettyPrint(JsonOutput . toJson(withoutConditions(metadata)))
480+ new File (metadataDirectory, " reachability-metadata.json" ). text =
481+ json + System . lineSeparator()
482+ }
483+ }
484+ }
485+
486+ Closure<List<File > > resolveDedicatedLayerReachabilityMetadataDirectories = {
487+ File outputDirectory = dedicatedLayerReachabilityMetadataDirectory. get(). asFile
488+ return resolveTestReachabilityMetadataFiles(). indices. collect { int index ->
489+ new File (outputDirectory, " entry-${ index} " )
490+ }
491+ }
492+
422493Closure<List<File > > resolveNativeTestConfigurationDirectories = {
423494 Set<File > directories = new LinkedHashSet<> (nativeTestCompileTask. get()
424495 .options. get(). configurationFileDirectories. files)
425496 directories. add(coordinateMetadataDirectory)
497+ directories. addAll(resolveDedicatedLayerReachabilityMetadataDirectories())
426498 return directories. findAll { File directory -> directory. isDirectory() }
427499 .toList()
428500 .sort { File directory -> directory. absolutePath }
@@ -432,6 +504,10 @@ tasks.register("prepareDedicatedLayerConfiguration") { task ->
432504 task. setDescription(" Prepares Native Image configuration for the dedicated layer" )
433505 task. setGroup(" build" )
434506 task. dependsOn(tasks. named(" generateTestResourcesConfigFile" ))
507+ task. dependsOn(tasks. named(" prepareDedicatedLayerReachabilityMetadata" ))
508+ task. inputs. dir(dedicatedLayerReachabilityMetadataDirectory)
509+ .withPropertyName(" dedicatedLayerReachabilityMetadata" )
510+ .withPathSensitivity(PathSensitivity . RELATIVE )
435511 task. outputs. dir(dedicatedLayerConfigurationDirectory)
436512 task. outputs. upToDateWhen { false }
437513 task. doLast {
@@ -812,6 +888,13 @@ graalvmNative {
812888 buildArgs. addAll(nativeTraceBuildArgs)
813889 if (dedicatedLayer) {
814890 buildArgs. add(coordinateMetadataArgument)
891+ buildArgs. addAll(providers. provider {
892+ List<File > metadataDirectories = resolveDedicatedLayerReachabilityMetadataDirectories()
893+ return metadataDirectories. isEmpty() ? [] : [
894+ " -H:ConfigurationFileDirectories=" +
895+ metadataDirectories. collect { File file -> file. absolutePath }. join(" ," )
896+ ]
897+ })
815898 }
816899 if (layeredNativeImage && ! dedicatedLayer) {
817900 buildArgs. addAll([
0 commit comments