// Copyright 2016 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.java.proto; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.devtools.build.lib.cmdline.Label.parseAbsoluteUnchecked; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import static com.google.devtools.build.lib.rules.java.proto.JplCcLinkParams.createCcLinkParamsStore; import static com.google.devtools.build.lib.rules.java.proto.StrictDepsUtils.createNonStrictCompilationArgsProvider; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap; import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder; import com.google.devtools.build.lib.analysis.WrappingProvider; import com.google.devtools.build.lib.analysis.config.HostTransition; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.AspectDefinition; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault; import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuntimeInfo; import com.google.devtools.build.lib.rules.java.JavaSemantics; import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider; import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider; import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder; import com.google.devtools.build.lib.rules.proto.ProtoConfiguration; import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider; import com.google.devtools.build.lib.rules.proto.SupportData; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData; import javax.annotation.Nullable; /** An Aspect which JavaLiteProtoLibrary injects to build Java Lite protos. */ public class JavaLiteProtoAspect extends NativeAspectClass implements ConfiguredAspectFactory { public static LabelLateBoundDefault getProtoToolchainLabel(String defaultValue) { return LabelLateBoundDefault.fromTargetConfiguration( ProtoConfiguration.class, Label.parseAbsoluteUnchecked(defaultValue), (rule, attributes, protoConfig) -> protoConfig.protoToolchainForJavaLite()); } private final JavaSemantics javaSemantics; @Nullable private final String jacocoLabel; private final String defaultProtoToolchainLabel; private final LabelLateBoundDefault hostJdkAttribute; private final LabelLateBoundDefault javaToolchainAttribute; public JavaLiteProtoAspect( JavaSemantics javaSemantics, @Nullable String jacocoLabel, String defaultProtoToolchainLabel, LabelLateBoundDefault hostJdkAttribute, LabelLateBoundDefault javaToolchainAttribute) { this.javaSemantics = javaSemantics; this.jacocoLabel = jacocoLabel; this.defaultProtoToolchainLabel = defaultProtoToolchainLabel; this.hostJdkAttribute = hostJdkAttribute; this.javaToolchainAttribute = javaToolchainAttribute; } @Override public ConfiguredAspect create( ConfiguredTargetAndData ctadBase, RuleContext ruleContext, AspectParameters parameters) throws InterruptedException, ActionConflictException { ConfiguredAspect.Builder aspect = new ConfiguredAspect.Builder(this, parameters, ruleContext); // Get SupportData, which is provided by the proto_library rule we attach to. SupportData supportData = checkNotNull(ctadBase.getConfiguredTarget().getProvider(ProtoSupportDataProvider.class)) .getSupportData(); JavaProtoAspectCommon aspectCommon = JavaProtoAspectCommon.getLiteInstance(ruleContext, javaSemantics); Impl impl = new Impl(ruleContext, supportData, aspectCommon); impl.addProviders(aspect); return aspect.build(); } @Override public AspectDefinition getDefinition(AspectParameters aspectParameters) { AspectDefinition.Builder result = new AspectDefinition.Builder(this) .propagateAlongAttribute("deps") .requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class) .requireProviders(ProtoSourcesProvider.class) .advertiseProvider(JavaProtoLibraryAspectProvider.class) .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.PROTO_NAME)) .add( attr(JavaProtoAspectCommon.LITE_PROTO_TOOLCHAIN_ATTR, LABEL) .mandatoryNativeProviders( ImmutableList.>of( ProtoLangToolchainProvider.class)) .value(getProtoToolchainLabel(defaultProtoToolchainLabel))) .add( attr(":host_jdk", LABEL) .cfg(HostTransition.INSTANCE) .value(hostJdkAttribute) .mandatoryProviders(JavaRuntimeInfo.PROVIDER.id())) .add( attr(":java_toolchain", LABEL) .useOutputLicenses() .allowedRuleClasses("java_toolchain") .value(javaToolchainAttribute)); Attribute.Builder