Skip to content

Commit

Permalink
[maintenance] android features are enabled only if rules_android ar…
Browse files Browse the repository at this point in the history
…e in `enabled_rules`

one more usage

[maintenance] android features are enabled only if `rules_android` are in `enabled_rules`


Merge-request: BAZEL-MR-961
Merged-by: Marcin Abramowicz <marcin.abramowicz@jetbrains.com>
  • Loading branch information
abrams27 authored and Space Team committed Mar 25, 2024
1 parent 774e427 commit 33daf98
Show file tree
Hide file tree
Showing 10 changed files with 442 additions and 309 deletions.
665 changes: 386 additions & 279 deletions MODULE.bazel.lock

Large diffs are not rendered by default.

Expand Up @@ -93,3 +93,6 @@ class WorkspaceContextConstructor(workspaceRoot: Path) : ExecutionContextConstru
)
}
}

val WorkspaceContext.isAndroidEnabled: Boolean
get() = "rules_android" in enabledRules.values
Expand Up @@ -48,26 +48,26 @@ class BazelBspAspectsManager(
targetSpecs: TargetsSpec,
aspect: String,
outputGroups: List<String>,
isAndroidEnabled: Boolean,
): BazelBspAspectsManagerResult {
if (targetSpecs.values.isEmpty()) return BazelBspAspectsManagerResult(BepOutput(), isFailure = false)
val androidFlags = listOf(experimentalGoogleLegacyApi(), experimentalEnableAndroidMigrationApis())
val defaultFlags = listOf(
repositoryOverride(Constants.ASPECT_REPOSITORY, aspectsResolver.bazelBspRoot),
aspect(aspectsResolver.resolveLabel(aspect)),
outputGroups(outputGroups),
keepGoing(),
color(true),
buildManualTests(),
curses(false),
)
val flagsToUse = defaultFlags + if (isAndroidEnabled) androidFlags else emptyList()

return if (targetSpecs.values.isEmpty()) BazelBspAspectsManagerResult(BepOutput(), isFailure = false)
else bazelBspCompilationManager
return bazelBspCompilationManager
.buildTargetsWithBep(
cancelChecker,
targetSpecs,
listOf(
repositoryOverride(
Constants.ASPECT_REPOSITORY, aspectsResolver.bazelBspRoot
),
aspect(aspectsResolver.resolveLabel(aspect)),
outputGroups(outputGroups),
keepGoing(),
color(true),
buildManualTests(),
curses(false),
experimentalGoogleLegacyApi(),
experimentalEnableAndroidMigrationApis(),
),
flagsToUse,
null,
// Setting `CARGO_BAZEL_REPIN=1` updates `cargo_lockfile`
// (`Cargo.lock` file) based on dependencies specified in `manifest`
Expand Down
Expand Up @@ -21,14 +21,19 @@ class BazelBspCompilationManager(
val workspaceRoot: Path,
) {
fun buildTargetsWithBep(
cancelChecker: CancelChecker, targetSpecs: TargetsSpec, originId: String,
cancelChecker: CancelChecker, targetSpecs: TargetsSpec, originId: String, isAndroidEnabled: Boolean,
): BepBuildResult {
val androidFlags = listOf(
experimentalGoogleLegacyApi(),
experimentalEnableAndroidMigrationApis()
)
val flagsToUse = if (isAndroidEnabled) androidFlags else emptyList()
return buildTargetsWithBep(
cancelChecker, targetSpecs,
listOf(
experimentalGoogleLegacyApi(),
experimentalEnableAndroidMigrationApis()
), originId, emptyList()
cancelChecker = cancelChecker,
targetSpecs = targetSpecs,
extraFlags = flagsToUse,
originId = originId,
environment = emptyList(),
)
}

Expand Down
Expand Up @@ -16,7 +16,7 @@ enum class Language(private val fileName: String, val ruleNames: List<String>, v
Cpp("//aspects:rules/cpp/cpp_info.bzl", listOf("rules_cc"), listOf("extract_cpp_info"), false),
Kotlin("//aspects:rules/kt/kt_info.bzl", listOf("io_bazel_rules_kotlin", "rules_kotlin"), listOf("extract_kotlin_info"), true),
Rust("//aspects:rules/rust/rust_info.bzl", listOf("rules_rust"), listOf("extract_rust_crate_info"), false),
Android("//aspects:rules/android/android_info.bzl", listOf(), listOf("extract_android_info", "extract_android_aar_import_info"), false);
Android("//aspects:rules/android/android_info.bzl", listOf("rules_android"), listOf("extract_android_info", "extract_android_aar_import_info"), false);

fun toLoadStatement(): String =
this.functions.joinToString(
Expand Down
Expand Up @@ -46,7 +46,9 @@ class BazelWorkspaceExternalRulesQueryImpl(private val bazelRunner: BazelRunner)
log.warn("Bazel query failed with output: '${result.stderr.escapeNewLines()}'")
null
} else result.stdout.readXML(log)?.calculateEligibleRules()
} ?: listOf()
}
?.filterNot { "android" in it }
.orEmpty()

private fun Document.calculateEligibleRules(): List<String> {
val xPath = XPathFactory.newInstance().newXPath()
Expand Down Expand Up @@ -81,6 +83,7 @@ class BazelBzlModExternalRulesQueryImpl(private val bazelRunner: BazelRunner) :
return jsonElement.extractValuesFromKey("key")
.map { it.substringBefore('@') } // the element has the format <DEP_NAME>@<DEP_VERSION>
.distinct()
.filterNot { "android" in it }
}

companion object {
Expand Down
Expand Up @@ -91,7 +91,7 @@ class BazelProjectMapper(
createModules(targetsToImport, dependencyGraph, concatenateMaps(librariesFromDeps, extraLibrariesFromJdeps))
}
val mergedModulesFromBazel = measure("Merge Kotlin Android modules") {
kotlinAndroidModulesMerger.mergeKotlinAndroidModules(modulesFromBazel)
kotlinAndroidModulesMerger.mergeKotlinAndroidModules(modulesFromBazel, workspaceContext)
}
val sourceToTarget = measure("Build reverse sources") {
buildReverseSourceMapping(mergedModulesFromBazel)
Expand Down
Expand Up @@ -35,8 +35,10 @@ import org.jetbrains.bsp.bazel.server.sync.BspMappings.toBspId
import org.jetbrains.bsp.bazel.server.sync.languages.android.AdditionalAndroidBuildTargetsQuery.additionalAndroidBuildTargetsQuery
import org.jetbrains.bsp.bazel.server.sync.model.Module
import org.jetbrains.bsp.bazel.server.sync.model.Tag
import org.jetbrains.bsp.bazel.workspacecontext.DefaultWorkspaceContextProvider
import org.jetbrains.bsp.bazel.workspacecontext.TargetsSpec
import org.jetbrains.bsp.bazel.workspacecontext.WorkspaceContextProvider
import org.jetbrains.bsp.bazel.workspacecontext.isAndroidEnabled

class ExecuteService(
private val compilationManager: BazelBspCompilationManager,
Expand Down Expand Up @@ -169,17 +171,23 @@ class ExecuteService(
private fun build(cancelChecker: CancelChecker, bspIds: List<BuildTargetIdentifier>, originId: String): BazelProcessResult {
val targets = bspIds + getAdditionalBuildTargets(cancelChecker, bspIds)
val targetsSpec = TargetsSpec(targets, emptyList())
val isAndroidEnabled = workspaceContextProvider.currentWorkspaceContext().isAndroidEnabled
return compilationManager.buildTargetsWithBep(
cancelChecker,
targetsSpec,
originId
cancelChecker = cancelChecker,
targetSpecs = targetsSpec,
originId = originId,
isAndroidEnabled = isAndroidEnabled,
).processResult
}

private fun getAdditionalBuildTargets(
cancelChecker: CancelChecker,
bspIds: List<BuildTargetIdentifier>,
): List<BuildTargetIdentifier> = additionalAndroidBuildTargetsQuery(bspIds, bazelRunner, cancelChecker)
): List<BuildTargetIdentifier> {
val workspaceContext = workspaceContextProvider.currentWorkspaceContext()

return if (workspaceContext.isAndroidEnabled) additionalAndroidBuildTargetsQuery(bspIds, bazelRunner, cancelChecker) else emptyList()
}

private fun selectTargets(cancelChecker: CancelChecker, targets: List<BuildTargetIdentifier>): List<BuildTargetIdentifier> =
selectModules(cancelChecker, targets).map { toBspId(it) }
Expand Down
Expand Up @@ -12,6 +12,7 @@ import org.jetbrains.bsp.bazel.server.bsp.managers.BazelExternalRulesQuery
import org.jetbrains.bsp.bazel.server.sync.model.Project
import org.jetbrains.bsp.bazel.workspacecontext.WorkspaceContext
import org.jetbrains.bsp.bazel.workspacecontext.WorkspaceContextProvider
import org.jetbrains.bsp.bazel.workspacecontext.isAndroidEnabled

/** Responsible for querying bazel and constructing Project instance */
class ProjectResolver(
Expand Down Expand Up @@ -84,7 +85,8 @@ class ProjectResolver(
cancelChecker,
workspaceContext.targets,
ASPECT_NAME,
outputGroups
outputGroups,
workspaceContext.isAndroidEnabled,
)
}

Expand Down
Expand Up @@ -3,6 +3,8 @@ package org.jetbrains.bsp.bazel.server.sync.languages.android
import org.jetbrains.bsp.bazel.server.sync.languages.jvm.javaModule
import org.jetbrains.bsp.bazel.server.sync.languages.kotlin.KotlinModule
import org.jetbrains.bsp.bazel.server.sync.model.Module
import org.jetbrains.bsp.bazel.workspacecontext.WorkspaceContext
import org.jetbrains.bsp.bazel.workspacecontext.isAndroidEnabled

/**
* kt_android_library/kt_android_local_test with the name `foo` actually produces three targets:
Expand All @@ -19,7 +21,10 @@ import org.jetbrains.bsp.bazel.server.sync.model.Module
* Also see [Android Kotlin rules implementation](https://github.com/bazelbuild/rules_kotlin/blob/a675511fdbee743c09d537c2dddfb349981ae70b/kotlin/internal/jvm/android.bzl).
*/
class KotlinAndroidModulesMerger {
fun mergeKotlinAndroidModules(modules: List<Module>): List<Module> {
fun mergeKotlinAndroidModules(modules: List<Module>, workspaceContext: WorkspaceContext): List<Module> =
if (workspaceContext.isAndroidEnabled) doMergeKotlinAndroidModules(modules) else modules

private fun doMergeKotlinAndroidModules(modules: List<Module>): List<Module> {
val moduleById = modules.associateBy { it.label.value }

val mergedKotlinAndroidModules = modules.mapNotNull { parentModule ->
Expand Down

0 comments on commit 33daf98

Please sign in to comment.