From 8825da6a7abf0c2b7a47c9ce667d7aa3fe1edb51 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Tue, 5 Sep 2023 14:05:12 +0200 Subject: [PATCH] Publish Gradle Metadata with variants and attributes --- build.gradle | 105 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/build.gradle b/build.gradle index 84392946092..851c9ab533f 100644 --- a/build.gradle +++ b/build.gradle @@ -1671,7 +1671,7 @@ void addJSL(Project project, String name, String pkg, List addExports, C } -void addMavenPublication(Project project, List projectDependencies) { +void addMavenPublication(Project project) { if (!IS_MAVEN_PUBLISH) { return } @@ -1682,6 +1682,8 @@ void addMavenPublication(Project project, List projectDependencies) { project.version = MAVEN_VERSION if (project.name == 'base') { + // The 'Parent POM' publication required only for Maven profiles. + // This is ignored by Gradle consumers as they use the Gradle metadata (.module) files. project.publishing { publications { javafx(MavenPublication) { @@ -1723,40 +1725,71 @@ void addMavenPublication(Project project, List projectDependencies) { } compileTargets { t -> + def os = t.name + def arch, classifierSuffix + if (ARCH_NAME == 'x64') { + arch = MachineArchitecture.X86_64 + classifierSuffix = '' + } else if (ARCH_NAME == 'aarch64') { + arch = MachineArchitecture.ARM64 + classifierSuffix = '-aarch64' + } else { + fail("Publishing only configured for 'x64' and 'aarch64' architectures") + } + [project.configurations.apiElements, project.configurations.runtimeElements].each { conf -> + conf.outgoing { + variants.create(t.name) { + if (project.hasProperty('buildModule')) { + afterEvaluate { + artifact project.tasks."modularPublicationJar$t.capital" { + archiveClassifier = "$t.name$classifierSuffix" + } + } + } + attributes { + attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(OperatingSystemFamily, os)) + attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(MachineArchitecture, arch)) + } + } + } + project.components.java.withVariantsFromConfiguration(conf) { + // Skip the empty "main" variant for Gradle Metadata + if (!configurationVariant.attributes.contains(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE)) { + skip() + } + } + } + project.publishing { publications { maven(MavenPublication) { + from project.components.java + artifactId = "javafx-${project.name}" afterEvaluate { + // add empty Jar as it will be expected by Maven consumers artifact project.tasks."moduleEmptyPublicationJar$t.capital" - artifact project.tasks."modularPublicationJar$t.capital" { - classifier "$t.name" - } } pom.withXml { - Node parent = asNode().appendNode("parent") + Node parent = new Node(null, "parent") parent.appendNode("groupId", MAVEN_GROUP_ID) parent.appendNode("artifactId", "javafx") parent.appendNode("version", MAVEN_VERSION) + asNode().children().add(4, parent) - Node dependencies = asNode().appendNode("dependencies") + Node dependencies = asNode().getByName("dependencies")[0] + if (!dependencies) { + dependencies = asNode().appendNode("dependencies") + } - Node projectDependencyPlatform = dependencies.appendNode("dependency") + Node projectDependencyPlatform = new Node(null, "dependency") projectDependencyPlatform.appendNode("groupId", MAVEN_GROUP_ID) projectDependencyPlatform.appendNode("artifactId", "javafx-${project.name}") projectDependencyPlatform.appendNode("version", MAVEN_VERSION) projectDependencyPlatform.appendNode("classifier", "\${javafx.platform}") - - if (!projectDependencies.empty) { - projectDependencies.each { dep -> - Node projectDependency = dependencies.appendNode("dependency") - projectDependency.appendNode("groupId", MAVEN_GROUP_ID) - projectDependency.appendNode("artifactId", "javafx-$dep") - projectDependency.appendNode("version", MAVEN_VERSION) - } - } + dependencies.children().add(0, projectDependencyPlatform) } } } @@ -2061,7 +2094,7 @@ allprojects { // All of our projects are java projects - apply plugin: "java" + apply plugin: 'java-library' // Set sourceCompatibility to the target release of Java. Most modules // set compiler.options.release (to the same target version), which will @@ -2212,7 +2245,7 @@ project(":base") { sourceSets.main.java.srcDirs += "$buildDir/gensrc/java" compileJava.dependsOn processVersionInfo - addMavenPublication(project, []) + addMavenPublication(project) addValidateSourceSets(project, sourceSets) } @@ -2252,7 +2285,7 @@ project(":graphics") { dependencies { antlr group: "org.antlr", name: "antlr4", version: "4.7.2", classifier: "complete" testImplementation project(":base").sourceSets.test.output - implementation project(':base') + api project(':base') } project.ext.moduleSourcePath = defaultModuleSourcePath_GraphicsOne @@ -2670,7 +2703,7 @@ project(":graphics") { } } - addMavenPublication(project, [ 'base' ]) + addMavenPublication(project) addValidateSourceSets(project, sourceSets) } @@ -2705,8 +2738,7 @@ project(":controls") { dependencies { testImplementation project(":graphics").sourceSets.test.output testImplementation project(":base").sourceSets.test.output - implementation project(':base') - implementation project(':graphics') + api project(':graphics') } test { @@ -2747,7 +2779,7 @@ project(":controls") { } processShimsResources.dependsOn(copyShimBssTask) - addMavenPublication(project, [ 'graphics' ]) + addMavenPublication(project) addValidateSourceSets(project, sourceSets) } @@ -2791,8 +2823,7 @@ project(":swing") { commonModuleSetup(project, [ 'base', 'graphics', 'swing' ]) dependencies { - implementation project(":base") - implementation project(":graphics") + api project(":graphics") } test { @@ -2800,7 +2831,7 @@ project(":swing") { } if (COMPILE_SWING) { - addMavenPublication(project, [ 'graphics' ]) + addMavenPublication(project) } addValidateSourceSets(project, sourceSets) @@ -2898,8 +2929,7 @@ project(":fxml") { dependencies { testImplementation project(":graphics").sourceSets.test.output testImplementation project(":base").sourceSets.test.output - implementation project(":base") - implementation project(":graphics") + api project(":controls") } test { @@ -2911,7 +2941,7 @@ project(":fxml") { classpath += files("$JDK_HOME/jre/lib/ext/nashorn.jar") } - addMavenPublication(project, [ 'controls' ]) + addMavenPublication(project) addValidateSourceSets(project, sourceSets) } @@ -2950,8 +2980,7 @@ project(":media") { media name: "ffmpeg-5.1.2", ext: "tar.gz" media name: "ffmpeg-6.0", ext: "tar.gz" } - implementation project(":base") - implementation project(":graphics") + api project(":graphics") } compileJava.dependsOn updateCacheIfNeeded @@ -3518,7 +3547,7 @@ project(":media") { } } - addMavenPublication(project, [ 'graphics' ]) + addMavenPublication(project) addValidateSourceSets(project, sourceSets) } @@ -3560,10 +3589,8 @@ project(":web") { def icuFileVersion = icuVersion.replaceAll('\\.', '_') icu name: "icu4c-${icuFileVersion}-data-bin-l", ext: "zip" } - implementation project(":base") - implementation project(":graphics") - implementation project(":controls") - implementation project(":media") + api project(":controls") + api project(":media") testImplementation project(":base").sourceSets.test.output } @@ -3801,7 +3828,7 @@ project(":web") { assemble.dependsOn compileJavaDOMBinding, drtJar } - addMavenPublication(project, [ 'controls', 'media' ]) + addMavenPublication(project) addValidateSourceSets(project, sourceSets) } @@ -5013,10 +5040,10 @@ compileTargets { t -> } } - def modularPublicationJarName = "${moduleName}-${t.name}.jar" def modularPublicationJarTask = project.task("modularPublicationJar${t.capital}", type: Jar, dependsOn: modularEmptyPublicationJarTask) { destinationDirectory = file("${dstModularJarDir}") - archiveFileName = modularPublicationJarName + archiveBaseName = moduleName + archiveClassifier = t.name from srcLibsDir from srcClassesDir }