"""distutils.command.build_py Implements the Distutils 'build_py' command.""" # created 1999/03/08, Greg Ward __rcsid__ = "$Id$" import string, os from distutils.core import Command from distutils.errors import * from distutils.util import mkpath, newer, make_file, copy_file class BuildPy (Command): options = [('dir=', 'd', "directory for platform-shared files"), ] def set_default_options (self): self.dir = None def set_final_options (self): self.set_undefined_options ('build', ('libdir', 'dir')) def run (self): # XXX copy_file by default preserves all stat info -- mode, atime, # and mtime. IMHO this is the right thing to do, but perhaps it # should be an option -- in particular, a site administrator might # want installed files to reflect the time of installation rather # than the last modification time before the installed release. # XXX copy_file does *not* preserve MacOS-specific file metadata. # If this is a problem for building/installing Python modules, then # we'll have to fix copy_file. (And what about installing scripts, # when the time comes for that -- does MacOS use its special # metadata to know that a file is meant to be interpreted by # Python?) self.set_final_options () (modules, package) = \ self.distribution.get_options ('py_modules', 'package') package = package or '' infiles = [] outfiles = [] missing = [] # Loop over the list of "pure Python" modules, deriving # input and output filenames and checking for missing # input files. # XXX we should allow for wildcards, so eg. the Distutils setup.py # file would just have to say # py_modules = ['distutils.*', 'distutils.command.*'] # without having to list each one explicitly. for m in modules: fn = apply (os.path.join, tuple (string.split (m, '.'))) + '.py' if not os.path.exists (fn): missing.append (fn) else: infiles.append (fn) outfiles.append (os.path.join (self.dir, package, fn)) # Blow up if any input files were not found. if missing: raise DistutilsFileError, \ "missing files: " + string.join (missing, ' ') # Loop over the list of input files, copying them to their # temporary (build) destination. created = {} for i in range (len (infiles)): outdir = os.path.split (outfiles[i])[0] if not created.get(outdir): self.mkpath (outdir) created[outdir] = 1 self.copy_file (infiles[i], outfiles[i]) # end class BuildPy