mirror of
https://github.com/python/cpython.git
synced 2025-07-18 08:45:20 +00:00

we no longer explicitly pull distribution options out of our Distribution object, but rather let the Distribution put them into the command object.
90 lines
2.9 KiB
Python
90 lines
2.9 KiB
Python
"""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
|
|
self.modules = None
|
|
self.package = None
|
|
|
|
def set_final_options (self):
|
|
self.set_undefined_options ('build',
|
|
('libdir', 'dir'))
|
|
if self.package is None:
|
|
self.package = ''
|
|
|
|
|
|
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 ()
|
|
|
|
infiles = []
|
|
outfiles = []
|
|
missing = []
|
|
|
|
# Loop over the list of "pure Python" modules, deriving
|
|
# input and output filenames and checking for missing
|
|
# input files.
|
|
|
|
# it's ok not to have *any* py files, right?
|
|
if not self.modules:
|
|
return
|
|
|
|
# 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 self.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, self.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
|