[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:
@@ -8,9 +8,6 @@ package org.jetbrains.kotlin
|
||||
|
||||
import org.gradle.api.Project
|
||||
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.propertyList
|
||||
import org.jetbrains.kotlin.konan.properties.saveProperties
|
||||
@@ -22,37 +19,7 @@ import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
import java.nio.file.Path
|
||||
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.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 kotlin.collections.HashSet
|
||||
|
||||
@@ -106,6 +73,9 @@ val kotlinNativeHome
|
||||
val Project.useCustomDist
|
||||
get() = validPropertiesNames.any { hasProperty(it) }
|
||||
|
||||
val Project.nativeBundlesLocation
|
||||
get() = file(findProperty("nativeBundlesLocation") ?: project.projectDir)
|
||||
|
||||
private val libraryRegexp = Regex("""^import\s+platform\.(\S+)\..*$""")
|
||||
fun File.dependencies() =
|
||||
readLines().filter(libraryRegexp::containsMatchIn)
|
||||
|
||||
+140
-20
@@ -26,6 +26,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import org.apache.tools.ant.filters.ReplaceTokens
|
||||
import org.jetbrains.kotlin.UtilsKt
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import plugins.KotlinBuildPublishingPluginKt
|
||||
|
||||
buildscript {
|
||||
apply from: "gradle/kotlinGradlePlugin.gradle"
|
||||
@@ -164,6 +165,8 @@ dependencies {
|
||||
}
|
||||
|
||||
apply plugin: CompilationDatabasePlugin
|
||||
apply plugin: 'maven-publish'
|
||||
apply plugin: BasePlugin
|
||||
|
||||
//task sharedJar {
|
||||
// dependsOn gradle.includedBuild('shared').task(':jar')
|
||||
@@ -181,7 +184,8 @@ task dist_compiler(dependsOn: "distCompiler")
|
||||
task dist_runtime(dependsOn: "distRuntime")
|
||||
task cross_dist(dependsOn: "crossDist")
|
||||
task list_dist(dependsOn: "listDist")
|
||||
task build {
|
||||
|
||||
tasks.named("build") {
|
||||
dependsOn 'dist', 'distPlatformLibs'
|
||||
}
|
||||
|
||||
@@ -541,7 +545,8 @@ task bundle {
|
||||
|
||||
task bundleRegular(type: (isWindows()) ? Zip : Tar) {
|
||||
def simpleOsName = HostManager.platformName()
|
||||
archiveBaseName.set("kotlin-native-$simpleOsName-$konanVersionFull")
|
||||
archiveBaseName.set("kotlin-native-$simpleOsName")
|
||||
archiveVersion.set(konanVersionFull.toString())
|
||||
from(UtilsKt.getKotlinNativeDist(project)) {
|
||||
include '**'
|
||||
exclude 'dependencies'
|
||||
@@ -550,19 +555,20 @@ task bundleRegular(type: (isWindows()) ? Zip : Tar) {
|
||||
exclude 'klib/platform'
|
||||
// Exclude platform libraries caches too. Keep caches for stdlib and endorsed libs.
|
||||
exclude 'klib/cache/*/org.jetbrains.kotlin.native.platform.*/**'
|
||||
into archiveBaseName
|
||||
into "${archiveBaseName.get()}-${archiveVersion.get()}"
|
||||
}
|
||||
}
|
||||
|
||||
task bundlePrebuilt(type: (isWindows()) ? Zip : Tar) {
|
||||
dependsOn("crossDistPlatformLibs")
|
||||
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)) {
|
||||
include '**'
|
||||
exclude 'dependencies'
|
||||
exclude 'klib/testLibrary'
|
||||
into archiveBaseName
|
||||
into "${archiveBaseName.get()}-${archiveVersion.get()}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -572,11 +578,11 @@ void configurePackingLicensesToBundle(AbstractArchiveTask task, boolean contains
|
||||
if (!containsPlatformLibraries || !isMac()) {
|
||||
exclude '**/xcode_license.pdf'
|
||||
}
|
||||
into task.archiveBaseName
|
||||
into "${task.archiveBaseName.get()}-${task.archiveVersion.get()}"
|
||||
}
|
||||
|
||||
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")
|
||||
from(project.projectDir) {
|
||||
include 'RELEASE_NOTES.md'
|
||||
into baseName
|
||||
into "${archiveBaseName.get()}-${archiveVersion.get()}"
|
||||
}
|
||||
|
||||
destinationDirectory.set(file('.'))
|
||||
@@ -608,11 +614,12 @@ task 'tc-dist'(type: (isWindows()) ? Zip : Tar) {
|
||||
dependsOn('dist')
|
||||
dependsOn('distSources')
|
||||
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)) {
|
||||
include '**'
|
||||
exclude 'dependencies'
|
||||
into archiveBaseName
|
||||
into "${archiveBaseName.get()}-${archiveVersion.get()}"
|
||||
}
|
||||
|
||||
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){
|
||||
kotlinVersion = project.kotlinVersion
|
||||
konanVersion = project.ext.kotlinNativeVersion
|
||||
@@ -770,3 +767,126 @@ task "checkStdlibAbiCompatibility"(type: CompareDistributionSignatures) {
|
||||
}
|
||||
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"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user