/*
 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */
plugins {
    id 'java-platform'
}

def name = project.name

dependencies {
    constraints {
        rootProject.subprojects.each {
            if (rootProject.ext.unpublished.contains(it.name)) return
            if (it.name == name) return
            if (!it.plugins.hasPlugin('maven-publish')) return
            evaluationDependsOn(it.path)
            it.publishing.publications.all {
                if (it.artifactId.endsWith("-kotlinMultiplatform")) return
                if (it.artifactId.endsWith("-metadata")) return
                // Skip platform artifacts (like *-linuxx64, *-macosx64)
                // It leads to inconsistent bom when publishing from different platforms
                // (e.g. on linux it will include only linuxx64 artifacts and no macosx64)
                // It shouldn't be a problem as usually consumers need to use generic *-native artifact
                // Gradle will choose correct variant by using metadata attributes
                if (it.artifacts.any { it.extension == 'klib' }) return
                api(group: it.groupId, name: it.artifactId, version: it.version)
            }
        }
    }
}

publishing {
    publications {
        mavenBom(MavenPublication) {
            from components.javaPlatform
        }
        // Disable metadata publication
        it.each { pub ->
            pub.moduleDescriptorGenerator = null
            tasks.matching { it.name == "generateMetadataFileFor${pub.name.capitalize()}Publication" }.all {
                onlyIf { false }
            }
        }
    }
}
