| /* |
| * Copyright 2010-2017 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import org.jetbrains.kotlin.konan.target.* |
| import org.jetbrains.kotlin.konan.util.* |
| import org.jetbrains.kotlin.CopySamples |
| import org.jetbrains.kotlin.PlatformInfo |
| import org.jetbrains.kotlin.cpp.CompilationDatabasePlugin |
| import org.jetbrains.kotlin.cpp.CppUsage |
| import org.jetbrains.kotlin.cpp.GitClangFormatPlugin |
| import org.jetbrains.kotlin.CompareDistributionSignatures |
| 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 |
| import java.security.MessageDigest |
| |
| buildscript { |
| apply from: "gradle/kotlinGradlePlugin.gradle" |
| |
| repositories { |
| mavenCentral() |
| gradlePluginPortal() |
| } |
| |
| dependencies { |
| classpath 'com.github.johnrengelman:shadow:8.1.1' |
| } |
| } |
| |
| defaultTasks 'clean', 'dist' |
| |
| if (PlatformInfo.isMac()) { |
| PlatformInfo.checkXcodeVersion(project) |
| } |
| |
| apply plugin: "kotlin.native.build-tools-conventions" |
| |
| ext { |
| distDir = UtilsKt.getKotlinNativeDist(project) |
| def konanDataDir = project.hasProperty('konan.data.dir') ? project.property('konan.data.dir').toString() : null |
| dependenciesDir = DependencyDirectories.INSTANCE.getDependenciesRoot(konanDataDir) |
| experimentalEnabled = project.hasProperty("org.jetbrains.kotlin.native.experimentalTargets") |
| platformManager = new PlatformManager(DistributionKt.buildDistribution(projectDir.absolutePath, konanDataDir), |
| ext.experimentalEnabled) |
| |
| cacheableTargetNames = platformManager.hostPlatform.cacheableTargets |
| cacheableTargets = cacheableTargetNames.collect { platformManager.targetByName(it) } |
| |
| // Some targets miss zlib in their sysroots. |
| // We skip these targets when generate a corresponding platform library. |
| // See also: the :distDef task, targetDefFiles in the :platformLibs project. |
| targetsWithoutZlib = [ |
| KonanTarget.LINUX_MIPS32.INSTANCE, |
| KonanTarget.LINUX_MIPSEL32.INSTANCE |
| ] |
| |
| kotlinCompilerModule = project(":kotlin-compiler") |
| kotlinStdLibModule= project(":kotlin-stdlib") |
| |
| // A separate map for each build for automatic cleaning the daemon after the build have finished. |
| toolClassLoadersMap = new ConcurrentHashMap<Object, URLClassLoader>() |
| } |
| |
| allprojects { |
| repositories { |
| mavenCentral() |
| maven { |
| url project.bootstrapKotlinRepo |
| } |
| } |
| |
| setupHostAndTarget() |
| loadCommandLineProperties() |
| loadLocalProperties() |
| setupClang(project) |
| } |
| |
| void setupHostAndTarget() { |
| ext.hostName = platformManager.hostName |
| ext.targetList = EnabledTargetsKt.enabledTargets(platformManager).collect { it.visibleName } as List |
| ext.konanTargetList = EnabledTargetsKt.enabledTargets(platformManager) as List |
| } |
| |
| void setupClang(Project project) { |
| project.extensions.platformManager = project.project(":kotlin-native").ext.platformManager |
| project.extensions.execClang = org.jetbrains.kotlin.ExecClang.create(project) |
| } |
| |
| void loadLocalProperties() { |
| if (new File("$project.rootDir/local.properties").exists()) { |
| Properties props = new Properties() |
| props.load(new FileInputStream("$project.rootDir/local.properties")) |
| props.each { prop -> project.ext.set(prop.key, prop.value) } |
| } |
| } |
| |
| void loadCommandLineProperties() { |
| if (project.hasProperty("konanc_flags")) { |
| throw new Error("Specify either -Ptest_flags or -Pbuild_flags.") |
| } |
| |
| ext.globalBuildArgs = new ArrayList<String>() |
| if (project.hasProperty("build_flags")) { |
| for (String flag : ext.build_flags.toString().split("\\s")) { |
| flag = flag.trim() |
| if (!flag.isEmpty()) ext.globalBuildArgs.add(flag) |
| } |
| } |
| |
| ext.globalTestArgs = new ArrayList<String>() |
| ext.globalTestArgs.add("-Xpartial-linkage=enable") |
| ext.globalTestArgs.add("-Xpartial-linkage-loglevel=error") |
| if (project.hasProperty("test_flags")) { |
| for (String flag : ext.test_flags.toString().split("\\s")) { |
| flag = flag.trim() |
| if (!flag.isEmpty()) ext.globalTestArgs.add(flag) |
| } |
| } |
| |
| ext.testTarget = project.hasProperty("test_target") ? ext.test_target : ext.hostName |
| } |
| |
| configurations { |
| ftpAntTask |
| distPack |
| commonSources |
| |
| runtimeBitcode { |
| canBeConsumed = false |
| canBeResolved = true |
| attributes { |
| attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, CppUsage.LLVM_BITCODE)) |
| } |
| } |
| |
| objcExportApi { |
| canBeConsumed = false |
| canBeResolved = true |
| attributes { |
| attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, CppUsage.API)) |
| } |
| } |
| |
| embeddableJar { |
| canBeConsumed = false |
| canBeResolved = true |
| } |
| } |
| |
| apply plugin: CompilationDatabasePlugin |
| |
| dependencies { |
| ftpAntTask 'org.apache.ant:ant-commons-net:1.9.9' |
| distPack project(':kotlin-native:Interop:Runtime') |
| distPack project(':kotlin-native:Interop:Indexer') |
| distPack project(':kotlin-native:Interop:StubGenerator') |
| distPack project(':kotlin-native:Interop:Skia') |
| distPack project(':kotlin-native:backend.native') |
| distPack project(':native:objcexport-header-generator') |
| distPack project(':native:objcexport-header-generator-k1') |
| distPack project(':native:base') |
| distPack project(':kotlin-native:utilities:cli-runner') |
| distPack project(':kotlin-native:klib') |
| distPack project(path: ':kotlin-native:backend.native', configuration: 'cli_bcApiElements') |
| distPack project(path: ':kotlin-native:endorsedLibraries:kotlinx.cli', configuration: "jvmRuntimeElements") |
| commonSources project(path: ':kotlin-stdlib', configuration: 'metadataSourcesElements') |
| commonSources project(path: ':kotlin-test', configuration: 'metadataSourcesElements') |
| compilationDatabase project(":kotlin-native:common") |
| compilationDatabase project(":kotlin-native:runtime") |
| runtimeBitcode project(":kotlin-native:runtime") |
| objcExportApi project(":kotlin-native:runtime") |
| embeddableJar project(path: ':kotlin-native:prepare:kotlin-native-compiler-embeddable', configuration: 'runtimeElements') |
| } |
| |
| apply plugin: GitClangFormatPlugin |
| apply plugin: 'maven-publish' |
| apply plugin: BasePlugin |
| |
| tasks.register("dist_compiler") { |
| dependsOn("distCompiler") |
| } |
| tasks.register("dist_runtime") { |
| dependsOn("distRuntime") |
| } |
| tasks.register("cross_dist") { |
| dependsOn("crossDist") |
| } |
| tasks.register("list_dist") { |
| dependsOn("listDist") |
| } |
| |
| tasks.named("build") { |
| dependsOn 'dist', 'distPlatformLibs' |
| } |
| |
| tasks.register("distNativeSources", Zip) { |
| dependsOn(configurations.commonSources) |
| duplicatesStrategy = DuplicatesStrategy.FAIL |
| destinationDirectory = file("$distDir/sources") |
| archiveFileName = "kotlin-stdlib-native-sources.zip" |
| |
| includeEmptyDirs = false |
| include('**/*.kt') |
| |
| from { |
| configurations.commonSources |
| .collect { zipTree(it) } |
| .inject { t1, t2 -> t1 + t2 } |
| } |
| into('nativeWasmMain') { |
| from(project(":kotlin-stdlib").file('native-wasm/src/')) |
| } |
| into('nativeMain') { |
| from(project(':kotlin-native:runtime').file('src/main/kotlin')) |
| from(project(':kotlin-native:Interop:Runtime').file('src/main/kotlin')) |
| from(project(':kotlin-native:Interop:Runtime').file('src/native/kotlin')) |
| from(project(':kotlin-native:Interop:JsRuntime').file('src/main/kotlin')) { |
| into('kotlinx/wasm/jsinterop') |
| } |
| } |
| } |
| |
| tasks.register("distSources") { |
| dependsOn(distNativeSources) |
| } |
| |
| tasks.register("shadowJar", ShadowJar) { |
| mergeServiceFiles() |
| destinationDirectory.set(file("$distDir/konan/lib")) |
| archiveBaseName.set("kotlin-native") |
| archiveVersion.set("") |
| archiveClassifier.set("") |
| // Exclude trove4j because of license agreement. |
| exclude "*trove4j*" |
| exclude("META-INF/versions/9/module-info.class") |
| configurations = [project.configurations.distPack] |
| outputs.upToDateWhen { |
| archiveFile.getOrNull()?.asFile?.exists() ?: false |
| } |
| } |
| |
| tasks.register("distCompiler", Copy) { |
| // Workaround: make distCompiler no-op if we are using custom dist: |
| // the dist is already in place and has the compiler, so we don't have to |
| // build and copy the compiler to dist. |
| // Moreover, if we do copy it, it might overwrite the compiler files already loaded |
| // by this Gradle process (including the jar loaded to the custom classloader), |
| // causing hard-to-debug errors. |
| if (!UtilsKt.isDefaultNativeHome(project)) { |
| enabled = false |
| } else { |
| dependsOn ':kotlin-native:shadowJar' |
| dependsOn configurations.embeddableJar |
| } |
| |
| destinationDir distDir |
| |
| from(project(':kotlin-native:backend.native').file("build/nativelibs/$hostName")) { |
| into('konan/nativelib') |
| } |
| |
| from(project(':kotlin-native:backend.native').file('build/external_jars/trove4j.jar')) { |
| into('konan/lib') |
| } |
| |
| from(configurations.embeddableJar) { |
| rename { |
| "kotlin-native-compiler-embeddable.jar" |
| } |
| into("konan/lib") |
| } |
| |
| from(project(':kotlin-native:Interop').file('Indexer/build/nativelibs')) { |
| into('konan/nativelib') |
| } |
| |
| from(project(':kotlin-native:Interop').file('Runtime/build/nativelibs')) { |
| into('konan/nativelib') |
| } |
| |
| from(project(':kotlin-native:libllvmext').file('build/libs/llvmext/shared')) { |
| into('konan/nativelib') |
| } |
| |
| from(project(':kotlin-native:llvmDebugInfoC').file('build/libs/debugInfo/shared')) { |
| into('konan/nativelib') |
| } |
| |
| from(project(':kotlin-native:llvmDebugInfoC').file('src/scripts/konan_lldb.py')) { |
| into('tools') |
| } |
| |
| from(project(':kotlin-native:utilities').file('env_blacklist')) { |
| into('tools') |
| } |
| |
| from(file('cmd')) { |
| fileMode(0755) |
| into('bin') |
| if (!PlatformInfo.isWindows()) { |
| exclude('**/*.bat') |
| } |
| } |
| |
| from(project.file('konan')) { |
| into('konan') |
| exclude('**/*.properties') |
| } |
| |
| from(configurations.objcExportApi) { |
| into('konan/swift_export/kotlin_runtime') |
| } |
| |
| from(project.file('konan')) { |
| into('konan') |
| include('**/*.properties') |
| filter(ReplaceTokens, tokens: [compilerVersion: kotlinVersion]) |
| // Set LLVM variant that will be used by default in the distribution. |
| // `user` - smaller, includes only necessary components. |
| // `dev` - bigger, includes (almost) every possible component. Use this one, |
| // if your feature requires component that is not a part of user distribution (yet). |
| // Note: by default konan.properties use `dev` variant because it is needed for building our LLVM dynamic library. |
| String llvmVariant = 'user' |
| filter(ReplaceTokens, |
| beginToken: '$', |
| endToken: '', |
| tokens: [("llvm.${hostName}.dev".toString()): "\$llvm.${hostName}.${llvmVariant}".toString()] |
| ) |
| } |
| if (experimentalEnabled) { |
| file('konan/experimentalTargetsEnabled').text = "" |
| } else { |
| delete('konan/experimentalTargetsEnabled') |
| } |
| } |
| |
| tasks.register("distDef", Copy) { |
| destinationDir project.file("$distDir/konan/platformDef/") |
| |
| platformManager.targetValues.each { target -> |
| from(project(":kotlin-native:platformLibs").file("src/platform/${target.family.name().toLowerCase()}")) { |
| into target.visibleName |
| include '**/*.def' |
| if (target in targetsWithoutZlib) { |
| exclude '**/zlib.def' |
| } |
| } |
| } |
| } |
| |
| tasks.register("listDist", Exec) { |
| commandLine 'find', distDir |
| } |
| |
| tasks.register("distRuntime", Copy) { |
| dependsOn "${hostName}CrossDistRuntime" |
| } |
| |
| tasks.register("distStdlibCache") { |
| if (hostName in cacheableTargetNames) { |
| dependsOn("${hostName}StdlibCache") |
| } |
| } |
| |
| def stdlib = 'klib/common/stdlib' |
| def stdlibDefaultComponent = "$stdlib/default" |
| |
| tasks.register("distStdlib", Copy) { |
| from(project(":kotlin-native:runtime") |
| .tasks |
| .named("nativeStdlib") |
| .map { it.outputs.files } |
| ) |
| destinationDir project.file("$distDir/$stdlib") |
| } |
| |
| tasks.register("crossDistRuntime") { |
| dependsOn.addAll(targetList.collect { "${it}CrossDistRuntime" }) |
| } |
| |
| tasks.register("crossDistPlatformLibs") { |
| dependsOn.addAll(targetList.collect { "${it}PlatformLibs" }) |
| } |
| |
| tasks.register("crossDistStdlibCache") { |
| dependsOn.addAll(targetList.findAll { it in cacheableTargetNames }.collect { "${it}StdlibCache" }) |
| } |
| |
| targetList.each { target -> |
| tasks.register("${target}CrossDistBitcodeCopy", Copy) { |
| def bitcodeFiles = configurations.runtimeBitcode.incoming.artifactView { |
| attributes { |
| attribute(TargetWithSanitizer.TARGET_ATTRIBUTE, new TargetWithSanitizer(platformManager.targetByName(target), null)) |
| } |
| }.files |
| |
| destinationDir project.file("$distDir/konan/targets/$target/native") |
| |
| from(bitcodeFiles) { |
| include("*.bc") |
| } |
| } |
| |
| tasks.register("${target}CrossDistRuntime", Copy) { |
| dependsOn ":kotlin-native:distStdlib" |
| dependsOn "${target}CrossDistBitcodeCopy" |
| |
| destinationDir project.file("$distDir/$stdlibDefaultComponent") |
| } |
| |
| tasks.register("${target}PlatformLibs") { |
| dependsOn ":kotlin-native:platformLibs:${target}Install" |
| if (target in cacheableTargetNames) { |
| dependsOn(":kotlin-native:platformLibs:${target}Cache") |
| } |
| } |
| |
| if (target in cacheableTargetNames) { |
| tasks.register("${target}StdlibCache", Copy) { |
| dependsOn "distStdlib" |
| dependsOn ":kotlin-native:runtime:${target}StdlibCache" |
| |
| destinationDir project.file("$distDir/klib/cache/") |
| |
| from(project(":kotlin-native:runtime").layout.buildDirectory.dir("cache/$target")) { |
| include('**') |
| } |
| } |
| } |
| |
| tasks.register("${target}CrossDist") { |
| dependsOn "${target}CrossDistRuntime", "distCompiler" |
| if (target in cacheableTargetNames) { |
| dependsOn "${target}StdlibCache" |
| } |
| } |
| } |
| |
| tasks.register("distPlatformLibs") { |
| dependsOn ':kotlin-native:platformLibs:hostInstall' |
| dependsOn ':kotlin-native:platformLibs:hostCache' |
| } |
| |
| tasks.register("dist") { |
| dependsOn "distCompiler", |
| "distRuntime", |
| "distDef", |
| "distStdlib", |
| "distStdlibCache" |
| } |
| |
| tasks.register("crossDist") { |
| dependsOn "distCompiler", |
| "crossDistRuntime", |
| "distDef", |
| "distStdlib", |
| "crossDistStdlibCache" |
| } |
| |
| tasks.register("bundle") { |
| dependsOn 'bundleRegular', 'bundlePrebuilt' |
| } |
| |
| def sbomBundleRegular = SbomKt.configureSbom(project, "BundleRegular", "Kotlin/Native bundle", [].toSet(), null) |
| |
| def sbomBundleRegularForPublish = tasks.register("sbomBundleRegularForPublish", Copy) { |
| dependsOn(sbomBundleRegular) |
| destinationDir = file("$buildDir/spdx/regular") |
| from(sbomBundleRegular.map { it.outputDirectory.file("BundleRegular.spdx.json") }) { |
| rename(".*", "kotlin-native-${HostManager.platformName()}-${kotlinVersion}.spdx.json") |
| } |
| } |
| |
| tasks.register("bundleRegular", (PlatformInfo.isWindows()) ? Zip : Tar) { |
| dependsOn(sbomBundleRegularForPublish) |
| def simpleOsName = HostManager.platformName() |
| archiveBaseName.set("kotlin-native-$simpleOsName") |
| archiveVersion.set(kotlinVersion) |
| from(UtilsKt.getKotlinNativeDist(project)) { |
| include '**' |
| exclude 'dependencies' |
| exclude 'klib/testLibrary' |
| // Don't include platform libraries into the bundle (generate them at the user side instead). |
| exclude 'klib/platform' |
| // Exclude platform libraries caches too. Keep caches for stdlib. |
| exclude 'klib/cache/*/org.jetbrains.kotlin.native.platform.*/**' |
| into "${archiveBaseName.get()}-${archiveVersion.get()}" |
| } |
| } |
| |
| def sbomBundlePrebuilt = SbomKt.configureSbom(project, |
| "BundlePrebuilt", "Kotlin/Native bundle (prebuilt platform libs)", [].toSet(), null) |
| |
| def sbomBundlePrebuiltForPublish = tasks.register("sbomBundlePrebuiltForPublish", Copy) { |
| dependsOn(sbomBundlePrebuilt) |
| destinationDir = file("$buildDir/spdx/prebuilt") |
| from(sbomBundlePrebuilt.map { it.outputDirectory.file("BundlePrebuilt.spdx.json") }) { |
| rename(".*", "kotlin-native-prebuilt-${HostManager.platformName()}-${kotlinVersion}.spdx.json") |
| } |
| } |
| |
| tasks.register("bundlePrebuilt", (PlatformInfo.isWindows()) ? Zip : Tar) { |
| dependsOn(sbomBundlePrebuiltForPublish) |
| dependsOn("crossDistPlatformLibs") |
| def simpleOsName = HostManager.platformName() |
| archiveBaseName.set("kotlin-native-prebuilt-$simpleOsName") |
| archiveVersion.set(kotlinVersion) |
| from(UtilsKt.getKotlinNativeDist(project)) { |
| include '**' |
| exclude 'dependencies' |
| exclude 'klib/testLibrary' |
| into "${archiveBaseName.get()}-${archiveVersion.get()}" |
| } |
| } |
| |
| void configurePackingLicensesToBundle(AbstractArchiveTask task, boolean containsPlatformLibraries) { |
| task.from(project.projectDir) { |
| include 'licenses/**' |
| if (!containsPlatformLibraries || !PlatformInfo.isMac()) { |
| exclude '**/xcode_license.pdf' |
| } |
| if (!containsPlatformLibraries) { |
| exclude '**/mingw-w64-headers_LICENSE.txt' |
| } |
| into "${task.archiveBaseName.get()}-${task.archiveVersion.get()}" |
| } |
| |
| task.from(project.rootProject.file("license")) { |
| into "${task.archiveBaseName.get()}-${task.archiveVersion.get()}/licenses" |
| } |
| } |
| |
| tasks.named("bundleRegular").configure { |
| configurePackingLicensesToBundle(it, /* containsPlatformLibraries = */ false) |
| } |
| tasks.named("bundlePrebuilt").configure { |
| configurePackingLicensesToBundle(it, /* containsPlatformLibraries = */ true) |
| } |
| |
| configure([bundleRegular, bundlePrebuilt]) { |
| dependsOn("crossDist") |
| dependsOn("crossDistStdlibCache") |
| dependsOn("distSources") |
| dependsOn("distDef") |
| |
| destinationDirectory.set(file('.')) |
| |
| if (PlatformInfo.isWindows()) { |
| zip64 true |
| } else { |
| archiveExtension.set('tar.gz') |
| compression = Compression.GZIP |
| } |
| |
| // Calculating SHA-256 checksums for bundle artifacts |
| def archiveExtension = PlatformInfo.isWindows() ? 'zip' : 'tar.gz' |
| def checksumFile = archiveBaseName.zip(archiveVersion) { name, version -> file("${buildDir}/${name}-${version}.${archiveExtension}.sha256") } |
| outputs.file(checksumFile).withPropertyName("checksumFile") |
| |
| doLast { |
| File bundleFile = archiveFile.get().asFile |
| if (bundleFile.exists()) { |
| String checksum = calculateChecksum(bundleFile, "SHA-256") |
| checksumFile.get().write(checksum) |
| } |
| } |
| } |
| |
| def calculateChecksum(File file, String algorithm) { |
| MessageDigest digest = MessageDigest.getInstance(algorithm) |
| FileInputStream fis = new FileInputStream(file) |
| byte[] byteArray = new byte[1024] |
| int bytesCount |
| while ((bytesCount = fis.read(byteArray)) != -1) { |
| digest.update(byteArray, 0, bytesCount) |
| } |
| fis.close() |
| byte[] bytes = digest.digest() |
| |
| StringBuilder sb = new StringBuilder() |
| for (byte aByte : bytes) { |
| sb.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1)) |
| } |
| return sb.toString() |
| } |
| |
| tasks.register("tc-dist", (PlatformInfo.isWindows()) ? Zip : Tar) { |
| dependsOn('dist') |
| dependsOn('distSources') |
| def simpleOsName = HostManager.platformName() |
| archiveBaseName.set("kotlin-native-dist-$simpleOsName") |
| archiveVersion.set(kotlinVersion) |
| from(UtilsKt.getKotlinNativeDist(project)) { |
| include '**' |
| exclude 'dependencies' |
| into "${archiveBaseName.get()}-${archiveVersion.get()}" |
| } |
| |
| destinationDirectory.set(file('.')) |
| |
| if (PlatformInfo.isWindows()) { |
| zip64 true |
| } else { |
| archiveExtension.set('tar.gz') |
| compression = Compression.GZIP |
| } |
| } |
| |
| tasks.register("samples") { |
| dependsOn 'samplesZip', 'samplesTar' |
| } |
| |
| tasks.register("samplesZip", Zip) |
| tasks.register("samplesTar", Tar) { |
| archiveExtension = 'tar.gz' |
| compression = Compression.GZIP |
| } |
| |
| configure([samplesZip, samplesTar]) { |
| archiveBaseName = "kotlin-native-samples-$kotlinVersion" |
| destinationDirectory = projectDir |
| into(archiveBaseName) |
| |
| from(file('samples')) { |
| // Process properties files separately. |
| exclude '**/gradle.properties' |
| } |
| |
| from(project.projectDir) { |
| include 'licenses/**' |
| } |
| |
| from(file('samples')) { |
| include '**/gradle.properties' |
| filter { |
| it.startsWith('org.jetbrains.kotlin.native.home=') || it.startsWith('# Use custom Kotlin/Native home:') ? null : it |
| } |
| filter(org.apache.tools.ant.filters.FixCrLfFilter, "eol": org.apache.tools.ant.filters.FixCrLfFilter.CrLf.newInstance("lf")) |
| } |
| |
| // Exclude build artifacts. |
| exclude '**/build' |
| exclude '**/.gradle' |
| exclude '**/.idea' |
| exclude '**/*.kt.bc-build/' |
| } |
| |
| tasks.register("copy_samples") { |
| dependsOn 'copySamples' |
| } |
| tasks.register("copySamples", CopySamples) { |
| destinationDir file('build/samples-under-test') |
| } |
| |
| compilationDatabase { |
| allTargets {} |
| } |
| |
| // TODO: Replace with a more convenient user-facing task that can build for a specific target. |
| // like compilationDatabase with optional argument --target. |
| tasks.register("compdb", Copy) { |
| from compilationDatabase.hostTarget.task |
| into layout.projectDirectory |
| |
| group = compilationDatabase.TASK_GROUP |
| description = "Copy host compilation database to kotlin-native/" |
| } |
| |
| targetList.each { targetName -> |
| tasks.register("${targetName}CheckPlatformAbiCompatibility", CompareDistributionSignatures) { |
| dependsOn "${targetName}PlatformLibs" |
| |
| libraries = new CompareDistributionSignatures.Libraries.Platform(targetName) |
| if (project.hasProperty("anotherDistro")) { |
| oldDistribution = project.findProperty("anotherDistro") |
| } |
| onMismatchMode = CompareDistributionSignatures.OnMismatchMode.FAIL |
| } |
| } |
| |
| tasks.register("checkStdlibAbiCompatibility", CompareDistributionSignatures) { |
| dependsOn "distRuntime" |
| |
| libraries = CompareDistributionSignatures.Libraries.Standard.INSTANCE |
| if (project.hasProperty("anotherDistro")) { |
| oldDistribution = project.findProperty("anotherDistro") |
| } |
| 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(kotlinVersion)) { |
| 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 layout.buildDirectory |
| 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 = kotlinVersion |
| |
| if (publishBundlesFromLocation) { |
| def bundleArchives = bundlesLocationFiles |
| .findAll { |
| it.name.startsWith("kotlin-native") |
| && !it.name.contains("prebuilt") |
| && (it.name.endsWith("zip") || it.name.endsWith("tar.gz")) |
| } |
| def bundleConfigs = createConfigurations(bundleArchives) |
| bundleConfigs.forEach { target, file -> |
| def archiveExtension = (target.family == Family.MINGW) ? 'zip' : 'tar.gz' |
| mvn.artifact(file) { |
| classifier = platformName(target) |
| extension = archiveExtension |
| } |
| mvn.artifact("${UtilsKt.getNativeBundlesLocation(project)}/kotlin-native-${platformName(target)}-${kotlinVersion}.spdx.json") { |
| classifier = platformName(target) |
| extension = "spdx.json" |
| } |
| } |
| } else { |
| mvn.artifact(bundleRegular) { |
| classifier = HostManager.platformName() |
| extension = (PlatformInfo.isWindows()) ? 'zip' : 'tar.gz' |
| } |
| mvn.artifact(sbomBundleRegular.map { it.outputDirectory.file("BundleRegular.spdx.json") }) { |
| classifier = HostManager.platformName() |
| extension = "spdx.json" |
| } |
| } |
| |
| 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 = kotlinVersion |
| |
| if (publishBundlesFromLocation) { |
| def prebuiltBundleArchives = bundlesLocationFiles |
| .findAll { |
| it.name.startsWith("kotlin-native-prebuilt") |
| && (it.name.endsWith("zip") || it.name.endsWith("tar.gz")) |
| } |
| def bundlePrebuiltConfigs = createConfigurations(prebuiltBundleArchives) |
| bundlePrebuiltConfigs.forEach { target, file -> |
| def archiveExtension = (target.family == Family.MINGW) ? 'zip' : 'tar.gz' |
| mvn.artifact(file) { |
| classifier = platformName(target) |
| extension = archiveExtension |
| } |
| mvn.artifact("${UtilsKt.getNativeBundlesLocation(project)}/kotlin-native-prebuilt-${platformName(target)}-${kotlinVersion}.spdx.json") { |
| classifier = platformName(target) |
| extension = "spdx.json" |
| } |
| } |
| } else { |
| mvn.artifact(bundlePrebuilt) { |
| classifier = HostManager.platformName() |
| extension = (PlatformInfo.isWindows()) ? 'zip' : 'tar.gz' |
| } |
| mvn.artifact(sbomBundlePrebuilt.map { it.outputDirectory.file("BundlePrebuilt.spdx.json") }) { |
| classifier = HostManager.platformName() |
| extension = "spdx.json" |
| } |
| } |
| KotlinBuildPublishingPluginKt.configureKotlinPomAttributes( |
| /* receiver = */ mvn, |
| /* project = */ project, |
| /* explicitDescription = */ "Kotlin/Native bundle (prebuilt platform libs)", |
| /* packaging = */ "pom" |
| ) |
| } |
| } |
| } |