blob: 79b6e07b2d06f821a7147c606cfa0da7050fff4c [file] [log] [blame]
// Copyright 2014 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 static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.COMPILABLE_SRCS_TYPE;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.PRECOMPILED_SRCS_TYPE;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.util.FileType;
import javax.annotation.Nullable;
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkValue;
/**
* Artifacts related to compilation. Any rule containing compilable sources will create an instance
* of this class.
*/
final class CompilationArtifacts implements StarlarkValue {
private final Iterable<Artifact> srcs;
private final Iterable<Artifact> nonArcSrcs;
private final Iterable<Artifact> additionalHdrs;
private final Optional<Artifact> archive;
public CompilationArtifacts() {
this.srcs = ImmutableList.<Artifact>of();
this.nonArcSrcs = ImmutableList.<Artifact>of();
this.additionalHdrs = ImmutableList.<Artifact>of();
this.archive = Optional.absent();
}
public CompilationArtifacts(
RuleContext ruleContext, IntermediateArtifacts intermediateArtifacts) {
this(
ruleContext.getPrerequisiteArtifacts("srcs").list(),
ruleContext.getPrerequisiteArtifacts("non_arc_srcs").list(),
ImmutableList.<Artifact>of(),
intermediateArtifacts);
}
public CompilationArtifacts(
Iterable<Artifact> srcs,
Iterable<Artifact> nonArcSrcs,
Iterable<Artifact> additionalHdrs,
IntermediateArtifacts intermediateArtifacts) {
this.srcs = srcs;
this.nonArcSrcs = nonArcSrcs;
this.additionalHdrs = additionalHdrs;
// Note: the condition under which we set an archive artifact needs to match the condition for
// which we create the archive in compilation_support.bzl. In particular, if srcs are all
// headers, we don't generate an archive.
if (!Iterables.isEmpty(FileType.filter(srcs, COMPILABLE_SRCS_TYPE))
|| !Iterables.isEmpty(FileType.filter(srcs, PRECOMPILED_SRCS_TYPE))
|| Iterables.any(srcs, Artifact::isTreeArtifact)
|| !Iterables.isEmpty(nonArcSrcs)) {
this.archive = Optional.of(intermediateArtifacts.archive());
} else {
this.archive = Optional.absent();
}
}
Iterable<Artifact> getSrcs() {
return srcs;
}
@StarlarkMethod(name = "srcs", documented = false, structField = true)
public Sequence<Artifact> getSrcsForStarlark() {
return StarlarkList.immutableCopyOf(getSrcs());
}
Iterable<Artifact> getNonArcSrcs() {
return nonArcSrcs;
}
@StarlarkMethod(name = "non_arc_srcs", documented = false, structField = true)
public Sequence<Artifact> getNonArcSrcsForStarlark() {
return StarlarkList.immutableCopyOf(getNonArcSrcs());
}
/** Returns the public headers that aren't included in the hdrs attribute. */
Iterable<Artifact> getAdditionalHdrs() {
return additionalHdrs;
}
@StarlarkMethod(name = "additional_hdrs", documented = false, structField = true)
public Sequence<Artifact> getAdditionalHdrsForStarlark() {
return StarlarkList.immutableCopyOf(getAdditionalHdrs());
}
/**
* Returns the output archive library (.a) file created by combining object files of the srcs, non
* arc srcs, and precompiled srcs of this artifact collection. Returns absent if there are no such
* source files for which to create an archive library.
*/
Optional<Artifact> getArchive() {
return archive;
}
@StarlarkMethod(name = "archive", documented = false, allowReturnNones = true, structField = true)
@Nullable
public Artifact getArchiveForStarlark() {
return archive.orNull();
}
}