blob: e8a1f3a5c7e66c87600adcce8e3ed23d183ccf59 [file] [log] [blame]
[email protected]67bb8612013-11-08 20:51:401#!/usr/bin/env python
2# Copyright 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""This script is a wrapper around the GN binary that is pulled from Google
7Cloud Storage when you sync Chrome. The binaries go into platform-specific
8subdirectories in the source tree.
9
10This script makes there be one place for forwarding to the correct platform's
11binary. It will also automatically try to find the gn binary when run inside
12the chrome source tree, so users can just type "gn" on the command line
13(normally depot_tools is on the path)."""
14
[email protected]3ac1c4e2014-01-16 02:44:4215import gclient_utils
[email protected]67bb8612013-11-08 20:51:4016import os
17import subprocess
18import sys
19
20
Sergiy Byelozyorov01489552018-06-29 18:13:1521def PruneVirtualEnv():
22 # Set by VirtualEnv, no need to keep it.
23 os.environ.pop('VIRTUAL_ENV', None)
24
25 # Set by VPython, if scripts want it back they have to set it explicitly.
26 os.environ.pop('PYTHONNOUSERSITE', None)
27
28 # Look for "activate_this.py" in this path, which is installed by VirtualEnv.
29 # This mechanism is used by vpython as well to sanitize VirtualEnvs from
30 # $PATH.
31 os.environ['PATH'] = os.pathsep.join([
32 p for p in os.environ.get('PATH', '').split(os.pathsep)
33 if not os.path.isfile(os.path.join(p, 'activate_this.py'))
34 ])
35
36
[email protected]67bb8612013-11-08 20:51:4037def main(args):
Sergiy Byelozyorov01489552018-06-29 18:13:1538 # Prune all evidence of VPython/VirtualEnv out of the environment. This means
39 # that we 'unwrap' vpython VirtualEnv path/env manipulation. Invocations of
40 # `python` from GN should never inherit the gn.py's own VirtualEnv. This also
41 # helps to ensure that generated ninja files do not reference python.exe from
42 # the VirtualEnv generated from depot_tools' own .vpython file (or lack
43 # thereof), but instead reference the default python from the PATH.
44 PruneVirtualEnv()
45
Scott Grahama991ac62018-06-26 23:19:5146 # Try in primary solution location first, with the gn binary having been
47 # downloaded by cipd in the projects DEPS.
48 gn_path = os.path.join(gclient_utils.GetPrimarySolutionPath(), 'third_party',
49 'gn', 'gn' + gclient_utils.GetExeSuffix())
50 if os.path.exists(gn_path):
51 return subprocess.call([gn_path] + args[1:])
52
53 # Otherwise try the old .sha1 and download_from_google_storage locations
54 # inside of buildtools.
[email protected]cc968fe2014-06-23 17:30:3255 bin_path = gclient_utils.GetBuildtoolsPlatformBinaryPath()
56 if not bin_path:
57 print >> sys.stderr, ('gn.py: Could not find checkout in any parent of '
58 'the current path.\nThis must be run inside a '
59 'checkout.')
[email protected]f7facfa2014-09-05 12:40:2860 return 1
[email protected]cc968fe2014-06-23 17:30:3261 gn_path = os.path.join(bin_path, 'gn' + gclient_utils.GetExeSuffix())
[email protected]f7facfa2014-09-05 12:40:2862 if not os.path.exists(gn_path):
63 print >> sys.stderr, 'gn.py: Could not find gn executable at: %s' % gn_path
64 return 2
65 else:
[email protected]d05ab352014-12-05 17:24:2666 return subprocess.call([gn_path] + args[1:])
[email protected]67bb8612013-11-08 20:51:4067
[email protected]3ac1c4e2014-01-16 02:44:4268
[email protected]67bb8612013-11-08 20:51:4069if __name__ == '__main__':
[email protected]013731e2015-02-26 18:28:4370 try:
71 sys.exit(main(sys.argv))
72 except KeyboardInterrupt:
73 sys.stderr.write('interrupted\n')
74 sys.exit(1)