15f9996aaSopenharmony_ci#!/usr/bin/env python 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci# Copyright (c) 2012 The Chromium Authors. All rights reserved. 45f9996aaSopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 55f9996aaSopenharmony_ci# found in the LICENSE file. 65f9996aaSopenharmony_ci 75f9996aaSopenharmony_ci"""Prints the lowest locally available SDK version greater than or equal to a 85f9996aaSopenharmony_cigiven minimum sdk version to standard output. If --developer_dir is passed, then 95f9996aaSopenharmony_cithe script will use the Xcode toolchain located at DEVELOPER_DIR. 105f9996aaSopenharmony_ci 115f9996aaSopenharmony_ciUsage: 125f9996aaSopenharmony_ci python find_sdk.py [--developer_dir DEVELOPER_DIR] 10.6 # Ignores SDKs < 10.6 135f9996aaSopenharmony_ci""" 145f9996aaSopenharmony_ci 155f9996aaSopenharmony_ciimport os 165f9996aaSopenharmony_ciimport re 175f9996aaSopenharmony_ciimport subprocess 185f9996aaSopenharmony_ciimport sys 195f9996aaSopenharmony_ci 205f9996aaSopenharmony_cifrom optparse import OptionParser 215f9996aaSopenharmony_ci 225f9996aaSopenharmony_ci 235f9996aaSopenharmony_ciclass SdkError(Exception): 245f9996aaSopenharmony_ci def __init__(self, value): 255f9996aaSopenharmony_ci self.value = value 265f9996aaSopenharmony_ci 275f9996aaSopenharmony_ci def __str__(self): 285f9996aaSopenharmony_ci return repr(self.value) 295f9996aaSopenharmony_ci 305f9996aaSopenharmony_ci 315f9996aaSopenharmony_cidef parse_version(version_str): 325f9996aaSopenharmony_ci """'10.6' => [10, 6]""" 335f9996aaSopenharmony_ci return map(int, re.findall(r'(\d+)', version_str)) 345f9996aaSopenharmony_ci 355f9996aaSopenharmony_ci 365f9996aaSopenharmony_cidef main(): 375f9996aaSopenharmony_ci parser = OptionParser() 385f9996aaSopenharmony_ci parser.add_option("--verify", 395f9996aaSopenharmony_ci action="store_true", dest="verify", default=False, 405f9996aaSopenharmony_ci help="return the sdk argument and warn if it doesn't exist") 415f9996aaSopenharmony_ci parser.add_option("--sdk_path", 425f9996aaSopenharmony_ci action="store", type="string", dest="sdk_path", 435f9996aaSopenharmony_ci default="", 445f9996aaSopenharmony_ci help="user-specified SDK path; bypasses verification") 455f9996aaSopenharmony_ci parser.add_option("--print_sdk_path", 465f9996aaSopenharmony_ci action="store_true", dest="print_sdk_path", default=False, 475f9996aaSopenharmony_ci help="Additionally print the path the SDK (appears first).") 485f9996aaSopenharmony_ci parser.add_option("--developer_dir", help='Path to Xcode.') 495f9996aaSopenharmony_ci options, args = parser.parse_args() 505f9996aaSopenharmony_ci if len(args) != 1: 515f9996aaSopenharmony_ci parser.error('Please specify a minimum SDK version') 525f9996aaSopenharmony_ci min_sdk_version = args[0] 535f9996aaSopenharmony_ci 545f9996aaSopenharmony_ci if options.developer_dir: 555f9996aaSopenharmony_ci os.environ['DEVELOPER_DIR'] = options.developer_dir 565f9996aaSopenharmony_ci 575f9996aaSopenharmony_ci job = subprocess.Popen(['xcode-select', '-print-path'], 585f9996aaSopenharmony_ci stdout=subprocess.PIPE, 595f9996aaSopenharmony_ci stderr=subprocess.STDOUT) 605f9996aaSopenharmony_ci out, err = job.communicate() 615f9996aaSopenharmony_ci if job.returncode != 0: 625f9996aaSopenharmony_ci print(out, file=sys.stderr) 635f9996aaSopenharmony_ci print(err, file=sys.stderr) 645f9996aaSopenharmony_ci raise Exception('Error %d running xcode-select' % job.returncode) 655f9996aaSopenharmony_ci sdk_dir = os.path.join( 665f9996aaSopenharmony_ci str(out.rstrip(), encoding="utf-8"), 675f9996aaSopenharmony_ci 'Platforms/MacOSX.platform/Developer/SDKs') 685f9996aaSopenharmony_ci # Xcode must be installed, its license agreement must be accepted, and its 695f9996aaSopenharmony_ci # command-line tools must be installed. Stand-alone installations (in 705f9996aaSopenharmony_ci # /Library/Developer/CommandLineTools) are not supported. 715f9996aaSopenharmony_ci # https://bugs.chromium.org/p/chromium/issues/detail?id=729990#c1 725f9996aaSopenharmony_ci file_path = os.path.relpath("/path/to/Xcode.app") 735f9996aaSopenharmony_ci if not os.path.isdir(sdk_dir) or not '.app/Contents/Developer' in sdk_dir: 745f9996aaSopenharmony_ci raise SdkError('Install Xcode, launch it, accept the license ' + 755f9996aaSopenharmony_ci 'agreement, and run `sudo xcode-select -s %s` ' % file_path + 765f9996aaSopenharmony_ci 'to continue.') 775f9996aaSopenharmony_ci sdks = [re.findall('^MacOSX(1[0,1,2,3,4]\.\d+)\.sdk$', s) for s in 785f9996aaSopenharmony_ci os.listdir(sdk_dir)] 795f9996aaSopenharmony_ci sdks = [s[0] for s in sdks if s] # [['10.5'], ['10.6']] => ['10.5', '10.6'] 805f9996aaSopenharmony_ci sdks = [s for s in sdks # ['10.5', '10.6'] => ['10.6'] 815f9996aaSopenharmony_ci if list(parse_version(s)) >= list(parse_version(min_sdk_version))] 825f9996aaSopenharmony_ci 835f9996aaSopenharmony_ci if not sdks: 845f9996aaSopenharmony_ci raise Exception('No %s+ SDK found' % min_sdk_version) 855f9996aaSopenharmony_ci best_sdk = sorted(sdks)[0] 865f9996aaSopenharmony_ci 875f9996aaSopenharmony_ci if options.verify and best_sdk != min_sdk_version and not options.sdk_path: 885f9996aaSopenharmony_ci print('', file=sys.stderr) 895f9996aaSopenharmony_ci print(' vvvvvvv', 905f9996aaSopenharmony_ci file=sys.stderr) 915f9996aaSopenharmony_ci print('', file=sys.stderr) 925f9996aaSopenharmony_ci print( 935f9996aaSopenharmony_ci 'This build requires the %s SDK, but it was not found on your system.' \ 945f9996aaSopenharmony_ci % min_sdk_version, file=sys.stderr) 955f9996aaSopenharmony_ci print( 965f9996aaSopenharmony_ci 'Either install it, or explicitly set mac_sdk in your GYP_DEFINES.', 975f9996aaSopenharmony_ci file=sys.stderr) 985f9996aaSopenharmony_ci print('', file=sys.stderr) 995f9996aaSopenharmony_ci print(' ^^^^^^^', 1005f9996aaSopenharmony_ci file=sys.stderr) 1015f9996aaSopenharmony_ci print('', file=sys.stderr) 1025f9996aaSopenharmony_ci sys.exit(1) 1035f9996aaSopenharmony_ci 1045f9996aaSopenharmony_ci if options.print_sdk_path: 1055f9996aaSopenharmony_ci _sdk_path = subprocess.check_output( 1065f9996aaSopenharmony_ci ['xcrun', '-sdk', 'macosx' + best_sdk, '--show-sdk-path']).strip() 1075f9996aaSopenharmony_ci if isinstance(_sdk_path, bytes): 1085f9996aaSopenharmony_ci _sdk_path = _sdk_path.decode() 1095f9996aaSopenharmony_ci print(_sdk_path) 1105f9996aaSopenharmony_ci return best_sdk 1115f9996aaSopenharmony_ci 1125f9996aaSopenharmony_ci 1135f9996aaSopenharmony_ciif __name__ == '__main__': 1145f9996aaSopenharmony_ci if sys.platform != 'darwin': 1155f9996aaSopenharmony_ci raise Exception("This script only runs on Mac") 1165f9996aaSopenharmony_ci print(main()) 1175f9996aaSopenharmony_ci sys.exit(0) 118