diff options
author | Zeno Albisser <zeno.albisser@digia.com> | 2013-08-15 21:46:11 +0200 |
---|---|---|
committer | Zeno Albisser <zeno.albisser@digia.com> | 2013-08-15 21:46:11 +0200 |
commit | 679147eead574d186ebf3069647b4c23e8ccace6 (patch) | |
tree | fc247a0ac8ff119f7c8550879ebb6d3dd8d1ff69 /chromium/tools/diagnose-me.py | |
download | qtwebengine-chromium-679147eead574d186ebf3069647b4c23e8ccace6.tar.gz |
Initial import.
Diffstat (limited to 'chromium/tools/diagnose-me.py')
-rwxr-xr-x | chromium/tools/diagnose-me.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/chromium/tools/diagnose-me.py b/chromium/tools/diagnose-me.py new file mode 100755 index 00000000000..bbd9429cb1e --- /dev/null +++ b/chromium/tools/diagnose-me.py @@ -0,0 +1,95 @@ +#!/usr/bin/python +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Diagnose some common system configuration problems on Linux, and +suggest fixes.""" + +import os +import subprocess +import sys + +all_checks = [] + +def Check(name): + """Decorator that defines a diagnostic check.""" + def wrap(func): + all_checks.append((name, func)) + return func + return wrap + + +@Check("/usr/bin/ld is not gold") +def CheckSystemLd(): + proc = subprocess.Popen(['/usr/bin/ld', '-v'], stdout=subprocess.PIPE) + stdout = proc.communicate()[0] + if 'GNU gold' in stdout: + return ("When /usr/bin/ld is gold, system updates can silently\n" + "corrupt your graphics drivers.\n" + "Try 'sudo apt-get remove binutils-gold'.\n") + return None + + +@Check("random lds are not in the $PATH") +def CheckPathLd(): + proc = subprocess.Popen(['which', '-a', 'ld'], stdout=subprocess.PIPE) + stdout = proc.communicate()[0] + instances = stdout.split() + if len(instances) > 1: + return ("You have multiple 'ld' binaries in your $PATH:\n" + + '\n'.join(' - ' + i for i in instances) + "\n" + "You should delete all of them but your system one.\n" + "gold is hooked into your build via gyp.\n") + return None + + +@Check("/usr/bin/ld doesn't point to gold") +def CheckLocalGold(): + # Check /usr/bin/ld* symlinks. + for path in ('ld.bfd', 'ld'): + path = '/usr/bin/' + path + try: + target = os.readlink(path) + except OSError, e: + if e.errno == 2: + continue # No such file + if e.errno == 22: + continue # Not a symlink + raise + if '/usr/local/gold' in target: + return ("%s is a symlink into /usr/local/gold.\n" + "It's difficult to make a recommendation, because you\n" + "probably set this up yourself. But you should make\n" + "/usr/bin/ld be the standard linker, which you likely\n" + "renamed /usr/bin/ld.bfd or something like that.\n" % path) + + return None + + +@Check("random ninja binaries are not in the $PATH") +def CheckPathNinja(): + proc = subprocess.Popen(['which', 'ninja'], stdout=subprocess.PIPE) + stdout = proc.communicate()[0] + if not 'depot_tools' in stdout: + return ("The ninja binary in your path isn't from depot_tools:\n" + + " " + stdout + + "Remove custom ninjas from your path so that the one\n" + "in depot_tools is used.\n") + return None + + +def RunChecks(): + for name, check in all_checks: + sys.stdout.write("* Checking %s: " % name) + sys.stdout.flush() + error = check() + if not error: + print "ok" + else: + print "FAIL" + print error + + +if __name__ == '__main__': + RunChecks() |