diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CompilationDatabasePlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CompilationDatabasePlugin.kt index 15f4ad6bef0..d16f17db88a 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CompilationDatabasePlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/CompilationDatabasePlugin.kt @@ -33,9 +33,7 @@ import javax.inject.Inject * target(someTarget1) { * entry { ... } * } - * allTargets { - * mergeFrom(compilationDatabase) - * } + * allTargets {} * } * ``` * Adds an entry for target `someTarget1`, and for each known target merges in databases from `:some:other:project`. @@ -50,12 +48,40 @@ abstract class CompilationDatabaseExtension @Inject constructor(private val proj } } - private val outgoingConfiguration = project.configurations.create("generateCompilationDatabase") { - description = "Generate Compilation Database" + /** + * Bucket of dependencies with compilation databases to merge in. + */ + val compilationDatabase: Configuration by project.configurations.creating { + description = "Compilation Database dependencies" + isCanBeConsumed = false + isCanBeResolved = false + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(USAGE)) + } + } + + /** + * Internal resolvable configuration of compilation database dependencies. + */ + private val compilationDatabaseJSON by project.configurations.creating { + description = "Compilation Database dependencies (internal)" + isCanBeConsumed = false + isCanBeResolved = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(USAGE)) + } + extendsFrom(compilationDatabase) + } + + /** + * Contains produced compilation database. + */ + val compilationDatabaseElements: Configuration by project.configurations.creating { + description = "Compilation Database" isCanBeConsumed = true isCanBeResolved = false attributes { - attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, USAGE)) + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(USAGE)) } } @@ -143,38 +169,24 @@ abstract class CompilationDatabaseExtension @Inject constructor(private val proj }) } - protected abstract val mergeFrom: ListProperty - - /** - * Merge compilation database entries from given [configuration]. - * - * @param configuration provider of additional compilation database entries - */ - fun mergeFrom(configuration: Configuration) { - mergeFrom.add(configuration) - } - /** * Gradle task that generates compilation database for [target] with optional [sanitizer]. */ val task = project.tasks.register("compilationDatabase${_target.name.capitalized}") { description = "Generate compilation database for $_target" group = TASK_GROUP - mergeFiles.from(mergeFrom.map { configurations -> - configurations.map { - it.incoming.artifactView { + mergeFiles.from( + owner.compilationDatabaseJSON.incoming.artifactView { attributes { attribute(TargetWithSanitizer.TARGET_ATTRIBUTE, _target) } - }.files - } - }) + }.files) entries.set(this@Target.entries) outputFile.set(project.layout.buildDirectory.file("$_target/compile_commands.json")) } init { - owner.outgoingConfiguration.outgoing { + owner.compilationDatabaseElements.outgoing { variants { create("$_target") { attributes { @@ -200,23 +212,18 @@ abstract class CompilationDatabaseExtension @Inject constructor(private val proj * Generating [JSON Compilation Database](https://clang.llvm.org/docs/JSONCompilationDatabase.html). * * Creates [CompilationDatabaseExtension] extension named `compilationDatabase`. - * Creates [Configuration][org.gradle.api.artifacts.Configuration] named `compilationDatabase`. + * + * Creates the following [configurations][org.gradle.api.artifacts.Configuration]: + * * `compilationDatabase` - like `implementation` from java or C++ plugin. Bucket of dependencies to get other compilation databases from. + * * `compilationDatabaseElements` - like `apiElements` (sort of) from java plugin or `{variant}LinkElements` from C++ plugin. Contains produced compilation database. * * @see CompilationDatabaseExtension extension that this plugin creates. */ open class CompilationDatabasePlugin : Plugin { override fun apply(project: Project) { - project.extensions.create("compilationDatabase", project) project.dependencies.attributesSchema { attribute(TargetWithSanitizer.TARGET_ATTRIBUTE) } - project.configurations.create("compilationDatabase") { - description = "Compilation Database" - isCanBeConsumed = false - isCanBeResolved = true - attributes { - attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(CompilationDatabaseExtension.USAGE)) - } - } + project.extensions.create("compilationDatabase", project) } } diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index fdf5e483ab2..35168b2cfcf 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -740,11 +740,11 @@ task pusher(type: KotlinBuildPusher){ } compilationDatabase { - allTargets { - mergeFrom(configurations.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