Index: build/mac_toolchain.py |
diff --git a/build/mac_toolchain.py b/build/mac_toolchain.py |
index c0e5e7f5beb03dd2cd574bf00d90b94a36a7207a..c4de86f91e37c30c1447c5a46b44c65b70e1b2cd 100755 |
--- a/build/mac_toolchain.py |
+++ b/build/mac_toolchain.py |
@@ -40,34 +40,34 @@ REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
GCLIENT_CONFIG = os.path.join(os.path.dirname(REPO_ROOT), '.gclient') |
BASE_DIR = os.path.abspath(os.path.dirname(__file__)) |
-TOOLCHAIN_BUILD_DIR = os.path.join(BASE_DIR, 'mac_files', 'Xcode.app') |
-STAMP_FILE = os.path.join(BASE_DIR, 'mac_files', 'toolchain_build_revision') |
+TOOLCHAIN_BUILD_DIR = os.path.join(BASE_DIR, '%s_files', 'Xcode.app') |
+STAMP_FILE = os.path.join(BASE_DIR, '%s_files', 'toolchain_build_revision') |
TOOLCHAIN_URL = 'gs://chrome-mac-sdk/' |
-def IsIOSPlatform(): |
+def GetPlatforms(): |
+ default_target_os = ["mac"] |
try: |
env = {} |
execfile(GCLIENT_CONFIG, env, env) |
- if 'ios' in env.get('target_os', []): |
- return True |
+ return env.get('target_os', default_target_os) |
except: |
pass |
- return False |
+ return default_target_os |
-def ReadStampFile(): |
+def ReadStampFile(target_os): |
"""Return the contents of the stamp file, or '' if it doesn't exist.""" |
try: |
- with open(STAMP_FILE, 'r') as f: |
+ with open(STAMP_FILE % target_os, 'r') as f: |
return f.read().rstrip() |
except IOError: |
return '' |
-def WriteStampFile(s): |
+def WriteStampFile(target_os, s): |
"""Write s to the stamp file.""" |
- EnsureDirExists(os.path.dirname(STAMP_FILE)) |
- with open(STAMP_FILE, 'w') as f: |
+ EnsureDirExists(os.path.dirname(STAMP_FILE % target_os)) |
+ with open(STAMP_FILE % target_os, 'w') as f: |
f.write(s) |
f.write('\n') |
@@ -101,6 +101,7 @@ def CanAccessToolchainBucket(): |
proc.communicate() |
return proc.returncode == 0 |
+ |
def LoadPlist(path): |
"""Loads Plist at |path| and returns it as a dictionary.""" |
fd, name = tempfile.mkstemp() |
@@ -112,7 +113,7 @@ def LoadPlist(path): |
os.unlink(name) |
-def AcceptLicense(): |
+def AcceptLicense(target_os): |
"""Use xcodebuild to accept new toolchain license if necessary. Don't accept |
the license if a newer license has already been accepted. This only works if |
xcodebuild and xcode-select are passwordless in sudoers.""" |
@@ -120,7 +121,7 @@ def AcceptLicense(): |
# Check old license |
try: |
target_license_plist_path = \ |
- os.path.join(TOOLCHAIN_BUILD_DIR, |
+ os.path.join(TOOLCHAIN_BUILD_DIR % target_os, |
*['Contents','Resources','LicenseInfo.plist']) |
target_license_plist = LoadPlist(target_license_plist_path) |
build_type = target_license_plist['licenseType'] |
@@ -147,17 +148,17 @@ def AcceptLicense(): |
old_path = subprocess.Popen(['/usr/bin/xcode-select', '-p'], |
stdout=subprocess.PIPE).communicate()[0].strip() |
try: |
- build_dir = os.path.join(TOOLCHAIN_BUILD_DIR, 'Contents/Developer') |
+ build_dir = os.path.join( |
+ TOOLCHAIN_BUILD_DIR % target_os, 'Contents/Developer') |
subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', build_dir]) |
subprocess.check_call(['sudo', '/usr/bin/xcodebuild', '-license', 'accept']) |
finally: |
subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', old_path]) |
-def _UseHermeticToolchain(): |
+def _UseHermeticToolchain(target_os): |
current_dir = os.path.dirname(os.path.realpath(__file__)) |
script_path = os.path.join(current_dir, 'mac/should_use_hermetic_xcode.py') |
- target_os = 'ios' if IsIOSPlatform() else 'mac' |
proc = subprocess.Popen([script_path, target_os], stdout=subprocess.PIPE) |
return '1' in proc.stdout.readline() |
@@ -186,27 +187,17 @@ def RequestGsAuthentication(): |
sys.exit(1) |
-def main(): |
- if sys.platform != 'darwin': |
- return 0 |
- |
- if not _UseHermeticToolchain(): |
- print 'Using local toolchain.' |
+def DownloadHermeticBuild(target_os, default_version, toolchain_filename): |
+ if not _UseHermeticToolchain(target_os): |
+ print 'Using local toolchain for %s.' % target_os |
return 0 |
- if IsIOSPlatform(): |
- default_version = IOS_TOOLCHAIN_VERSION |
- toolchain_filename = 'ios-toolchain-%s.tgz' |
- else: |
- default_version = MAC_TOOLCHAIN_VERSION |
- toolchain_filename = 'toolchain-%s.tgz' |
- |
toolchain_version = os.environ.get('MAC_TOOLCHAIN_REVISION', |
default_version) |
- if ReadStampFile() == toolchain_version: |
+ if ReadStampFile(target_os) == toolchain_version: |
print 'Toolchain (%s) is already up to date.' % toolchain_version |
- AcceptLicense() |
+ AcceptLicense(target_os) |
return 0 |
if not CanAccessToolchainBucket(): |
@@ -214,7 +205,7 @@ def main(): |
return 1 |
# Reset the stamp file in case the build is unsuccessful. |
- WriteStampFile('') |
+ WriteStampFile(target_os, '') |
toolchain_file = '%s.tgz' % toolchain_version |
toolchain_full_url = TOOLCHAIN_URL + toolchain_file |
@@ -223,11 +214,11 @@ def main(): |
try: |
toolchain_file = toolchain_filename % toolchain_version |
toolchain_full_url = TOOLCHAIN_URL + toolchain_file |
- DownloadAndUnpack(toolchain_full_url, TOOLCHAIN_BUILD_DIR) |
- AcceptLicense() |
+ DownloadAndUnpack(toolchain_full_url, TOOLCHAIN_BUILD_DIR % target_os) |
+ AcceptLicense(target_os) |
print 'Toolchain %s unpacked.' % toolchain_version |
- WriteStampFile(toolchain_version) |
+ WriteStampFile(target_os, toolchain_version) |
return 0 |
except Exception as e: |
print 'Failed to download toolchain %s.' % toolchain_file |
@@ -235,5 +226,26 @@ def main(): |
print 'Exiting.' |
return 1 |
+ |
+def main(): |
+ if sys.platform != 'darwin': |
+ return 0 |
+ |
+ for target_os in GetPlatforms(): |
+ if target_os == 'ios': |
+ default_version = IOS_TOOLCHAIN_VERSION |
+ toolchain_filename = 'ios-toolchain-%s.tgz' |
+ else: |
+ default_version = MAC_TOOLCHAIN_VERSION |
+ toolchain_filename = 'toolchain-%s.tgz' |
+ |
+ return_value = DownloadHermeticBuild( |
+ target_os, default_version, toolchain_filename) |
+ if return_value: |
+ return return_value |
+ |
+ return 0 |
+ |
+ |
if __name__ == '__main__': |
sys.exit(main()) |