--- /dev/null
+"""my_install_data.py
+
+Provides a more sophisticated facility to install data files
+than distutils' install_data does.
+You can specify your files as a template like in MANIFEST.in
+and you have more control over the copy process.
+
+"""
+
+# created 2000/08/01, Rene Liebscher <R.Liebscher@gmx.de>
+
+###########################################################################
+# import some modules we need
+
+import os,sys,string
+from types import StringType,TupleType,ListType
+from distutils.util import change_root
+from distutils.filelist import FileList
+from distutils.command.install_data import install_data
+
+###########################################################################
+# a container class for our more sophisticated install mechanism
+
+class Data_Files:
+ """ container for list of data files.
+ supports alternate base_dirs e.g. 'install_lib','install_header',...
+ supports a directory where to copy files
+ supports templates as in MANIFEST.in
+ supports preserving of paths in filenames
+ eg. foo/xyz is copied to base_dir/foo/xyz
+ supports stripping of leading dirs of source paths
+ eg. foo/bar1/xyz, foo/bar2/abc can be copied to bar1/xyz, bar2/abc
+ """
+
+ def __init__(self,base_dir=None,files=None,copy_to=None,template=None,preserve_path=0,strip_dirs=0):
+ self.base_dir = base_dir
+ self.files = files
+ self.copy_to = copy_to
+ self.template = template
+ self.preserve_path = preserve_path
+ self.strip_dirs = strip_dirs
+ self.finalized = 0
+
+ def warn (self, msg):
+ sys.stderr.write ("warning: %s: %s\n" %
+ ("install_data", msg))
+
+ def debug_print (self, msg):
+ """Print 'msg' to stdout if the global DEBUG (taken from the
+ DISTUTILS_DEBUG environment variable) flag is true.
+ """
+ from distutils.core import DEBUG
+ if DEBUG:
+ print msg
+
+
+ def finalize(self):
+ """ complete the files list by processing the given template """
+ if self.finalized:
+ return
+ if self.files == None:
+ self.files = []
+ if self.template != None:
+ if type(self.template) == StringType:
+ self.template = string.split(self.template,";")
+ filelist = FileList(self.warn,self.debug_print)
+ for line in self.template:
+ filelist.process_template_line(string.strip(line))
+ filelist.sort()
+ filelist.remove_duplicates()
+ self.files.extend(filelist.files)
+ self.finalized = 1
+
+# end class Data_Files
+
+###########################################################################
+# a more sophisticated install routine than distutils install_data
+
+class my_install_data (install_data):
+
+ def check_data(self,d):
+ """ check if data are in new format, if not create a suitable object.
+ returns finalized data object
+ """
+ if not isinstance(d, Data_Files):
+ self.warn(("old-style data files list found "
+ "-- please convert to Data_Files instance"))
+ if type(d) is TupleType:
+ if len(d) != 2 or not (type(d[1]) is ListType):
+ raise DistutilsSetupError, \
+ ("each element of 'data_files' option must be an "
+ "Data File instance, a string or 2-tuple (string,[strings])")
+ d = Data_Files(copy_to=d[0],files=d[1])
+ else:
+ if not (type(d) is StringType):
+ raise DistutilsSetupError, \
+ ("each element of 'data_files' option must be an "
+ "Data File instance, a string or 2-tuple (string,[strings])")
+ d = Data_Files(files=[d])
+ d.finalize()
+ return d
+
+ def run(self):
+ self.outfiles = []
+ install_cmd = self.get_finalized_command('install')
+
+ for d in self.data_files:
+ d = self.check_data(d)
+
+ install_dir = self.install_dir
+ # alternative base dir given => overwrite install_dir
+ if d.base_dir != None:
+ install_dir = getattr(install_cmd,d.base_dir)
+
+ # copy to an other directory
+ if d.copy_to != None:
+ if not os.path.isabs(d.copy_to):
+ # relatiev path to install_dir
+ dir = os.path.join(install_dir, d.copy_to)
+ elif install_cmd.root:
+ # absolute path and alternative root set
+ dir = change_root(self.root,d.copy_to)
+ else:
+ # absolute path
+ dir = d.copy_to
+ else:
+ # simply copy to install_dir
+ dir = install_dir
+ # warn if necceassary
+ self.warn("setup script did not provide a directory to copy files to "
+ " -- installing right in '%s'" % install_dir)
+
+ dir=os.path.normpath(dir)
+ # create path
+ self.mkpath(dir)
+
+ # copy all files
+ for src in d.files:
+ if d.strip_dirs > 0:
+ dst = string.join(string.split(os.path.normcase(src),os.sep)[d.strip_dirs:],os.sep)
+ else:
+ dst = src
+ if d.preserve_path:
+ # preserve path in filename
+ self.mkpath(os.path.dirname(os.path.join(dir,dst)))
+ out = self.copy_file(src, os.path.join(dir,dst))
+ else:
+ out = self.copy_file(src, dir)
+ if type(out) is TupleType:
+ out = out[0]
+ self.outfiles.append(out)
+
+ return self.outfiles
+
+ def get_inputs (self):
+ inputs = []
+ for d in self.data_files:
+ d = self.check_data(d)
+ inputs.append(d.files)
+ return inputs
+
+ def get_outputs (self):
+ return self.outfiles
+
+
+###########################################################################
+