diff options
author | 2016-02-10 12:52:11 +0000 | |
---|---|---|
committer | 2016-02-10 16:34:46 +0000 | |
commit | ea02b8a51fc924755971f78e392100b50d8dc5a2 (patch) | |
tree | 54ed40e7e37fa90ce0a4e7d44fb1566e7c147176 /src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java | |
parent | 847a41816c08b846e09c62834f28fbbcb08d5d6d (diff) |
Add imports attribute to Bazel native Python rules to allow adding directories to PYTHONPATH.
Fixes #702
RELNOTES: Add imports attribute to native Python rules.
--
MOS_MIGRATED_REVID=114314430
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)); } |