aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-07-27 09:16:53 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-07-27 12:58:40 +0000
commit20b15fbf1cd36a99c306c6d0324e4aeb328df36e (patch)
treeccd5a66e332b64efbb1ebba7470de4d4e6b2aefc /src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
parent31143247f9c2ab78aee92c07dd7e664904e8b4f2 (diff)
Enable simple compilation of Python artifacts for py_binary and py_library.
-- MOS_MIGRATED_REVID=99163140
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
index 33f6755041..a537eb936a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
@@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.ResourceSet;
import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
import com.google.devtools.build.lib.actions.extra.PythonInfo;
import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
@@ -31,6 +32,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.Util;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
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;
@@ -341,6 +343,56 @@ public final class PyCommon {
ruleContext.getPrerequisites("data", Mode.DATA)));
}
+ protected static final ResourceSet PY_COMPILE_RESOURCE_SET =
+ ResourceSet.createWithRamCpuIo(10 /* MB */, 1 /* CPU */, 0.0 /* IO */);
+
+ /**
+ * Utility function to compile multiple .py files to .pyc files.
+ */
+ public Collection<Artifact> createPycFiles(
+ Iterable<Artifact> sources, PathFragment pythonBinary) {
+ List<Artifact> pycFiles = new ArrayList<>();
+ for (Artifact source : sources) {
+ Artifact pycFile = createPycFile(source, pythonBinary);
+ pycFiles.add(pycFile);
+ }
+ return ImmutableList.copyOf(pycFiles);
+ }
+
+ /**
+ * Given a single .py source artifact generate a .pyc file.
+ */
+ public Artifact createPycFile(
+ Artifact source, PathFragment pythonBinary) {
+ Artifact output =
+ ruleContext.getRelatedArtifact(source.getRootRelativePath(), ".pyc");
+
+ // TODO(nnorwitz): Consider adding PYTHONHASHSEED=0 to the environment.
+ // This will make the .pyc more stable, though it will still be non-deterministic.
+ // The timestamp is zeroed out above.
+ SpawnAction.Builder builder = new SpawnAction.Builder()
+ .setResources(PY_COMPILE_RESOURCE_SET)
+ .setExecutable(pythonBinary)
+ .setProgressMessage("Compiling Python")
+ .addInputArgument(
+ ruleContext.getPrerequisiteArtifact("$python_precompile", Mode.HOST))
+ .setMnemonic("PyCompile");
+
+ TransitiveInfoCollection pythonTarget =
+ ruleContext.getPrerequisite(":host_python2_runtime", Mode.HOST);
+ if (pythonTarget != null) {
+ builder.addInputs(pythonTarget
+ .getProvider(FileProvider.class)
+ .getFilesToBuild());
+ }
+
+ builder.addInputArgument(source);
+ builder.addOutputArgument(output);
+ ruleContext.registerAction(builder.build(ruleContext));
+ return output;
+ }
+
+
/**
* Returns true if this target has an .so file in its transitive dependency closure.
*/