diff --git a/ndiff/setup.py b/ndiff/setup.py index e06e87701..58b97c970 100644 --- a/ndiff/setup.py +++ b/ndiff/setup.py @@ -1,12 +1,51 @@ #!/usr/bin/env python +import errno +import sys +import os +import os.path +import re + import distutils.command import distutils.command.install import distutils.core import distutils.cmd import distutils.errors +from distutils.command.install import install + +APP_NAME = "ndiff" + +def path_strip_prefix(path, prefix): + """Return path stripped of its directory prefix if it starts with prefix, + otherwise return path unmodified. This only works correctly with Unix + paths; for example it will not replace the drive letter on a Windows path. + Examples: + >>> path_strip_prefix('/tmp/destdir/usr/bin', '/tmp/destdir') + '/usr/bin' + >>> path_strip_prefix('/tmp/../tmp/destdir/usr/bin', '/tmp///destdir') + '/usr/bin' + >>> path_strip_prefix('/etc', '/tmp/destdir') + '/etc' + >>> path_strip_prefix('/etc', '/') + '/etc' + >>> path_strip_prefix('/etc', '') + '/etc' + """ + absolute = os.path.isabs(path) + path = os.path.normpath(path) + prefix = os.path.normpath(prefix) + if path.startswith(prefix) and prefix != os.sep: + path = path[len(prefix):] + # Absolute paths must remain absolute and relative paths must remain + # relative. + assert os.path.isabs(path) == absolute + return path + +############################################################################### +# Distutils subclasses + class null_command(distutils.cmd.Command): """This is a dummy distutils command that does nothing. We use it to replace the install_egg_info and avoid installing a .egg-info file, because @@ -26,6 +65,7 @@ class checked_install(distutils.command.install.install): caused by not having the python-dev package installed. By default, distutils gives a misleading error message: "invalid Python installation." """ + def finalize_options(self): try: distutils.command.install.install.finalize_options(self) @@ -33,6 +73,43 @@ class checked_install(distutils.command.install.install): raise distutils.errors.DistutilsPlatformError(str(e) + """ Installing your distribution's python-dev package may solve this problem.""") + def set_modules_path(self): + app_file_name = os.path.join(self.install_scripts, APP_NAME) + # Find where the modules are installed. distutils will put them in + # self.install_lib, but that path can contain the root (DESTDIR), so we + # must strip it off if necessary. + modules_dir = self.install_lib + if self.root is not None: + modules_dir = path_strip_prefix(modules_dir, self.root) + + app_file = open(app_file_name, "r") + lines = app_file.readlines() + app_file.close() + + for i in range(len(lines)): + if re.match(r'^INSTALL_LIB =', lines[i]): + lines[i] = "INSTALL_LIB = %s\n" % repr(modules_dir) + break + else: + raise ValueError( + "INSTALL_LIB replacement not found in %s" % app_file_name) + + app_file = open(app_file_name, "w") + app_file.writelines(lines) + app_file.close() + + + def run(self): + install.run(self) + +# These below are from Zenmap. We're only using set_modules_path right now, but we might consider whether the others would be useful (or, if not, whether we should remove them from Zenmap). +# self.set_perms() + self.set_modules_path() +# self.fix_paths() +# self.create_uninstaller() +# self.write_installed_files() + + distutils.core.setup(name=u"ndiff", scripts=[u"scripts/ndiff"], py_modules=[u"ndiff"], data_files=[(u"share/man/man1", [u"docs/ndiff.1"])],