123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #!/usr/bin/env python
- # Copyright 2013 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.
- """This script is a wrapper around the GN binary that is pulled from Google
- Cloud Storage when you sync Chrome. The binaries go into platform-specific
- subdirectories in the source tree.
- This script makes there be one place for forwarding to the correct platform's
- binary. It will also automatically try to find the gn binary when run inside
- the chrome source tree, so users can just type "gn" on the command line
- (normally depot_tools is on the path)."""
- from __future__ import print_function
- import gclient_paths
- import os
- import subprocess
- import sys
- def PruneVirtualEnv():
- # Set by VirtualEnv, no need to keep it.
- os.environ.pop('VIRTUAL_ENV', None)
- # Set by VPython, if scripts want it back they have to set it explicitly.
- os.environ.pop('PYTHONNOUSERSITE', None)
- # Look for "activate_this.py" in this path, which is installed by VirtualEnv.
- # This mechanism is used by vpython as well to sanitize VirtualEnvs from
- # $PATH.
- os.environ['PATH'] = os.pathsep.join([
- p for p in os.environ.get('PATH', '').split(os.pathsep)
- if not os.path.isfile(os.path.join(p, 'activate_this.py'))
- ])
- def main(args):
- # Prune all evidence of VPython/VirtualEnv out of the environment. This means
- # that we 'unwrap' vpython VirtualEnv path/env manipulation. Invocations of
- # `python` from GN should never inherit the gn.py's own VirtualEnv. This also
- # helps to ensure that generated ninja files do not reference python.exe from
- # the VirtualEnv generated from depot_tools' own .vpython file (or lack
- # thereof), but instead reference the default python from the PATH.
- PruneVirtualEnv()
- # Try in primary solution location first, with the gn binary having been
- # downloaded by cipd in the projects DEPS.
- primary_solution_path = gclient_paths.GetPrimarySolutionPath()
- if primary_solution_path:
- gn_path = os.path.join(primary_solution_path, 'third_party',
- 'gn', 'gn' + gclient_paths.GetExeSuffix())
- if os.path.exists(gn_path):
- return subprocess.call([gn_path] + args[1:])
- # Otherwise try the old .sha1 and download_from_google_storage locations
- # inside of buildtools.
- bin_path = gclient_paths.GetBuildtoolsPlatformBinaryPath()
- if not bin_path:
- print('gn.py: Could not find checkout in any parent of the current path.\n'
- 'This must be run inside a checkout.', file=sys.stderr)
- return 1
- gn_path = os.path.join(bin_path, 'gn' + gclient_paths.GetExeSuffix())
- if not os.path.exists(gn_path):
- print(
- 'gn.py: Could not find gn executable at: %s' % gn_path, file=sys.stderr)
- return 2
- else:
- return subprocess.call([gn_path] + args[1:])
- if __name__ == '__main__':
- try:
- sys.exit(main(sys.argv))
- except KeyboardInterrupt:
- sys.stderr.write('interrupted\n')
- sys.exit(1)
|