| #!/usr/bin/env python | |
| import os | |
| import sys | |
| import textwrap | |
| import setuptools | |
| from setuptools.command.install import install | |
| here = os.path.dirname(__file__) | |
| package_data = dict( | |
| setuptools=['script (dev).tmpl', 'script.tmpl', 'site-patch.py'], | |
| ) | |
| force_windows_specific_files = ( | |
| os.environ.get("SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES", "1").lower() | |
| not in ("", "0", "false", "no") | |
| ) | |
| include_windows_files = sys.platform == 'win32' or force_windows_specific_files | |
| if include_windows_files: | |
| package_data.setdefault('setuptools', []).extend(['*.exe']) | |
| package_data.setdefault('setuptools.command', []).extend(['*.xml']) | |
| def pypi_link(pkg_filename): | |
| """ | |
| Given the filename, including md5 fragment, construct the | |
| dependency link for PyPI. | |
| """ | |
| root = 'https://files.pythonhosted.org/packages/source' | |
| name, sep, rest = pkg_filename.partition('-') | |
| parts = root, name[0], name, pkg_filename | |
| return '/'.join(parts) | |
| class install_with_pth(install): | |
| """ | |
| Custom install command to install a .pth file for distutils patching. | |
| This hack is necessary because there's no standard way to install behavior | |
| on startup (and it's debatable if there should be one). This hack (ab)uses | |
| the `extra_path` behavior in Setuptools to install a `.pth` file with | |
| implicit behavior on startup to give higher precedence to the local version | |
| of `distutils` over the version from the standard library. | |
| Please do not replicate this behavior. | |
| """ | |
| _pth_name = 'distutils-precedence' | |
| _pth_contents = textwrap.dedent(""" | |
| import os | |
| var = 'SETUPTOOLS_USE_DISTUTILS' | |
| enabled = os.environ.get(var, 'local') == 'local' | |
| enabled and __import__('_distutils_hack').add_shim() | |
| """).lstrip().replace('\n', '; ') | |
| def initialize_options(self): | |
| install.initialize_options(self) | |
| self.extra_path = self._pth_name, self._pth_contents | |
| def finalize_options(self): | |
| install.finalize_options(self) | |
| self._restore_install_lib() | |
| def _restore_install_lib(self): | |
| """ | |
| Undo secondary effect of `extra_path` adding to `install_lib` | |
| """ | |
| suffix = os.path.relpath(self.install_lib, self.install_libbase) | |
| if suffix.strip() == self._pth_contents.strip(): | |
| self.install_lib = self.install_libbase | |
| setup_params = dict( | |
| cmdclass={'install': install_with_pth}, | |
| package_data=package_data, | |
| ) | |
| if __name__ == '__main__': | |
| # allow setup.py to run from another directory | |
| here and os.chdir(here) | |
| dist = setuptools.setup(**setup_params) |