import os
import sys
import tokenize
from distutils.debug import DEBUG
from distutils.errors import (
DistutilsSetupError,
DistutilsError,
CCompilerError,
DistutilsArgError,
)
from distutils.dist import Distribution
from distutils.cmd import Command
from distutils.config import PyPIRCCommand
from distutils.extension import Extension
__all__ = ['Distribution', 'Command', 'PyPIRCCommand', 'Extension', 'setup']
USAGE = """\
usage: %(script)s [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: %(script)s --help [cmd1 cmd2 ...]
or: %(script)s --help-commands
or: %(script)s cmd --help
"""
def gen_usage(script_name):
script = os.path.basename(script_name)
return USAGE % locals()
_setup_stop_after = None
_setup_distribution = None
setup_keywords = (
'distclass',
'script_name',
'script_args',
'options',
'name',
'version',
'author',
'author_email',
'maintainer',
'maintainer_email',
'url',
'license',
'description',
'long_description',
'keywords',
'platforms',
'classifiers',
'download_url',
'requires',
'provides',
'obsoletes',
)
extension_keywords = (
'name',
'sources',
'include_dirs',
'define_macros',
'undef_macros',
'library_dirs',
'libraries',
'runtime_library_dirs',
'extra_objects',
'extra_compile_args',
'extra_link_args',
'swig_opts',
'export_symbols',
'depends',
'language',
)
def setup(**attrs):
global _setup_stop_after, _setup_distribution
klass = attrs.get('distclass')
if klass:
del attrs['distclass']
else:
klass = Distribution
if 'script_name' not in attrs:
attrs['script_name'] = os.path.basename(sys.argv[0])
if 'script_args' not in attrs:
attrs['script_args'] = sys.argv[1:]
try:
_setup_distribution = dist = klass(attrs)
except DistutilsSetupError as msg:
if 'name' not in attrs:
raise SystemExit("error in setup command: %s" % msg)
else:
raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))
if _setup_stop_after == "init":
return dist
dist.parse_config_files()
if DEBUG:
print("options (after parsing config files):")
dist.dump_option_dicts()
if _setup_stop_after == "config":
return dist
try:
ok = dist.parse_command_line()
except DistutilsArgError as msg:
raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
if DEBUG:
print("options (after parsing command line):")
dist.dump_option_dicts()
if _setup_stop_after == "commandline":
return dist
if ok:
return run_commands(dist)
return dist
def run_commands(dist):
try:
dist.run_commands()
except KeyboardInterrupt:
raise SystemExit("interrupted")
except OSError as exc:
if DEBUG:
sys.stderr.write("error: {}\n".format(exc))
raise
else:
raise SystemExit("error: {}".format(exc))
except (DistutilsError, CCompilerError) as msg:
if DEBUG:
raise
else:
raise SystemExit("error: " + str(msg))
return dist
def run_setup(script_name, script_args=None, stop_after="run"):
if stop_after not in ('init', 'config', 'commandline', 'run'):
raise ValueError("invalid value for 'stop_after': {!r}".format(stop_after))
global _setup_stop_after, _setup_distribution
_setup_stop_after = stop_after
save_argv = sys.argv.copy()
g = {'__file__': script_name, '__name__': '__main__'}
try:
try:
sys.argv[0] = script_name
if script_args is not None:
sys.argv[1:] = script_args
with tokenize.open(script_name) as f:
code = f.read().replace(r'\r\n', r'\n')
exec(code, g)
finally:
sys.argv = save_argv
_setup_stop_after = None
except SystemExit:
pass
if _setup_distribution is None:
raise RuntimeError(
(
"'distutils.core.setup()' was never called -- "
"perhaps '%s' is not a Distutils setup script?"
)
% script_name
)
return _setup_distribution