1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-07 21:21:31 +00:00
Files
nmap/ndiff/setup.py

117 lines
3.9 KiB
Python

#!/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
there's no option to disable that."""
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
pass
class checked_install(distutils.command.install.install):
"""This is a wrapper around the install command that checks for an error
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)
except distutils.errors.DistutilsPlatformError, e:
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"])],
cmdclass={"install_egg_info": null_command, "install": checked_install})