[K/N] Publish bundles to maven

Makes build be able to publish bundles to the maven. It uses common
properties and settings as all other Kotlin publications.
Add usage of the Gradle base plugin and correct version and name setting
for archive tasks
This commit is contained in:
Pavel Punegov
2022-09-12 17:08:09 +02:00
parent 127c5120dd
commit 6b97a7657d
2 changed files with 143 additions and 53 deletions
@@ -8,9 +8,6 @@ package org.jetbrains.kotlin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.tasks.TaskState
import org.gradle.api.logging.LogLevel
import org.gradle.api.tasks.TaskCollection
import org.jetbrains.kotlin.konan.properties.loadProperties import org.jetbrains.kotlin.konan.properties.loadProperties
import org.jetbrains.kotlin.konan.properties.propertyList import org.jetbrains.kotlin.konan.properties.propertyList
import org.jetbrains.kotlin.konan.properties.saveProperties import org.jetbrains.kotlin.konan.properties.saveProperties
@@ -22,37 +19,7 @@ import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.nio.file.Path import java.nio.file.Path
import org.jetbrains.kotlin.konan.file.File as KFile import org.jetbrains.kotlin.konan.file.File as KFile
import org.gradle.nativeplatform.toolchain.internal.*
import org.gradle.nativeplatform.toolchain.plugins.ClangCompilerPlugin
import org.gradle.api.Incubating
import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.NonNullApi
import org.gradle.api.Plugin
import org.gradle.api.internal.file.FileResolver
import org.gradle.api.internal.plugins.PotentialPlugin
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.gradle.internal.operations.BuildOperationExecutor
import org.gradle.internal.os.OperatingSystem
import org.gradle.internal.reflect.Instantiator
import org.gradle.internal.service.ServiceRegistry
import org.gradle.internal.work.WorkerLeaseService
import org.gradle.model.Defaults
import org.gradle.model.RuleSource
import org.gradle.nativeplatform.internal.CompilerOutputFileNamingSchemeFactory
import org.gradle.nativeplatform.platform.internal.NativePlatformInternal
import org.gradle.nativeplatform.plugins.NativeComponentPlugin
import org.gradle.nativeplatform.toolchain.Clang
import org.gradle.nativeplatform.toolchain.internal.clang.ClangToolChain
import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain
import org.gradle.nativeplatform.toolchain.internal.gcc.DefaultGccPlatformToolChain
import org.gradle.nativeplatform.toolchain.internal.gcc.metadata.SystemLibraryDiscovery
import org.gradle.nativeplatform.toolchain.internal.metadata.CompilerMetaDataProviderFactory
import org.gradle.nativeplatform.toolchain.internal.tools.CommandLineToolSearchResult
import org.gradle.nativeplatform.toolchain.internal.tools.GccCommandLineToolConfigurationInternal
import org.gradle.nativeplatform.toolchain.internal.tools.ToolSearchPath
import org.gradle.process.internal.ExecActionFactory
import java.io.ByteArrayOutputStream
import java.net.URI
import java.util.* import java.util.*
import kotlin.collections.HashSet import kotlin.collections.HashSet
@@ -106,6 +73,9 @@ val kotlinNativeHome
val Project.useCustomDist val Project.useCustomDist
get() = validPropertiesNames.any { hasProperty(it) } get() = validPropertiesNames.any { hasProperty(it) }
val Project.nativeBundlesLocation
get() = file(findProperty("nativeBundlesLocation") ?: project.projectDir)
private val libraryRegexp = Regex("""^import\s+platform\.(\S+)\..*$""") private val libraryRegexp = Regex("""^import\s+platform\.(\S+)\..*$""")
fun File.dependencies() = fun File.dependencies() =
readLines().filter(libraryRegexp::containsMatchIn) readLines().filter(libraryRegexp::containsMatchIn)
+140 -20
View File
@@ -26,6 +26,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.apache.tools.ant.filters.ReplaceTokens import org.apache.tools.ant.filters.ReplaceTokens
import org.jetbrains.kotlin.UtilsKt import org.jetbrains.kotlin.UtilsKt
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import plugins.KotlinBuildPublishingPluginKt
buildscript { buildscript {
apply from: "gradle/kotlinGradlePlugin.gradle" apply from: "gradle/kotlinGradlePlugin.gradle"
@@ -164,6 +165,8 @@ dependencies {
} }
apply plugin: CompilationDatabasePlugin apply plugin: CompilationDatabasePlugin
apply plugin: 'maven-publish'
apply plugin: BasePlugin
//task sharedJar { //task sharedJar {
// dependsOn gradle.includedBuild('shared').task(':jar') // dependsOn gradle.includedBuild('shared').task(':jar')
@@ -181,7 +184,8 @@ task dist_compiler(dependsOn: "distCompiler")
task dist_runtime(dependsOn: "distRuntime") task dist_runtime(dependsOn: "distRuntime")
task cross_dist(dependsOn: "crossDist") task cross_dist(dependsOn: "crossDist")
task list_dist(dependsOn: "listDist") task list_dist(dependsOn: "listDist")
task build {
tasks.named("build") {
dependsOn 'dist', 'distPlatformLibs' dependsOn 'dist', 'distPlatformLibs'
} }
@@ -541,7 +545,8 @@ task bundle {
task bundleRegular(type: (isWindows()) ? Zip : Tar) { task bundleRegular(type: (isWindows()) ? Zip : Tar) {
def simpleOsName = HostManager.platformName() def simpleOsName = HostManager.platformName()
archiveBaseName.set("kotlin-native-$simpleOsName-$konanVersionFull") archiveBaseName.set("kotlin-native-$simpleOsName")
archiveVersion.set(konanVersionFull.toString())
from(UtilsKt.getKotlinNativeDist(project)) { from(UtilsKt.getKotlinNativeDist(project)) {
include '**' include '**'
exclude 'dependencies' exclude 'dependencies'
@@ -550,19 +555,20 @@ task bundleRegular(type: (isWindows()) ? Zip : Tar) {
exclude 'klib/platform' exclude 'klib/platform'
// Exclude platform libraries caches too. Keep caches for stdlib and endorsed libs. // Exclude platform libraries caches too. Keep caches for stdlib and endorsed libs.
exclude 'klib/cache/*/org.jetbrains.kotlin.native.platform.*/**' exclude 'klib/cache/*/org.jetbrains.kotlin.native.platform.*/**'
into archiveBaseName into "${archiveBaseName.get()}-${archiveVersion.get()}"
} }
} }
task bundlePrebuilt(type: (isWindows()) ? Zip : Tar) { task bundlePrebuilt(type: (isWindows()) ? Zip : Tar) {
dependsOn("crossDistPlatformLibs") dependsOn("crossDistPlatformLibs")
def simpleOsName = HostManager.platformName() def simpleOsName = HostManager.platformName()
archiveBaseName.set("kotlin-native-prebuilt-$simpleOsName-$konanVersionFull") archiveBaseName.set("kotlin-native-prebuilt-$simpleOsName")
archiveVersion.set(konanVersionFull.toString())
from(UtilsKt.getKotlinNativeDist(project)) { from(UtilsKt.getKotlinNativeDist(project)) {
include '**' include '**'
exclude 'dependencies' exclude 'dependencies'
exclude 'klib/testLibrary' exclude 'klib/testLibrary'
into archiveBaseName into "${archiveBaseName.get()}-${archiveVersion.get()}"
} }
} }
@@ -572,11 +578,11 @@ void configurePackingLicensesToBundle(AbstractArchiveTask task, boolean contains
if (!containsPlatformLibraries || !isMac()) { if (!containsPlatformLibraries || !isMac()) {
exclude '**/xcode_license.pdf' exclude '**/xcode_license.pdf'
} }
into task.archiveBaseName into "${task.archiveBaseName.get()}-${task.archiveVersion.get()}"
} }
task.from(project.rootProject.file("license")) { task.from(project.rootProject.file("license")) {
into "${task.archiveBaseName.get()}/licenses" into "${task.archiveBaseName.get()}-${task.archiveVersion.get()}/licenses"
} }
} }
@@ -591,7 +597,7 @@ configure([bundleRegular, bundlePrebuilt]) {
dependsOn("distDef") dependsOn("distDef")
from(project.projectDir) { from(project.projectDir) {
include 'RELEASE_NOTES.md' include 'RELEASE_NOTES.md'
into baseName into "${archiveBaseName.get()}-${archiveVersion.get()}"
} }
destinationDirectory.set(file('.')) destinationDirectory.set(file('.'))
@@ -608,11 +614,12 @@ task 'tc-dist'(type: (isWindows()) ? Zip : Tar) {
dependsOn('dist') dependsOn('dist')
dependsOn('distSources') dependsOn('distSources')
def simpleOsName = HostManager.platformName() def simpleOsName = HostManager.platformName()
archiveBaseName.set("kotlin-native-dist-$simpleOsName-$konanVersionFull") archiveBaseName.set("kotlin-native-dist-$simpleOsName")
archiveVersion.set(konanVersionFull.toString())
from(UtilsKt.getKotlinNativeDist(project)) { from(UtilsKt.getKotlinNativeDist(project)) {
include '**' include '**'
exclude 'dependencies' exclude 'dependencies'
into archiveBaseName into "${archiveBaseName.get()}-${archiveVersion.get()}"
} }
destinationDirectory.set(file('.')) destinationDirectory.set(file('.'))
@@ -710,16 +717,6 @@ task teamcityCompilerVersion {
} }
} }
task clean(type: Delete) {
dependsOn subprojects.collect { it.tasks.matching { it.name == "clean" } }
doFirst {
delete distDir
delete buildDir
delete bundle.outputs.files
delete "${projectDir}/compile_commands.json"
}
}
task pusher(type: KotlinBuildPusher){ task pusher(type: KotlinBuildPusher){
kotlinVersion = project.kotlinVersion kotlinVersion = project.kotlinVersion
konanVersion = project.ext.kotlinNativeVersion konanVersion = project.ext.kotlinNativeVersion
@@ -770,3 +767,126 @@ task "checkStdlibAbiCompatibility"(type: CompareDistributionSignatures) {
} }
onMismatchMode = CompareDistributionSignatures.OnMismatchMode.FAIL onMismatchMode = CompareDistributionSignatures.OnMismatchMode.FAIL
} }
// FIXME: should be a part of Host/TargetManager
String platformName(KonanTarget target) {
def result
switch (target) {
case KonanTarget.LINUX_X64:
result ="linux-x86_64"
break
case KonanTarget.MACOS_X64:
result = "macos-x86_64"
break
case KonanTarget.MACOS_ARM64:
result = "macos-aarch64"
break
case KonanTarget.MINGW_X64:
result = "windows-x86_64"
break
default:
throw TargetSupportException("Unknown host target")
}
return result
}
Map<KonanTarget, File> createConfigurations(List<File> bundles) {
def hostTargets = platformManager.enabledByHost.keySet()
def result = hostTargets.collectEntries { target ->
[ (target): bundles.find { it.name.contains(platformName(target)) }]
}
result.retainAll { it.value != null }
def missingBundles = hostTargets - result.keySet()
if (!missingBundles.isEmpty()) {
println("Some of the archive bundles are missing for targets $missingBundles:")
println(result)
throw new IllegalArgumentException("Bundle archives are missing for $missingBundles")
}
result.each { target, file ->
if (!file.name.contains(konanVersionFull.toString())) {
throw new IllegalArgumentException("Incorrect version specified for the publish: ${file.name}")
}
}
return result
}
def bundlesLocationFiles = UtilsKt.getNativeBundlesLocation(project)
.listFiles()
.toList()
KotlinBuildPublishingPluginKt.configureDefaultPublishing(
/* receiver = */ project,
/* signingRequired = */ KotlinBuildPublishingPluginKt.getSignLibraryPublication(project)
)
tasks.named("clean", Delete) {
dependsOn subprojects.collect { it.tasks.matching { it.name == "clean" } }
doFirst {
delete distDir
delete buildDir
delete bundle.outputs.files
delete "${projectDir}/compile_commands.json"
}
}
publishing {
publications {
def publishBundlesFromLocation = UtilsKt.getNativeBundlesLocation(project) != project.projectDir
register("Bundle", MavenPublication) { mvn ->
mvn.groupId = project.group.toString()
mvn.artifactId = project.name
mvn.version = konanVersionFull
if (publishBundlesFromLocation) {
def bundleArchives = bundlesLocationFiles
.findAll { it.name.startsWith("kotlin-native") && !it.name.contains("prebuilt") }
def bundleConfigs = createConfigurations(bundleArchives)
bundleConfigs.forEach { target, file ->
mvn.artifact(file) {
classifier = platformName(target)
extension = (target.family == Family.MINGW) ? 'zip' : 'tar.gz'
}
}
} else {
mvn.artifact(bundleRegular) {
classifier = HostManager.platformName()
extension = (isWindows()) ? 'zip' : 'tar.gz'
}
}
KotlinBuildPublishingPluginKt.configureKotlinPomAttributes(
/* receiver = */ mvn,
/* project = */ project,
/* explicitDescription = */ "Kotlin/Native bundle",
/* packaging = */ "pom"
)
}
register("BundlePrebuilt", MavenPublication) { mvn ->
mvn.groupId = project.group.toString()
mvn.artifactId = project.name + "-prebuilt"
mvn.version = konanVersionFull
if (publishBundlesFromLocation) {
def prebuiltBundleArchives = bundlesLocationFiles
.findAll { it.name.startsWith("kotlin-native-prebuilt") }
def bundlePrebuiltConfigs = createConfigurations(prebuiltBundleArchives)
bundlePrebuiltConfigs.forEach { target, file ->
mvn.artifact(file) {
classifier = platformName(target)
extension = (target.family == Family.MINGW) ? 'zip' : 'tar.gz'
}
}
} else {
mvn.artifact(bundlePrebuilt) {
classifier = HostManager.platformName()
extension = (isWindows()) ? 'zip' : 'tar.gz'
}
}
KotlinBuildPublishingPluginKt.configureKotlinPomAttributes(
/* receiver = */ mvn,
/* project = */ project,
/* explicitDescription = */ "Kotlin/Native bundle (prebuilt platform libs)",
/* packaging = */ "pom"
)
}
}
}