create BaselineProfileProvider to propagate baseline-prof.txt up to android_binary and expose it to Starlark.
PiperOrigin-RevId: 438680646
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 18792cf..dfa653e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -93,6 +93,7 @@
import com.google.devtools.build.lib.rules.android.AndroidSdkProvider;
import com.google.devtools.build.lib.rules.android.AndroidStarlarkCommon;
import com.google.devtools.build.lib.rules.android.ApkInfo;
+import com.google.devtools.build.lib.rules.android.BaselineProfileProvider;
import com.google.devtools.build.lib.rules.android.DexArchiveAspect;
import com.google.devtools.build.lib.rules.android.ProguardMappingProvider;
import com.google.devtools.build.lib.rules.android.databinding.DataBindingV2Provider;
@@ -391,7 +392,8 @@
AndroidLibraryResourceClassJarProvider.PROVIDER,
AndroidFeatureFlagSetProvider.PROVIDER,
ProguardMappingProvider.PROVIDER,
- AndroidBinaryDataInfo.PROVIDER);
+ AndroidBinaryDataInfo.PROVIDER,
+ BaselineProfileProvider.PROVIDER);
builder.addStarlarkBootstrap(bootstrap);
try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/BaselineProfileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/BaselineProfileProvider.java
new file mode 100644
index 0000000..28af0e6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/BaselineProfileProvider.java
@@ -0,0 +1,78 @@
+// Copyright 2022 The Bazel Authors. All rights reserved.
+//
+// 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.
+package com.google.devtools.build.lib.rules.android;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.BuiltinProvider;
+import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.starlarkbuildapi.android.BaselineProfileProviderApi;
+import net.starlark.java.eval.EvalException;
+
+/** A target that can provide baseline profile files to Android binaries. */
+@Immutable
+public final class BaselineProfileProvider extends NativeInfo
+ implements BaselineProfileProviderApi<Artifact> {
+
+ public static final String PROVIDER_NAME = "BaselineProfileProvider";
+ public static final Provider PROVIDER = new Provider();
+
+ private final NestedSet<Artifact> transitiveBaselineProfiles;
+
+ public BaselineProfileProvider(NestedSet<Artifact> transitiveBaselineProfiles) {
+ this.transitiveBaselineProfiles = transitiveBaselineProfiles;
+ }
+
+ @Override
+ public Provider getProvider() {
+ return PROVIDER;
+ }
+
+ @Override
+ public Depset /*<Artifact>*/ getTransitiveBaselineProfilesForStarlark() {
+ return Depset.of(Artifact.TYPE, transitiveBaselineProfiles);
+ }
+
+ public NestedSet<Artifact> getTransitiveBaselineProfiles() {
+ return transitiveBaselineProfiles;
+ }
+
+ public static BaselineProfileProvider merge(Iterable<BaselineProfileProvider> providers) {
+ NestedSetBuilder<Artifact> files = NestedSetBuilder.stableOrder();
+ for (BaselineProfileProvider wrapper : providers) {
+ files.addTransitive(wrapper.getTransitiveBaselineProfiles());
+ }
+ return new BaselineProfileProvider(files.build());
+ }
+
+ /** Provider class for {@link BaselineProfileProvider} objects. */
+ public static class Provider extends BuiltinProvider<BaselineProfileProvider>
+ implements BaselineProfileProviderApi.Provider<Artifact> {
+ private Provider() {
+ super(PROVIDER_NAME, BaselineProfileProvider.class);
+ }
+
+ public String getName() {
+ return PROVIDER_NAME;
+ }
+
+ @Override
+ public BaselineProfileProvider create(Depset files) throws EvalException {
+ return new BaselineProfileProvider(Depset.cast(files, Artifact.class, "files"));
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
index 5090891..20c220a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
@@ -54,7 +54,8 @@
androidLibraryResourceClassJarProviderApiProvider,
AndroidFeatureFlagSetProviderApi.Provider androidFeatureFlagSetProviderApiProvider,
ProguardMappingProviderApi.Provider<?> proguardMappingProviderApiProvider,
- AndroidBinaryDataInfoApi.Provider<?, ?, ?, ?> androidBinaryDataInfoProvider) {
+ AndroidBinaryDataInfoApi.Provider<?, ?, ?, ?> androidBinaryDataInfoProvider,
+ BaselineProfileProviderApi.Provider<?> baselineProfileProvider) {
this.androidCommon = androidCommon;
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
@@ -80,6 +81,7 @@
builder.put(AndroidFeatureFlagSetProviderApi.NAME, androidFeatureFlagSetProviderApiProvider);
builder.put(ProguardMappingProviderApi.NAME, proguardMappingProviderApiProvider);
builder.put(AndroidBinaryDataInfoApi.NAME, androidBinaryDataInfoProvider);
+ builder.put(BaselineProfileProviderApi.NAME, baselineProfileProvider);
providers = builder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BaselineProfileProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BaselineProfileProviderApi.java
new file mode 100644
index 0000000..eecb7d9
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BaselineProfileProviderApi.java
@@ -0,0 +1,59 @@
+// Copyright 2022 The Bazel Authors. All rights reserved.
+//
+// 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.
+package com.google.devtools.build.lib.starlarkbuildapi.android;
+
+import com.google.devtools.build.docgen.annot.DocCategory;
+import com.google.devtools.build.docgen.annot.StarlarkConstructor;
+import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
+import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
+import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
+import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
+import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+
+/** Provides information about baseline profile for Android binaries. */
+@StarlarkBuiltin(
+ name = "BaselineProfileProvider",
+ doc = "Baseline profile file used for Android binaries.",
+ category = DocCategory.PROVIDER)
+public interface BaselineProfileProviderApi<FileT extends FileApi> extends StructApi {
+
+ String NAME = "BaselineProfileProvider";
+
+ @StarlarkMethod(name = "files", structField = true, doc = "", documented = false)
+ Depset /*<FileT>*/ getTransitiveBaselineProfilesForStarlark();
+
+ /** The provider implementing this can construct the BaselineProfileProvider. */
+ @StarlarkBuiltin(name = "Provider", doc = "", documented = false)
+ interface Provider<FileT extends FileApi> extends ProviderApi {
+
+ @StarlarkMethod(
+ name = NAME,
+ doc = "The <code>BaselineProfileProvider</code> constructor.",
+ parameters = {
+ @Param(
+ name = "files",
+ doc = "Transitive baseline profile files.",
+ positional = true,
+ named = false,
+ allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
+ },
+ selfCall = true)
+ @StarlarkConstructor
+ BaselineProfileProviderApi<FileT> create(Depset files) throws EvalException;
+ }
+}