// Copyright 2015 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.cpp; 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.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.util.FileType; /** * A helper class that filters a given list of source files into different buckets - shared * libraries, static libraries, pic object files, and non-pic object files. */ public final class PrecompiledFiles { /** The Artifacts from srcs. */ private final ImmutableList files; /** * Initializes this object with the artifacts obtained from the "srcs" attribute of the given * rule (this is the most common usage for this class). */ public PrecompiledFiles(RuleContext ruleContext) { if (ruleContext.attributes().has("srcs", BuildType.LABEL_LIST)) { this.files = ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); } else { this.files = ImmutableList.of(); } } public Iterable getLibraries() { return FileType.filter(files, CppFileTypes.ARCHIVE, CppFileTypes.PIC_ARCHIVE, CppFileTypes.ALWAYS_LINK_LIBRARY, CppFileTypes.ALWAYS_LINK_PIC_LIBRARY, CppFileTypes.SHARED_LIBRARY, CppFileTypes.VERSIONED_SHARED_LIBRARY); } public Iterable getSharedLibraries() { return getSharedLibrariesFrom(files); } static Iterable getSharedLibrariesFrom(Iterable collection) { return FileType.filter(collection, CppFileTypes.SHARED_LIBRARY, CppFileTypes.VERSIONED_SHARED_LIBRARY); } public Iterable getStaticLibraries() { return FileType.filter(files, CppFileTypes.ARCHIVE); } public Iterable getAlwayslinkStaticLibraries() { return FileType.filter(files, CppFileTypes.ALWAYS_LINK_LIBRARY); } public Iterable getPicStaticLibraries() { return FileType.filter(files, CppFileTypes.PIC_ARCHIVE); } public Iterable getPicAlwayslinkLibraries() { return FileType.filter(files, CppFileTypes.ALWAYS_LINK_PIC_LIBRARY); } public Iterable getObjectFiles(final boolean usePic) { if (usePic) { return Iterables.filter( files, artifact -> { String filename = artifact.getExecPathString(); // For compatibility with existing BUILD files, any ".o" files listed // in srcs are assumed to be position-independent code, or // at least suitable for inclusion in shared libraries, unless they // end with ".nopic.o". (The ".nopic.o" extension is an undocumented // feature to give users at least some control over this.) Note that // some target platforms do not require shared library code to be PIC. return CppFileTypes.PIC_OBJECT_FILE.matches(filename) || (CppFileTypes.OBJECT_FILE.matches(filename) && !filename.endsWith(".nopic.o")); }); } else { return FileType.filter(files, CppFileTypes.OBJECT_FILE); } } }