diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java index abff076bb0..7092e5fd5d 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.bazel.rules.python; +import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; @@ -22,13 +23,18 @@ import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction; import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution; import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Template; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore; import com.google.devtools.build.lib.rules.python.PyCommon; import com.google.devtools.build.lib.rules.python.PythonSemantics; import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec; +import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileTypeSet; +import com.google.devtools.build.lib.vfs.PathFragment; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** * Functionality specific to the Python rules in Bazel. @@ -64,8 +70,29 @@ public class BazelPythonSemantics implements PythonSemantics { } @Override + public List<PathFragment> getImports(RuleContext ruleContext) { + List<PathFragment> result = new ArrayList<>(); + PathFragment packageFragment = ruleContext.getLabel().getPackageIdentifier().getPathFragment(); + for (String importsAttr : ruleContext.attributes().get("imports", Type.STRING_LIST)) { + importsAttr = ruleContext.expandMakeVariables("includes", importsAttr); + if (importsAttr.startsWith("/")) { + ruleContext.attributeWarning("imports", + "ignoring invalid absolute path '" + importsAttr + "'"); + continue; + } + PathFragment importsPath = packageFragment.getRelative(importsAttr).normalize(); + if (!importsPath.isNormalized()) { + ruleContext.attributeError("imports", + "Path references a path above the execution root."); + } + result.add(importsPath); + } + return result; + } + + @Override public void createExecutable(RuleContext ruleContext, PyCommon common, - CcLinkParamsStore ccLinkParamsStore) { + CcLinkParamsStore ccLinkParamsStore, NestedSet<PathFragment> imports) { String main = common.determineMainExecutableSource(); BazelPythonConfiguration config = ruleContext.getFragment(BazelPythonConfiguration.class); String pythonBinary; @@ -82,7 +109,8 @@ public class BazelPythonSemantics implements PythonSemantics { STUB_TEMPLATE, ImmutableList.of( Substitution.of("%main%", main), - Substitution.of("%python_binary%", pythonBinary)), + Substitution.of("%python_binary%", pythonBinary), + Substitution.of("%imports%", Joiner.on(":").join(imports))), true)); } |