aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java107
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java140
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkInfoApi.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java29
-rw-r--r--src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java48
11 files changed, 385 insertions, 24 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
index f4efdad6a6..eb8c6a9a56 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
@@ -22,9 +22,11 @@ import com.google.devtools.build.lib.bazel.rules.cpp.BazelCcLibraryRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCcTestRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses;
import com.google.devtools.build.lib.rules.core.CoreRules;
+import com.google.devtools.build.lib.rules.cpp.CcCompilationInfo;
import com.google.devtools.build.lib.rules.cpp.CcHostToolchainAliasRule;
import com.google.devtools.build.lib.rules.cpp.CcImportRule;
import com.google.devtools.build.lib.rules.cpp.CcLibcTopAlias;
+import com.google.devtools.build.lib.rules.cpp.CcLinkingInfo;
import com.google.devtools.build.lib.rules.cpp.CcModule;
import com.google.devtools.build.lib.rules.cpp.CcToolchainAliasRule;
import com.google.devtools.build.lib.rules.cpp.CcToolchainRule;
@@ -76,6 +78,8 @@ public class CcRules implements RuleSet {
builder.addRuleDefinition(new FdoPrefetchHintsRule());
builder.addSkylarkBootstrap(new CcBootstrap(new CcModule()));
+ builder.addSkylarkAccessibleTopLevels("CcCompilationInfo", CcCompilationInfo.PROVIDER);
+ builder.addSkylarkAccessibleTopLevels("CcLinkingInfo", CcLinkingInfo.PROVIDER);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
index a026a0a1b3..6a7219c68f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
@@ -52,7 +52,9 @@ import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
+import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
import com.google.devtools.build.lib.packages.TriState;
+import com.google.devtools.build.lib.rules.cpp.CcModule.CcSkylarkInfo;
import com.google.devtools.build.lib.rules.cpp.CcToolchain;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
@@ -349,7 +351,9 @@ public class BazelCppRuleClasses {
attr("deps", LABEL_LIST)
.allowedRuleClasses(DEPS_ALLOWED_RULES)
.allowedFileTypes(CppFileTypes.LINKER_SCRIPT)
- .skipAnalysisTimeFileTypeCheck())
+ .skipAnalysisTimeFileTypeCheck()
+ .mandatoryProviders(
+ SkylarkProviderIdentifier.forKey(CcSkylarkInfo.PROVIDER.getKey())))
/*<!-- #BLAZE_RULE($cc_rule).ATTRIBUTE(win_def_file) -->
The Windows DEF file to be passed to linker.
<p>This attribute should only be used when Windows is the target platform.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 0e7eca0a51..baaf365864 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -17,13 +17,24 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
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.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.packages.NativeProvider;
import com.google.devtools.build.lib.packages.Provider;
+import com.google.devtools.build.lib.rules.cpp.CcModule.CcSkylarkInfo;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
+import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcModuleApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcSkylarkInfoApi;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
import com.google.devtools.build.lib.syntax.SkylarkDict;
@@ -33,7 +44,32 @@ import javax.annotation.Nullable;
/** A module that contains Skylark utilities for C++ support. */
public class CcModule
- implements CcModuleApi<CcToolchainProvider, FeatureConfiguration, CcToolchainVariables> {
+ implements CcModuleApi<
+ CcToolchainProvider,
+ FeatureConfiguration,
+ CcToolchainVariables,
+ LibraryToLink,
+ CcLinkParams,
+ CcSkylarkInfo> {
+
+ /**
+ * C++ Skylark rules should have this provider so that native rules can depend on them. This will
+ * eventually go away once b/73921130 is fixed.
+ */
+ @Immutable
+ @AutoCodec
+ public static final class CcSkylarkInfo extends NativeInfo implements CcSkylarkInfoApi {
+ public static final ObjectCodec<CcSkylarkInfo> CODEC = new CcModule_CcSkylarkInfo_AutoCodec();
+
+ public static final NativeProvider<CcSkylarkInfo> PROVIDER =
+ new NativeProvider<CcSkylarkInfo>(CcSkylarkInfo.class, "CcSkylarkInfo") {};
+
+ @AutoCodec.Instantiator
+ @VisibleForSerialization
+ CcSkylarkInfo() {
+ super(PROVIDER);
+ }
+ }
@Override
public Provider getCcToolchainProvider() {
@@ -182,7 +218,7 @@ public class CcModule
}
/** Converts an object that can be the either SkylarkNestedSet or None into NestedSet. */
- protected NestedSet<String> asStringNestedSet(Object o) throws EvalException {
+ protected NestedSet<String> asStringNestedSet(Object o) {
SkylarkNestedSet skylarkNestedSet = convertFromNoneable(o, /* defaultValue= */ null);
if (skylarkNestedSet != null) {
return skylarkNestedSet.getSet(String.class);
@@ -190,4 +226,71 @@ public class CcModule
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
}
+
+ @Override
+ public LibraryToLink createLibraryLinkerInput(
+ SkylarkRuleContext skylarkRuleContext, Artifact library, String skylarkArtifactCategory)
+ throws EvalException {
+ CcCommon.checkRuleWhitelisted(skylarkRuleContext);
+ ArtifactCategory artifactCategory =
+ ArtifactCategory.fromString(
+ skylarkArtifactCategory,
+ skylarkRuleContext.getRuleContext().getRule().getLocation(),
+ "artifact_category");
+ return LinkerInputs.opaqueLibraryToLink(
+ library, artifactCategory, CcLinkingOutputs.libraryIdentifierOf(library));
+ }
+
+ @Override
+ public LibraryToLink createSymlinkLibraryLinkerInput(
+ SkylarkRuleContext skylarkRuleContext, CcToolchainProvider ccToolchain, Artifact library) {
+ Artifact dynamicLibrarySymlink =
+ SolibSymlinkAction.getDynamicLibrarySymlink(
+ skylarkRuleContext.getRuleContext(),
+ ccToolchain.getSolibDirectory(),
+ library,
+ /* preserveName= */ true,
+ /* prefixConsumer= */ true,
+ skylarkRuleContext.getRuleContext().getConfiguration());
+ return LinkerInputs.solibLibraryToLink(
+ dynamicLibrarySymlink, library, CcLinkingOutputs.libraryIdentifierOf(library));
+ }
+
+ @Override
+ public CcLinkParams createCcLinkParams(
+ SkylarkRuleContext skylarkRuleContext,
+ Object skylarkLibrariesToLink,
+ Object skylarkDynamicLibrariesForRuntime,
+ Object skylarkUserLinkFlags)
+ throws EvalException {
+ CcCommon.checkRuleWhitelisted(skylarkRuleContext);
+
+ SkylarkNestedSet librariesToLink = convertFromNoneable(skylarkLibrariesToLink, null);
+ SkylarkNestedSet dynamicLibrariesForRuntime =
+ convertFromNoneable(skylarkDynamicLibrariesForRuntime, null);
+ SkylarkNestedSet userLinkFlags = convertFromNoneable(skylarkUserLinkFlags, null);
+
+ CcLinkParams.Builder builder = CcLinkParams.builder();
+ if (librariesToLink != null) {
+ builder.addLibraries(librariesToLink.toCollection(LibraryToLink.class));
+ }
+ if (dynamicLibrariesForRuntime != null) {
+ builder.addDynamicLibrariesForRuntime(
+ dynamicLibrariesForRuntime.toCollection(Artifact.class));
+ }
+ if (userLinkFlags != null) {
+ builder.addLinkOpts(userLinkFlags.toCollection(String.class));
+ }
+ return builder.build();
+ }
+
+ @Override
+ public CcSkylarkInfo createCcSkylarkInfo(Object skylarkRuleContextObject) throws EvalException {
+ SkylarkRuleContext skylarkRuleContext =
+ convertFromNoneable(skylarkRuleContextObject, /* defaultValue= */ null);
+ if (skylarkRuleContext != null) {
+ CcCommon.checkRuleWhitelisted(skylarkRuleContext);
+ }
+ return new CcSkylarkInfo();
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
index 9cbcf67434..c2da5135bf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
@@ -15,23 +15,19 @@
package com.google.devtools.build.lib.rules.cpp;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.LinkerInputApi;
/**
* Something that appears on the command line of the linker. Since we sometimes expand archive files
* to their constituent object files, we need to keep information whether a certain file contains
* embedded objects and if so, the list of the object files themselves.
*/
-public interface LinkerInput {
+public interface LinkerInput extends LinkerInputApi {
/**
* Returns the type of the linker input.
*/
ArtifactCategory getArtifactCategory();
- /** Returns the artifact that is the input of the linker. */
- @SkylarkCallable(name = "artifact", doc = "Artifact passed to the linker.")
- Artifact getArtifact();
-
/**
* Returns the original library to link. If this library is a solib symlink, returns the
* artifact the symlink points to, otherwise, the library itself.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
index 5997105792..5ccef60859 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
@@ -22,8 +22,7 @@ import com.google.devtools.build.lib.collect.CollectionUtils;
import com.google.devtools.build.lib.concurrent.ThreadSafety;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
/**
* Factory for creating new {@link LinkerInput} objects.
@@ -154,12 +153,7 @@ public abstract class LinkerInputs {
* A library the user can link to. This is different from a simple linker input in that it also
* has a library identifier.
*/
- @SkylarkModule(
- name = "LibraryToLink",
- category = SkylarkModuleCategory.BUILTIN,
- documented = false,
- doc = "A library the user can link to.")
- public interface LibraryToLink extends LinkerInput {
+ public interface LibraryToLink extends LinkerInput, LibraryToLinkApi {
ImmutableMap<Artifact, Artifact> getLtoBitcodeFiles();
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
index 73c5e498a8..f1e3a65c85 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
@@ -14,8 +14,10 @@
package com.google.devtools.build.lib.skylarkbuildapi.cpp;
-
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
import com.google.devtools.build.lib.skylarkinterface.Param;
import com.google.devtools.build.lib.skylarkinterface.ParamType;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -33,7 +35,10 @@ import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
public interface CcModuleApi<
CcToolchainProviderT extends CcToolchainProviderApi,
FeatureConfigurationT extends FeatureConfigurationApi,
- CcToolchainVariablesT extends CcToolchainVariablesApi> {
+ CcToolchainVariablesT extends CcToolchainVariablesApi,
+ LibraryToLinkT extends LibraryToLinkApi,
+ CcLinkParamsT extends CcLinkParamsApi,
+ CcSkylarkInfoT extends CcSkylarkInfoApi> {
@SkylarkCallable(
name = "CcToolchainInfo",
@@ -450,4 +455,135 @@ public interface CcModuleApi<
@SkylarkCallable(name = "empty_variables", documented = false)
CcToolchainVariablesT getVariables();
+
+ @SkylarkCallable(
+ name = "create_library_to_link",
+ documented = false,
+ parameters = {
+ @Param(
+ name = "ctx",
+ doc = "Skylark rule context.",
+ positional = false,
+ named = true,
+ type = SkylarkRuleContext.class),
+ @Param(
+ name = "library",
+ doc = "Library to be linked.",
+ positional = false,
+ named = true,
+ type = Artifact.class),
+ @Param(
+ name = "artifact_category",
+ doc =
+ "Artifact category. Can be: static_library, alwayslink_static_library, "
+ + "dynamic_library or interface_library",
+ positional = false,
+ named = true,
+ type = String.class)
+ })
+ LibraryToLinkT createLibraryLinkerInput(
+ SkylarkRuleContext skylarkRuleContext, Artifact library, String skylarkArtifactCategory)
+ throws EvalException;
+
+ @SkylarkCallable(
+ name = "create_symlink_library_to_link",
+ documented = false,
+ parameters = {
+ @Param(
+ name = "ctx",
+ doc = "Skylark rule context.",
+ positional = false,
+ named = true,
+ type = SkylarkRuleContext.class),
+ @Param(
+ name = "cc_toolchain",
+ doc = "C++ toolchain provider to be used.",
+ positional = false,
+ named = true,
+ type = CcToolchainProviderApi.class),
+ @Param(
+ name = "library",
+ doc = "Library that should be symlinked.",
+ positional = false,
+ named = true,
+ type = Artifact.class),
+ })
+ LibraryToLinkT createSymlinkLibraryLinkerInput(
+ SkylarkRuleContext skylarkRuleContext, CcToolchainProviderT ccToolchain, Artifact library);
+
+ @SkylarkCallable(
+ name = "create_cc_link_params",
+ doc = "Creates cc link parameters",
+ parameters = {
+ @Param(
+ name = "ctx",
+ positional = false,
+ named = true,
+ type = SkylarkRuleContextApi.class,
+ doc = "The rule context."),
+ @Param(
+ name = "libraries_to_link",
+ doc =
+ "List of libraries that should be passed to the linker/archiver. They can be "
+ + "static and/or dynamic libraries.",
+ positional = false,
+ named = true,
+ noneable = true,
+ defaultValue = "None",
+ allowedTypes = {
+ @ParamType(type = SkylarkNestedSet.class),
+ @ParamType(type = NoneType.class)
+ }),
+ @Param(
+ name = "dynamic_libraries_for_runtime",
+ doc =
+ "When 'libraries_to_link' has dynamic libraries, then the runtime library can "
+ + "be specified as well. This is not obligatory though, as we may provide a "
+ + "library for linking and at runtime the actual library will be provided by "
+ + "the system.",
+ positional = false,
+ named = true,
+ noneable = true,
+ defaultValue = "None",
+ allowedTypes = {
+ @ParamType(type = SkylarkNestedSet.class),
+ @ParamType(type = NoneType.class)
+ }),
+ @Param(
+ name = "user_link_flags",
+ doc = "List of user provided linker flags.",
+ positional = false,
+ named = true,
+ noneable = true,
+ defaultValue = "None",
+ allowedTypes = {
+ @ParamType(type = SkylarkNestedSet.class),
+ @ParamType(type = NoneType.class)
+ })
+ })
+ CcLinkParamsT createCcLinkParams(
+ SkylarkRuleContext skylarkRuleContext,
+ Object skylarkLibrariesToLink,
+ Object skylarkDynamicLibrariesForRuntime,
+ Object skylarkUserLinkFlags)
+ throws EvalException;
+
+ @SkylarkCallable(
+ name = "create_cc_skylark_info",
+ documented = false,
+ parameters = {
+ // TODO(plf): Make this parameter mandatory. Change cc_embed_data.bzl first.
+ @Param(
+ name = "ctx",
+ doc = "Skylark rule context.",
+ positional = false,
+ named = true,
+ noneable = true,
+ defaultValue = "None",
+ allowedTypes = {
+ @ParamType(type = SkylarkRuleContextApi.class),
+ @ParamType(type = NoneType.class)
+ })
+ })
+ CcSkylarkInfoT createCcSkylarkInfo(Object skylarkRuleContextObject) throws EvalException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkInfoApi.java
new file mode 100644
index 0000000000..dc764a064f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkInfoApi.java
@@ -0,0 +1,26 @@
+// Copyright 2018 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.skylarkbuildapi.cpp;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** Skylark rules need to provide this to be a dependency of native cc_* rules. */
+@SkylarkModule(
+ name = "cc_skylark_info",
+ category = SkylarkModuleCategory.PROVIDER,
+ doc = "Temporary provider to mark C++ Skylark rules")
+// TODO(b/77669139): Delete this class. Use {@link CcCompilationInfo} instead.
+public interface CcSkylarkInfoApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
new file mode 100644
index 0000000000..a8421654c7
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
@@ -0,0 +1,29 @@
+// Copyright 2018 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.skylarkbuildapi.cpp;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/**
+ * A library the user can link to. This is different from a simple linker input in that it also has
+ * a library identifier.
+ */
+@SkylarkModule(
+ name = "LibraryToLink",
+ category = SkylarkModuleCategory.BUILTIN,
+ documented = false,
+ doc = "A library the user can link to.")
+public interface LibraryToLinkApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java
new file mode 100644
index 0000000000..13707d21e6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java
@@ -0,0 +1,29 @@
+// 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.skylarkbuildapi.cpp;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+
+/**
+ * Something that appears on the command line of the linker. Since we sometimes expand archive files
+ * to their constituent object files, we need to keep information whether a certain file contains
+ * embedded objects and if so, the list of the object files themselves.
+ */
+public interface LinkerInputApi {
+ /** Returns the artifact that is the input of the linker. */
+ @SkylarkCallable(name = "artifact", doc = "Artifact passed to the linker.")
+ Artifact getArtifact();
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
index a8fc8a287c..defdfe7fe7 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
@@ -13,8 +13,10 @@ java_library(
name = "cpp",
srcs = glob(["*.java"]),
deps = [
+ "//src/main/java/com/google/devtools/build/lib:build-base",
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib:syntax",
+ "//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
"//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
"//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index c8f7a06778..6e3ab8377a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -14,21 +14,30 @@
package com.google.devtools.build.skydoc.fakebuildapi.cpp;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkParamsApi;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcModuleApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcSkylarkInfoApi;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainProviderApi;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainVariablesApi;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.FeatureConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
-/**
- * Fake implementation of {@link CcModuleApi}.
- */
-public class FakeCcModule implements CcModuleApi<CcToolchainProviderApi, FeatureConfigurationApi,
- CcToolchainVariablesApi> {
+/** Fake implementation of {@link CcModuleApi}. */
+public class FakeCcModule
+ implements CcModuleApi<
+ CcToolchainProviderApi,
+ FeatureConfigurationApi,
+ CcToolchainVariablesApi,
+ LibraryToLinkApi,
+ CcLinkParamsApi,
+ CcSkylarkInfoApi> {
@Override
public ProviderApi getCcToolchainProvider() {
@@ -88,4 +97,33 @@ public class FakeCcModule implements CcModuleApi<CcToolchainProviderApi, Feature
public CcToolchainVariablesApi getVariables() {
return null;
}
+
+ @Override
+ public LibraryToLinkApi createLibraryLinkerInput(
+ SkylarkRuleContext skylarkRuleContext, Artifact library, String skylarkArtifactCategory)
+ throws EvalException {
+ return null;
+ }
+
+ @Override
+ public LibraryToLinkApi createSymlinkLibraryLinkerInput(
+ SkylarkRuleContext skylarkRuleContext, CcToolchainProviderApi ccToolchain, Artifact library) {
+ return null;
+ }
+
+ @Override
+ public CcLinkParamsApi createCcLinkParams(
+ SkylarkRuleContext skylarkRuleContext,
+ Object skylarkLibrariesToLink,
+ Object skylarkDynamicLibrariesForRuntime,
+ Object skylarkUserLinkFlags)
+ throws EvalException {
+ return null;
+ }
+
+ @Override
+ public CcSkylarkInfoApi createCcSkylarkInfo(Object skylarkRuleContextObject)
+ throws EvalException {
+ return null;
+ }
}