Skip to content

Commit 59d7523

Browse files
author
guido
committed
A mod whose author I forget. (I must've mislaid the email. If it's
yours, please let me know for propoer acknowledgement.) This avoids recompiling files that haven't changed; it adds a -f option to force recompilation. git-svn-id: http://svn.python.org/projects/python/trunk@12163 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent d5f0e7f commit 59d7523

1 file changed

Lines changed: 19 additions & 8 deletions

File tree

Lib/compileall.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@
1313
"""
1414

1515
import os
16+
import stat
1617
import sys
1718
import py_compile
1819

19-
def compile_dir(dir, maxlevels=10, ddir=None):
20+
def compile_dir(dir, maxlevels=10, ddir=None, force=0):
2021
"""Byte-compile all modules in the given directory tree.
2122
2223
Arguments (only dir is required):
@@ -25,6 +26,7 @@ def compile_dir(dir, maxlevels=10, ddir=None):
2526
maxlevels: maximum recursion level (default 10)
2627
ddir: if given, purported directory name (this is the
2728
directory name that will show up in error messages)
29+
force: if 1, force compilation, even if timestamps are up-to-date
2830
2931
"""
3032
print 'Listing', dir, '...'
@@ -43,6 +45,11 @@ def compile_dir(dir, maxlevels=10, ddir=None):
4345
if os.path.isfile(fullname):
4446
head, tail = name[:-3], name[-3:]
4547
if tail == '.py':
48+
cfile = fullname + (__debug__ and 'c' or 'o')
49+
ftime = os.stat(fullname)[stat.ST_MTIME]
50+
try: ctime = os.stat(cfile)[stat.ST_MTIME]
51+
except os.error: ctime = 0
52+
if (ctime > ftime) and not force: continue
4653
print 'Compiling', fullname, '...'
4754
try:
4855
py_compile.compile(fullname, None, dfile)
@@ -58,48 +65,52 @@ def compile_dir(dir, maxlevels=10, ddir=None):
5865
name != os.curdir and name != os.pardir and \
5966
os.path.isdir(fullname) and \
6067
not os.path.islink(fullname):
61-
compile_dir(fullname, maxlevels - 1, dfile)
68+
compile_dir(fullname, maxlevels - 1, dfile, force)
6269

63-
def compile_path(skip_curdir=1, maxlevels=0):
70+
def compile_path(skip_curdir=1, maxlevels=0, force=0):
6471
"""Byte-compile all module on sys.path.
6572
6673
Arguments (all optional):
6774
6875
skip_curdir: if true, skip current directory (default true)
6976
maxlevels: max recursion level (default 0)
77+
force: as for compile_dir() (default 0)
7078
7179
"""
7280
for dir in sys.path:
7381
if (not dir or dir == os.curdir) and skip_curdir:
7482
print 'Skipping current directory'
7583
else:
76-
compile_dir(dir, maxlevels)
84+
compile_dir(dir, maxlevels, None, force)
7785

7886
def main():
7987
"""Script main program."""
8088
import getopt
8189
try:
82-
opts, args = getopt.getopt(sys.argv[1:], 'ld:')
90+
opts, args = getopt.getopt(sys.argv[1:], 'lfd:')
8391
except getopt.error, msg:
8492
print msg
85-
print "usage: compileall [-l] [-d destdir] [directory ...]"
93+
print "usage: compileall [-l] [-f] [-d destdir] [directory ...]"
8694
print "-l: don't recurse down"
95+
print "-f: force rebuild even if timestamps are up-to-date"
8796
print "-d destdir: purported directory name for error messages"
88-
print "if no arguments, -l sys.path is assumed"
97+
print "if no directory arguments, -l sys.path is assumed"
8998
sys.exit(2)
9099
maxlevels = 10
91100
ddir = None
101+
force = 0
92102
for o, a in opts:
93103
if o == '-l': maxlevels = 0
94104
if o == '-d': ddir = a
105+
if o == '-f': force = 1
95106
if ddir:
96107
if len(args) != 1:
97108
print "-d destdir require exactly one directory argument"
98109
sys.exit(2)
99110
try:
100111
if args:
101112
for dir in args:
102-
compile_dir(dir, maxlevels, ddir)
113+
compile_dir(dir, maxlevels, ddir, force)
103114
else:
104115
compile_path()
105116
except KeyboardInterrupt:

0 commit comments

Comments
 (0)