blob: 471d367ce54658b579b7d727542aabc7c0c4b917 [file] [log] [blame]
// Copyright 2021 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.objc;
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.packages.BuiltinProvider;
import com.google.devtools.build.lib.packages.Provider;
import com.google.devtools.build.lib.packages.StarlarkInfo;
import com.google.devtools.build.lib.packages.StructImpl;
import com.google.devtools.build.lib.rules.cpp.CcInfo;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import net.starlark.java.syntax.Location;
/**
* The providers and artifact outputs returned by the {@code apple_common.link_multi_arch_binary}
* API.
*/
public class AppleLinkingOutputs {
/** Represents an Apple target triplet (arch, platform, env) for a multi-arch target. */
@AutoValue
public abstract static class TargetTriplet {
static TargetTriplet create(String architecture, String platform, String environment) {
return new AutoValue_AppleLinkingOutputs_TargetTriplet(architecture, platform, environment);
}
abstract String architecture();
abstract String platform();
abstract String environment();
/** Returns a Starlark Dict representation of a {@link TargetTriplet} */
public final StructImpl toStarlarkStruct() {
Provider constructor = new BuiltinProvider<StructImpl>("target_triplet", StructImpl.class) {};
HashMap<String, Object> fields = new HashMap<>();
fields.put("architecture", architecture());
fields.put("environment", environment());
fields.put("platform", platform());
return StarlarkInfo.create(constructor, fields, Location.BUILTIN);
}
}
/**
* A set of related platform/architecture-specific outputs generated by {@code
* apple_common.link_multi_arch_binary}.
*/
@AutoValue
public abstract static class LinkingOutput {
abstract TargetTriplet getTargetTriplet();
abstract Artifact getBinary();
@Nullable
abstract Artifact getBitcodeSymbols();
@Nullable
abstract Artifact getDsymBinary();
@Nullable
abstract Artifact getLinkmap();
static LinkingOutput.Builder builder() {
return new AutoValue_AppleLinkingOutputs_LinkingOutput.Builder();
}
/** Builder for {@link LinkingOutput}. */
@AutoValue.Builder
public abstract static class Builder {
abstract Builder setTargetTriplet(TargetTriplet targetTriplet);
abstract Builder setBinary(Artifact binary);
abstract Builder setBitcodeSymbols(Artifact bitcodeSymbols);
abstract Builder setDsymBinary(Artifact dsymBinary);
abstract Builder setLinkmap(Artifact linkmap);
abstract LinkingOutput build();
}
}
private final CcInfo depsCcInfo;
private final ObjcProvider depsObjcProvider;
private final ImmutableList<LinkingOutput> outputs;
private final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
private final AppleDebugOutputsInfo legacyDebugOutputsProvider;
AppleLinkingOutputs(
CcInfo depsCcInfo,
ObjcProvider depsObjcProvider,
ImmutableList<LinkingOutput> outputs,
ImmutableMap<String, NestedSet<Artifact>> outputGroups,
AppleDebugOutputsInfo legacyDebugOutputsProvider) {
this.depsCcInfo = depsCcInfo;
this.depsObjcProvider = depsObjcProvider;
this.outputs = outputs;
this.outputGroups = outputGroups;
this.legacyDebugOutputsProvider = legacyDebugOutputsProvider;
}
/**
* Returns an {@link ObjcProvider} containing information about the transitive dependencies linked
* into the binary.
*/
public ObjcProvider getDepsObjcProvider() {
return depsObjcProvider;
}
/**
* Returns an {@link CcInfo} containing information about the transitive dependencies linked into
* the binary.
*/
public CcInfo getDepsCcInfo() {
return depsCcInfo;
}
/** Returns the list of single-architecture/platform outputs. */
public ImmutableList<LinkingOutput> getOutputs() {
return outputs;
}
/**
* Returns a {@link AppleDebugOutputsInfo} containing debug information about the linked binary.
*/
public AppleDebugOutputsInfo getLegacyDebugOutputsProvider() {
return legacyDebugOutputsProvider;
}
/**
* Returns a map from output group name to set of artifacts belonging to this output group. This
* should be added to configured target information using {@link
* RuleConfiguredTargetBuilder#addOutputGroups(Map)}.
*/
public Map<String, NestedSet<Artifact>> getOutputGroups() {
return outputGroups;
}
/** A builder for {@link AppleBinaryOutput}. */
public static class Builder {
private final ImmutableList.Builder<LinkingOutput> outputs;
private final ImmutableMap.Builder<String, NestedSet<Artifact>> outputGroups;
private ObjcProvider depsObjcProvider;
private CcInfo depsCcInfo;
private AppleDebugOutputsInfo legacyDebugOutputsProvider;
public Builder() {
this.outputs = ImmutableList.builder();
this.outputGroups = ImmutableMap.builder();
}
/** Adds a set of related single-architecture/platform artifacts to the output result. */
@CanIgnoreReturnValue
public Builder addOutput(LinkingOutput output) {
outputs.add(output);
return this;
}
/** Adds a set of output groups to the output result. */
@CanIgnoreReturnValue
public Builder addOutputGroups(Map<String, NestedSet<Artifact>> outputGroupsToAdd) {
outputGroups.putAll(outputGroupsToAdd);
return this;
}
/** Sets the legacy debug outputs provider of the output result. */
@CanIgnoreReturnValue
public Builder setLegacyDebugOutputsProvider(AppleDebugOutputsInfo debugOutputsProvider) {
this.legacyDebugOutputsProvider = debugOutputsProvider;
return this;
}
/**
* Sets the {@link CcInfo} that contains information about transitive dependencies linked into
* the binary.
*/
@CanIgnoreReturnValue
public Builder setDepsCcInfo(CcInfo depsCcInfo) {
this.depsCcInfo = depsCcInfo;
return this;
}
/**
* Sets the {@link ObjcProvider} that contains information about transitive dependencies linked
* into the binary.
*/
@CanIgnoreReturnValue
public Builder setDepsObjcProvider(ObjcProvider depsObjcProvider) {
this.depsObjcProvider = depsObjcProvider;
return this;
}
public AppleLinkingOutputs build() {
return new AppleLinkingOutputs(
depsCcInfo,
depsObjcProvider,
outputs.build(),
outputGroups.buildOrThrow(),
legacyDebugOutputsProvider);
}
}
}