diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2019-12-28 21:06:52 +0100 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2019-12-28 21:06:52 +0100 |
commit | 348304dd374cca918d194644b7e678500145a1df (patch) | |
tree | e15c4975ed369d114b5d12e9cca3557fa757a922 | |
parent | 343cf0229de9dd6a22069e24286d1dbbcf6b6d99 (diff) | |
download | psutil-348304dd374cca918d194644b7e678500145a1df.tar.gz |
setup.py: print instructions if C compiler is not installed
-rw-r--r-- | psutil/_common.py | 36 | ||||
-rwxr-xr-x | setup.py | 46 |
2 files changed, 79 insertions, 3 deletions
diff --git a/psutil/_common.py b/psutil/_common.py index 126d9d6f..2f74460b 100644 --- a/psutil/_common.py +++ b/psutil/_common.py @@ -23,6 +23,7 @@ from collections import namedtuple from socket import AF_INET from socket import SOCK_DGRAM from socket import SOCK_STREAM + try: from socket import AF_INET6 except ImportError: @@ -37,6 +38,7 @@ if sys.version_info >= (3, 4): else: enum = None + # can't take it from _common.py as this script is imported by setup.py PY3 = sys.version_info[0] == 3 @@ -64,7 +66,7 @@ __all__ = [ 'conn_tmap', 'deprecated_method', 'isfile_strict', 'memoize', 'parse_environ_block', 'path_exists_strict', 'usage_percent', 'supports_ipv6', 'sockfam_to_enum', 'socktype_to_enum', "wrap_numbers", - 'bytes2human', 'conn_to_ntuple', + 'bytes2human', 'conn_to_ntuple', 'hilite', ] @@ -649,3 +651,35 @@ if PY3: else: def decode(s): return s + + +def _term_supports_colors(file=sys.stdout): + if hasattr(_term_supports_colors, "ret"): + return _term_supports_colors.ret + try: + import curses + assert file.isatty() + curses.setupterm() + assert curses.tigetnum("colors") > 0 + except Exception: + _term_supports_colors.ret = False + return False + else: + _term_supports_colors.ret = True + return _term_supports_colors.ret + + +def hilite(s, ok=True, bold=False): + """Return an highlighted version of 'string'.""" + if not _term_supports_colors(): + return s + attr = [] + if ok is None: # no color + pass + elif ok: # green + attr.append('32') + else: # red + attr.append('31') + if bold: + attr.append('1') + return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), s) @@ -6,6 +6,7 @@ """Cross-platform lib for process and system monitoring in Python.""" +from __future__ import print_function import contextlib import io import os @@ -27,12 +28,13 @@ with warnings.catch_warnings(): HERE = os.path.abspath(os.path.dirname(__file__)) -# ...so we can import _common.py +# ...so we can import _common.py and _compat.py sys.path.insert(0, os.path.join(HERE, "psutil")) from _common import AIX # NOQA from _common import BSD # NOQA from _common import FREEBSD # NOQA +from _common import hilite # NOQA from _common import LINUX # NOQA from _common import MACOS # NOQA from _common import NETBSD # NOQA @@ -40,6 +42,8 @@ from _common import OPENBSD # NOQA from _common import POSIX # NOQA from _common import SUNOS # NOQA from _common import WINDOWS # NOQA +from _compat import PY3 # NOQA +from _compat import which # NOQA macros = [] @@ -105,6 +109,13 @@ def silenced_output(stream_name): setattr(sys, stream_name, orig) +def missdeps(msg): + s = hilite("C compiler or Python headers are not installed ", ok=False) + s += hilite("on this system. Try to run:\n", ok=False) + s += hilite(msg, ok=False, bold=True) + print(s, file=sys.stderr) + + if WINDOWS: def get_winver(): maj, min = sys.getwindowsversion()[0:2] @@ -365,7 +376,38 @@ def main(): extras_require=extras_require, zip_safe=False, ) - setup(**kwargs) + success = False + try: + setup(**kwargs) + success = True + finally: + if not success and POSIX and not which('gcc'): + py3 = "3" if PY3 else "" + if LINUX: + if which('dpkg'): + missdeps("sudo apt-get install gcc python%s-dev" % py3) + elif which('rpm'): + missdeps("sudo yum install gcc python%s-devel" % py3) + elif MACOS: + print(hilite("XCode (https://developer.apple.com/xcode/) " + "is not installed"), ok=False, file=sys.stderr) + elif FREEBSD: + missdeps("pkg install gcc python%s" % py3) + elif OPENBSD: + missdeps("pkg_add -v gcc python%s" % py3) + elif NETBSD: + missdeps("pkgin install gcc python%s" % py3) + elif SUNOS: + missdeps("sudo ln -s /usr/bin/gcc /usr/local/bin/cc && " + "pkg install gcc") + elif not success and WINDOWS: + if PY3: + ur = "http://www.visualstudio.com/en-au/news/vs2015-preview-vs" + else: + ur = "http://www.microsoft.com/en-us/download/" + ur += "details.aspx?id=44266" + print(hilite("VisualStudio is not installed; get it from %s" % ur), + ok=False, file=sys.stderr) if __name__ == '__main__': |