summaryrefslogtreecommitdiff
blob: db90e834f46c9017a570bce485c252102e7907f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
--- Lib/distutils/tests/test_build_py.py
+++ Lib/distutils/tests/test_build_py.py
@@ -92,6 +92,25 @@
             os.chdir(cwd)
             sys.stdout = sys.__stdout__
 
+    def test_dont_write_bytecode(self):
+        # makes sure byte_compile is not used
+        pkg_dir, dist = self.create_dist()
+        cmd = build_py(dist)
+        cmd.compile = 1
+        cmd.optimize = 1
+
+        old_dont_write_bytecode = os.environ.get("PYTHONDONTWRITEBYTECODE")
+        os.environ["PYTHONDONTWRITEBYTECODE"] = "1"
+        try:
+            cmd.byte_compile([])
+        finally:
+            if old_dont_write_bytecode is None:
+                del os.environ["PYTHONDONTWRITEBYTECODE"]
+            else:
+                os.environ["PYTHONDONTWRITEBYTECODE"] = old_dont_write_bytecode
+
+        self.assertTrue('byte-compiling is disabled' in self.logs[0][1])
+
 def test_suite():
     return unittest.makeSuite(BuildPyTestCase)
 
--- Lib/distutils/util.py
+++ Lib/distutils/util.py
@@ -11,6 +11,7 @@
 from distutils.dep_util import newer
 from distutils.spawn import spawn
 from distutils import log
+from distutils.errors import DistutilsByteCompileError
 
 def get_platform ():
     """Return a string that identifies the current platform.  This is used
@@ -397,6 +398,9 @@
     generated in indirect mode; unless you know what you're doing, leave
     it set to None.
     """
+    # nothing is done if PYTHONDONTWRITEBYTECODE environment variable is set
+    if os.environ.get("PYTHONDONTWRITEBYTECODE") is not None:
+        raise DistutilsByteCompileError('byte-compiling is disabled.')
 
     # First, if the caller didn't force us into direct or indirect mode,
     # figure out which mode we should be in.  We take a conservative
--- Lib/distutils/command/build_py.py
+++ Lib/distutils/command/build_py.py
@@ -418,6 +418,10 @@
 
 
     def byte_compile (self, files):
+        if os.environ.get("PYTHONDONTWRITEBYTECODE") is not None:
+            self.warn('byte-compiling is disabled, skipping.')
+            return
+
         from distutils.util import byte_compile
         prefix = self.build_lib
         if prefix[-1] != os.sep:
--- Lib/distutils/command/install_lib.py
+++ Lib/distutils/command/install_lib.py
@@ -121,6 +121,10 @@
         return outfiles
 
     def byte_compile (self, files):
+        if os.environ.get("PYTHONDONTWRITEBYTECODE") is not None:
+            self.warn('byte-compiling is disabled, skipping.')
+            return
+
         from distutils.util import byte_compile
 
         # Get the "--root" directory supplied to the "install" command,
--- Lib/distutils/errors.py
+++ Lib/distutils/errors.py
@@ -76,6 +76,8 @@
 class DistutilsTemplateError (DistutilsError):
     """Syntax error in a file list template."""
 
+class DistutilsByteCompileError(DistutilsError):
+    """Byte compile error."""
 
 # Exception classes used by the CCompiler implementation classes
 class CCompilerError (Exception):