123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #!/usr/bin/env 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."""
- from __future__ import print_function
- 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
- @Check("build dependencies are satisfied")
- def CheckBuildDeps():
- script_path = os.path.join(
- os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'build',
- 'install-build-deps.sh')
- proc = subprocess.Popen([script_path, '--quick-check'],
- stdout=subprocess.PIPE)
- stdout = proc.communicate()[0]
- if 'WARNING' in stdout:
- return ("Your build dependencies are out-of-date.\n"
- "Run '" + script_path + "' to update.")
- 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()
|