Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: build/mac_toolchain.py

Issue 1759793003: Scripts to upload and update the mac toolchain. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Roll to Xcode 7.3, address scottmg comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « build/gyp_environment.py ('k') | build/package_mac_toolchain.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2016 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 """Download necessary mac toolchain files under certain conditions. If
7 xcode-select is already set and points to an external folder
8 (e.g. /Application/Xcode.app), this script only runs if the GYP_DEFINE
9 |force_mac_toolchain| is set. To override the values in
10 |TOOLCHAIN_REVISION|-|TOOLCHAIN_SUB_REVISION| below, GYP_DEFINE
11 mac_toolchain_revision can be used instead.
12
13 This script will only run on machines if /usr/bin/xcodebuild has been added to
14 the sudoers list so the license can be accepted.
15
16 Otherwise, user input would be required to complete the script. Perhaps future
17 versions can be modified to allow for user input on developer machines.
18 """
19
20 import os
21 import shutil
22 import subprocess
23 import sys
24 import tarfile
25 import time
26 import tempfile
27 import urllib2
28
29 # Update sys.path to import gyp.
30 script_dir = os.path.dirname(os.path.realpath(__file__))
31 chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir))
32 sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib'))
33 import gyp
34
35 # This can be changed after running /build/package_mac_toolchain.py.
36 TOOLCHAIN_REVISION = '7D175'
erikchen 2016/03/22 17:51:39 What version of Xcode is this? How did you get thi
37 TOOLCHAIN_SUB_REVISION = 1
38 TOOLCHAIN_VERSION = '%s-%s' % (TOOLCHAIN_REVISION, TOOLCHAIN_SUB_REVISION)
39
40 BASE_DIR = os.path.abspath(os.path.dirname(__file__))
41 TOOLCHAIN_BUILD_DIR = os.path.join(BASE_DIR, 'mac_files', 'Xcode.app')
42 STAMP_FILE = os.path.join(BASE_DIR, 'mac_files', 'toolchain_build_revision')
43 TOOLCHAIN_URL = 'gs://chrome-mac-sdk/'
44
45
46 def SetEnvironment():
47 if sys.platform == 'darwin' and not UseLocalMacSDK():
48 os.environ['DEVELOPER_DIR'] = TOOLCHAIN_BUILD_DIR
49
50
51 def ReadStampFile():
52 """Return the contents of the stamp file, or '' if it doesn't exist."""
53 try:
54 with open(STAMP_FILE, 'r') as f:
55 return f.read().rstrip()
56 except IOError:
57 return ''
58
59
60 def WriteStampFile(s):
61 """Write s to the stamp file."""
62 EnsureDirExists(os.path.dirname(STAMP_FILE))
63 with open(STAMP_FILE, 'w') as f:
64 f.write(s)
65 f.write('\n')
66
67
68 def EnsureDirExists(path):
69 if not os.path.exists(path):
70 os.makedirs(path)
71
72
73 def DownloadAndUnpack(url, output_dir):
74 """Decompresses |url| into a cleared |output_dir|."""
75 temp_name = tempfile.mktemp(prefix='mac_toolchain')
76 try:
77 print 'Downloading new toolchain.'
78 subprocess.check_call(['gsutil.py', 'cp', url, temp_name])
79 if os.path.exists(output_dir):
80 print 'Deleting old toolchain.'
81 shutil.rmtree(output_dir)
82 EnsureDirExists(output_dir)
83 print 'Unpacking new toolchain.'
84 tarfile.open(mode='r:gz', name=temp_name).extractall(path=output_dir)
85 finally:
86 if os.path.exists(temp_name):
87 os.unlink(temp_name)
88
89
90 def CanAccessToolchainBucket():
91 """Checks whether the user has access to |TOOLCHAIN_URL|."""
92 proc = subprocess.Popen(['gsutil.py', 'ls', TOOLCHAIN_URL],
93 stdout=subprocess.PIPE)
94 proc.communicate()
95 return proc.returncode == 0
96
97
98 def SwitchToolchain(directory):
99 """Use xcodebuild to accept new toolchain license. This only
100 works if xcodebuild is in sudoers."""
101 xcodebuild = os.path.join(TOOLCHAIN_BUILD_DIR,
102 'Contents/Developer/usr/bin/xcodebuild')
103 subprocess.check_call(['sudo', xcodebuild, '-license', 'accept'])
104
105
106 def UseLocalMacSDK():
107 gyp_defines = gyp.NameValueListToDict(gyp.ShlexEnv('GYP_DEFINES'))
108 force_pull = 'force_mac_toolchain' in gyp_defines
109
110 # Don't update the toolchain if there's already one installed outside of the
111 # expected location for a Chromium mac toolchain, unless |force_pull| is set.
112 proc = subprocess.Popen(['xcode-select', '-p'], stdout=subprocess.PIPE)
113 xcode_select_dir = proc.communicate()[0]
114 rc = proc.returncode
115 return (not force_pull and rc == 0 and
116 TOOLCHAIN_BUILD_DIR not in xcode_select_dir)
117
118
119 def main():
120 if sys.platform != 'darwin':
121 return 0
122
123 # TODO(justincohen): Add support for GN per crbug.com/570091
124 if UseLocalMacSDK():
125 print 'Using local toolchain.'
126 return 0
127
128 gyp_defines = gyp.NameValueListToDict(gyp.ShlexEnv('GYP_DEFINES'))
129 toolchain_revision = gyp_defines.get('mac_toolchain_revision',
130 TOOLCHAIN_VERSION)
131 if ReadStampFile() == toolchain_revision:
132 print 'Toolchain (%s) is already up to date.' % toolchain_revision
133 SwitchToolchain(TOOLCHAIN_BUILD_DIR)
134 return 0
135
136 if not CanAccessToolchainBucket():
137 print 'Cannot access toolchain bucket.'
138 return 0
139
140 # Reset the stamp file in case the build is unsuccessful.
141 WriteStampFile('')
142
143 toolchain_file = '%s.tgz' % toolchain_revision
144 toolchain_full_url = TOOLCHAIN_URL + toolchain_file
145
146 print 'Updating toolchain to %s...' % toolchain_revision
147 try:
148 toolchain_file = 'toolchain-%s.tgz' % toolchain_revision
149 toolchain_full_url = TOOLCHAIN_URL + toolchain_file
150 DownloadAndUnpack(toolchain_full_url, TOOLCHAIN_BUILD_DIR)
151 SwitchToolchain(TOOLCHAIN_BUILD_DIR)
152
153 print 'Toolchain %s unpacked.' % toolchain_revision
154 WriteStampFile(toolchain_revision)
155 return 0
156 except:
157 print 'Failed to download toolchain %s.' % toolchain_file
158 print 'Exiting.'
159 return 1
160
161 if __name__ == '__main__':
162 sys.exit(main())
OLDNEW
« no previous file with comments | « build/gyp_environment.py ('k') | build/package_mac_toolchain.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698