1313"""
1414
1515import os
16+ import stat
1617import sys
1718import 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
7886def 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