// 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.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcSkylarkApiProviderApi; import com.google.devtools.build.lib.vfs.PathFragment; /** * A class that exposes the C++ providers to Skylark. It is intended to provide a simple and stable * interface for Skylark users. */ @AutoCodec public final class CcSkylarkApiProvider extends SkylarkApiProvider implements CcSkylarkApiProviderApi { /** The name of the field in Skylark used to access this class. */ public static final String NAME = "cc"; @Override public NestedSet getTransitiveHeaders() { CcCompilationContext ccCompilationContext = getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContext(); return ccCompilationContext.getDeclaredIncludeSrcs(); } @Override public NestedSet getLibraries() { NestedSetBuilder libs = NestedSetBuilder.linkOrder(); CcLinkingInfo ccLinkingInfo = getInfo().get(CcLinkingInfo.PROVIDER); CcLinkParamsStore ccLinkParams = ccLinkingInfo == null ? null : ccLinkingInfo.getCcLinkParamsStore(); if (ccLinkParams == null) { return libs.build(); } for (LinkerInput lib : ccLinkParams.getCcLinkParams(true, false).getLibraries()) { libs.add(lib.getArtifact()); } return libs.build(); } @Override public ImmutableList getLinkopts() { CcLinkingInfo ccLinkingInfo = getInfo().get(CcLinkingInfo.PROVIDER); CcLinkParamsStore ccLinkParams = ccLinkingInfo == null ? null : ccLinkingInfo.getCcLinkParamsStore(); if (ccLinkParams == null) { return ImmutableList.of(); } return ccLinkParams.getCcLinkParams(true, false).flattenedLinkopts(); } @Override public ImmutableList getDefines() { CcCompilationContext ccCompilationContext = getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContext(); return ccCompilationContext == null ? ImmutableList.of() : ccCompilationContext.getDefines(); } @Override public ImmutableList getSystemIncludeDirs() { CcCompilationContext ccCompilationContext = getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContext(); if (ccCompilationContext == null) { return ImmutableList.of(); } ImmutableList.Builder builder = ImmutableList.builder(); for (PathFragment path : ccCompilationContext.getSystemIncludeDirs()) { builder.add(path.getSafePathString()); } return builder.build(); } @Override public ImmutableList getIncludeDirs() { CcCompilationContext ccCompilationContext = getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContext(); if (ccCompilationContext == null) { return ImmutableList.of(); } ImmutableList.Builder builder = ImmutableList.builder(); for (PathFragment path : ccCompilationContext.getIncludeDirs()) { builder.add(path.getSafePathString()); } return builder.build(); } @Override public ImmutableList getQuoteIncludeDirs() { CcCompilationContext ccCompilationContext = getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContext(); if (ccCompilationContext == null) { return ImmutableList.of(); } ImmutableList.Builder builder = ImmutableList.builder(); for (PathFragment path : ccCompilationContext.getQuoteIncludeDirs()) { builder.add(path.getSafePathString()); } return builder.build(); } @Override public ImmutableList getCcFlags() { CcCompilationContext ccCompilationContext = getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContext(); ImmutableList.Builder options = ImmutableList.builder(); for (String define : ccCompilationContext.getDefines()) { options.add("-D" + define); } for (PathFragment path : ccCompilationContext.getSystemIncludeDirs()) { options.add("-isystem " + path.getSafePathString()); } for (PathFragment path : ccCompilationContext.getIncludeDirs()) { options.add("-I " + path.getSafePathString()); } for (PathFragment path : ccCompilationContext.getQuoteIncludeDirs()) { options.add("-iquote " + path.getSafePathString()); } return options.build(); } }