15f9996aaSopenharmony_ci#!/usr/bin/env python
25f9996aaSopenharmony_ci# -*- coding: utf-8 -*-
35f9996aaSopenharmony_ci# Copyright 2014 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_ciimport argparse
85f9996aaSopenharmony_ciimport doctest
95f9996aaSopenharmony_ciimport itertools
105f9996aaSopenharmony_ciimport os
115f9996aaSopenharmony_ciimport subprocess
125f9996aaSopenharmony_ciimport sys
135f9996aaSopenharmony_ci
145f9996aaSopenharmony_ci# This script prints information about the build system, the operating
155f9996aaSopenharmony_ci# system and the iOS or Mac SDK (depending on the platform "iphonesimulator",
165f9996aaSopenharmony_ci# "iphoneos" or "macosx" generally).
175f9996aaSopenharmony_ci
185f9996aaSopenharmony_ci
195f9996aaSopenharmony_cidef split_version(version: str or bytes):
205f9996aaSopenharmony_ci    """
215f9996aaSopenharmony_ci    Splits the Xcode version to 3 values.
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_ci    >>> list(split_version('8.2.1.1'))
245f9996aaSopenharmony_ci    ['8', '2', '1']
255f9996aaSopenharmony_ci    >>> list(split_version('9.3'))
265f9996aaSopenharmony_ci    ['9', '3', '0']
275f9996aaSopenharmony_ci    >>> list(split_version('10.0'))
285f9996aaSopenharmony_ci    ['10', '0', '0']
295f9996aaSopenharmony_ci    """
305f9996aaSopenharmony_ci    if isinstance(version, bytes):
315f9996aaSopenharmony_ci        version = version.decode()
325f9996aaSopenharmony_ci    version = version.split('.')
335f9996aaSopenharmony_ci    return itertools.islice(itertools.chain(version, itertools.repeat('0')), 0, 3)
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_cidef format_version(version: str or bytes):
375f9996aaSopenharmony_ci    """
385f9996aaSopenharmony_ci    Converts Xcode version to a format required for DTXcode in Info.plist
395f9996aaSopenharmony_ci
405f9996aaSopenharmony_ci    >>> format_version('8.2.1')
415f9996aaSopenharmony_ci    '0821'
425f9996aaSopenharmony_ci    >>> format_version('9.3')
435f9996aaSopenharmony_ci    '0930'
445f9996aaSopenharmony_ci    >>> format_version('10.0')
455f9996aaSopenharmony_ci    '1000'
465f9996aaSopenharmony_ci    """
475f9996aaSopenharmony_ci    major, minor, patch = split_version(version)
485f9996aaSopenharmony_ci    return ('%2s%s%s' % (major, minor, patch)).replace(' ', '0')
495f9996aaSopenharmony_ci
505f9996aaSopenharmony_ci
515f9996aaSopenharmony_cidef fill_xcode_version(fill_settings: dict) -> dict:
525f9996aaSopenharmony_ci    """Fills the Xcode version and build number into |fill_settings|."""
535f9996aaSopenharmony_ci
545f9996aaSopenharmony_ci    try:
555f9996aaSopenharmony_ci        lines = subprocess.check_output(['xcodebuild', '-version']).splitlines()
565f9996aaSopenharmony_ci        fill_settings['xcode_version'] = format_version(lines[0].split()[-1])
575f9996aaSopenharmony_ci        fill_settings['xcode_version_int'] = int(fill_settings['xcode_version'], 10)
585f9996aaSopenharmony_ci        fill_settings['xcode_build'] = lines[-1].split()[-1]
595f9996aaSopenharmony_ci    except subprocess.CalledProcessError as cpe:
605f9996aaSopenharmony_ci        print(f"Failed to run xcodebuild -version: {cpe}")
615f9996aaSopenharmony_ci
625f9996aaSopenharmony_ci
635f9996aaSopenharmony_cidef fill_machine_os_build(fill_settings: dict):
645f9996aaSopenharmony_ci    """Fills OS build number into |fill_settings|."""
655f9996aaSopenharmony_ci    fill_settings['machine_os_build'] = subprocess.check_output(
665f9996aaSopenharmony_ci        ['sw_vers', '-buildVersion']).strip()
675f9996aaSopenharmony_ci
685f9996aaSopenharmony_ci
695f9996aaSopenharmony_cidef fill_sdk_path_and_version(fill_settings: dict, platform: str, xcode_version: str or bytes):
705f9996aaSopenharmony_ci    """Fills the SDK path and version for |platform| into |fill_settings|."""
715f9996aaSopenharmony_ci    fill_settings['sdk_path'] = subprocess.check_output([
725f9996aaSopenharmony_ci        'xcrun', '-sdk', platform, '--show-sdk-path']).strip()
735f9996aaSopenharmony_ci    fill_settings['sdk_version'] = subprocess.check_output([
745f9996aaSopenharmony_ci        'xcrun', '-sdk', platform, '--show-sdk-version']).strip()
755f9996aaSopenharmony_ci    fill_settings['sdk_platform_path'] = subprocess.check_output([
765f9996aaSopenharmony_ci        'xcrun', '-sdk', platform, '--show-sdk-platform-path']).strip()
775f9996aaSopenharmony_ci    if xcode_version >= '0720':
785f9996aaSopenharmony_ci        fill_settings['sdk_build'] = subprocess.check_output([
795f9996aaSopenharmony_ci          'xcrun', '-sdk', platform, '--show-sdk-build-version']).strip()
805f9996aaSopenharmony_ci    else:
815f9996aaSopenharmony_ci        fill_settings['sdk_build'] = fill_settings['sdk_version']
825f9996aaSopenharmony_ci
835f9996aaSopenharmony_ci
845f9996aaSopenharmony_ciif __name__ == '__main__':
855f9996aaSopenharmony_ci    doctest.testmod()
865f9996aaSopenharmony_ci
875f9996aaSopenharmony_ci    parser = argparse.ArgumentParser()
885f9996aaSopenharmony_ci    parser.add_argument("--developer_dir", required=False)
895f9996aaSopenharmony_ci    args, unknownargs = parser.parse_known_args()
905f9996aaSopenharmony_ci    if args.developer_dir:
915f9996aaSopenharmony_ci        os.environ['DEVELOPER_DIR'] = args.developer_dir
925f9996aaSopenharmony_ci
935f9996aaSopenharmony_ci    if len(unknownargs) != 1:
945f9996aaSopenharmony_ci        sys.stderr.write(
955f9996aaSopenharmony_ci          'usage: %s [iphoneos|iphonesimulator|macosx]\n' %
965f9996aaSopenharmony_ci          os.path.basename(sys.argv[0]))
975f9996aaSopenharmony_ci        sys.exit(1)
985f9996aaSopenharmony_ci
995f9996aaSopenharmony_ci    settings = {}
1005f9996aaSopenharmony_ci    fill_machine_os_build(settings)
1015f9996aaSopenharmony_ci    fill_xcode_version(settings)
1025f9996aaSopenharmony_ci    try:
1035f9996aaSopenharmony_ci        fill_sdk_path_and_version(settings, unknownargs[0], settings.get('xcode_version'))
1045f9996aaSopenharmony_ci    except ValueError as vle:
1055f9996aaSopenharmony_ci        print(f"Error: {vle}")
1065f9996aaSopenharmony_ci
1075f9996aaSopenharmony_ci    for key in sorted(settings):
1085f9996aaSopenharmony_ci        value = settings.get(key)
1095f9996aaSopenharmony_ci        if isinstance(value, bytes):
1105f9996aaSopenharmony_ci            value = value.decode()
1115f9996aaSopenharmony_ci        if key != 'xcode_version_int':
1125f9996aaSopenharmony_ci            value = '"%s"' % value
1135f9996aaSopenharmony_ci            print('%s=%s' % (key, value))
1145f9996aaSopenharmony_ci        else:
1155f9996aaSopenharmony_ci            print('%s=%d' % (key, value))
116