88 lines
2.6 KiB
Python
Executable File
88 lines
2.6 KiB
Python
Executable File
#!/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)
|