/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ def libLicense = properties.libLicense def libLicenseUrl = properties.libLicenseUrl def libRepositoryName = properties.libRepositoryName def libProjectName = properties.libProjectName def libUrl = properties.libUrl def libVcsUrl = properties.libVcsUrl // If using jnaForTestConfiguration or variantWithoutLib, // please also update the corresponding .buildconfig-android.yml // `publishedArtifacts` property. ext.configurePublish = { jnaForTestConfiguration = null, variantWithoutLib = null -> def theGroupId = rootProject.ext.library.groupId def theArtifactId = project.ext.artifactId def theDescription = project.ext.description // `jnaForTestConfiguration` is a hacky way to say yes, I'm using JNA and // want to pack the JNA dispatch libraries and my Rust libraries into a // single JAR for use in unit tests that run on a development host (and not // an Android target device). We extract the JNA libraries and our local // Rust libraries and stick them into a JAR that consumers augment their // test configuration with. // // `variantWithoutLib` says to publish an AAR that doesn't have native Rust // libraries packed into it. Such an AAR will be aggregated into another // Maven publication that has a single megazord Rust library that provides // the native code functionality. if (jnaForTestConfiguration != null) { task extractJnaResources(type: Sync) { dependsOn jnaForTestConfiguration from { // Defer the resolution of the configuration. This helps to // avoid a nasty issue with the Android-Gradle plugin 3.2.1, // like `Cannot change attributes of configuration // ':PROJECT:kapt' after it has been resolved`. zipTree(jnaForTestConfiguration.singleFile) } into "${buildDir}/jnaResources/" eachFile { FileCopyDetails fcp -> // The intention is to just keep the various `*jnidispatch.*` files. if (fcp.relativePath.pathString.startsWith("META-INFO") || fcp.relativePath.pathString.endsWith(".class")) { fcp.exclude() } } includeEmptyDirs false } def forUnitTestsJarTask = task forUnitTestsJar(type: Jar) { from extractJnaResources from "$buildDir/rustJniLibs/desktop" from "$buildDir/nativeLibs/desktop" } project.afterEvaluate { def copyNativeLibsTask = tasks.findByName("copyNativeLibs") if (copyNativeLibsTask != null) { forUnitTestsJarTask.dependsOn(copyNativeLibsTask) } forUnitTestsJarTask.dependsOn(tasks["cargoBuild"]) } } task sourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs classifier = 'sources' } task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) } task javadocJar(type: Jar, dependsOn: javadoc) { classifier = 'javadoc' from javadoc.destinationDir } publishing { publications { aar(MavenPublication) { project.afterEvaluate { from components.findByName("androidRelease") } artifact sourcesJar // Can't publish Javadoc yet: fxaclient isn't well behaved. // artifact javadocJar // If this goes haywire with // 'Cannot configure the 'publishing' extension after it has been accessed.', // see https://github.com/researchgate/gradle-release/issues/125 and // https://stackoverflow.com/q/28020520. pom { groupId = theGroupId artifactId = theArtifactId description = theDescription version = rootProject.ext.library.version licenses { license { name = libLicense url = libLicenseUrl } } developers { developer { name = 'Firefox Telemetry' email = 'glean-team@mozilla.com' } } scm { connection = libVcsUrl developerConnection = libVcsUrl url = libUrl } } if (variantWithoutLib != null) { // If we are publishing a `-withoutLib` publication, we // never want to choose the real one when a parent project // has us as a child `project()` dependency. alias = true } } if (variantWithoutLib != null) { aarWithoutLib(MavenPublication) { project.afterEvaluate { from components.findByName(variantWithoutLib) } artifact sourcesJar // Can't publish Javadoc yet: fxaclient isn't well behaved. // artifact javadocJar pom { groupId = theGroupId artifactId = "${theArtifactId}-withoutLib" description = theDescription version = rootProject.ext.library.version licenses { license { name = properties.libLicense url = properties.libLicenseUrl } } developers { developer { name = 'Firefox Telemetry' email = 'glean-team@mozilla.com' } } scm { connection = properties.libVcsUrl developerConnection = properties.libVcsUrl url = properties.libUrl } } } } if (jnaForTestConfiguration != null) { forUnitTestsJar(MavenPublication) { artifact tasks['forUnitTestsJar'] pom { groupId = theGroupId artifactId = "${theArtifactId}-forUnitTests" description = theDescription version = rootProject.ext.library.version licenses { license { name = libLicense url = libLicenseUrl } } developers { developer { name = 'Firefox Telemetry' email = 'glean-team@mozilla.com' } } scm { connection = libVcsUrl developerConnection = libVcsUrl url = libUrl } } // This is never the publication we want to use when publishing a // parent project with us as a child `project()` dependency. alias = true } } } } task zipMavenArtifacts publishing.publications.withType(MavenPublication).each {publication -> def zipTask = task "zipMavenArtifact-${publication.artifactId}"(type: Zip) { from "${project.buildDir}/maven" include "**/${publication.artifactId}/**/*.aar" include "**/${publication.artifactId}/**/*.md5" include "**/${publication.artifactId}/**/*.sha1" include "**/${publication.artifactId}/**/*.pom" include "**/${publication.artifactId}/**/*.jar" // Metadata is generated by maven.mozilla.org directly exclude '**/*maven-metadata.xml*' archiveName "${publication.artifactId}.maven.zip" includeEmptyDirs = false destinationDir(file("${project.buildDir}")) } zipMavenArtifacts.dependsOn(zipTask) } }