Skip to content

Commit

Permalink
create BaselineProfileProvider to propagate baseline-prof.txt up to a…
Browse files Browse the repository at this point in the history
…ndroid_binary and expose it to Starlark.

PiperOrigin-RevId: 438680646
  • Loading branch information
Googler authored and copybara-github committed Mar 31, 2022
1 parent c74b69e commit 397f108
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -391,7 +392,8 @@ public void init(ConfiguredRuleClassProvider.Builder builder) {
AndroidLibraryResourceClassJarProvider.PROVIDER,
AndroidFeatureFlagSetProvider.PROVIDER,
ProguardMappingProvider.PROVIDER,
AndroidBinaryDataInfo.PROVIDER);
AndroidBinaryDataInfo.PROVIDER,
BaselineProfileProvider.PROVIDER);
builder.addStarlarkBootstrap(bootstrap);

try {
Expand Down
Original file line number Diff line number Diff line change
@@ -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"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ public AndroidBootstrap(
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();
Expand All @@ -80,6 +81,7 @@ public AndroidBootstrap(
builder.put(AndroidFeatureFlagSetProviderApi.NAME, androidFeatureFlagSetProviderApiProvider);
builder.put(ProguardMappingProviderApi.NAME, proguardMappingProviderApiProvider);
builder.put(AndroidBinaryDataInfoApi.NAME, androidBinaryDataInfoProvider);
builder.put(BaselineProfileProviderApi.NAME, baselineProfileProvider);
providers = builder.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit 397f108

Please sign in to comment.