| // Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:convert'; | |
| import 'dart:io'; | |
| Future<String> _runStdout(String executable, List<String> arguments) async { | |
| final process = await Process.start(executable, arguments); | |
| final s = StringBuffer(); | |
| process.stdout.transform(utf8.decoder).listen(s.write); | |
| process.stderr.listen(stderr.add); | |
| if ((await process.exitCode) != 0) { | |
| throw ProcessException(executable, arguments); | |
| } | |
| return s.toString(); | |
| } | |
| Future<String> hostTargetTriple = () async { | |
| final info = | |
| json.decode(await _runStdout('swiftc', ['-print-target-info'])) as Map; | |
| final target = info['target'] as Map; | |
| return target['triple'] as String; | |
| }(); | |
| const iOSArmTargetTripleUnversioned = 'arm-apple-ios'; | |
| const iOSArm64TargetTripleUnversioned = 'arm64-apple-ios'; | |
| const iOSX64TargetTripleUnversioned = 'x86_64-apple-ios'; | |
| const macOSArm64TargetTripleUnversioned = 'arm64-apple-macosx'; | |
| const macOSX64TargetTripleUnversioned = 'x86_64-apple-macosx'; | |
| // Eg: Extracts "15.2" from ".../MacOSX15.2.sdk/" | |
| final _versionRegExp = RegExp(r'/[^0-9]*([0-9.]+)\.sdk/$'); | |
| String _parseVersion(Uri sdk) { | |
| final v = _versionRegExp.firstMatch(sdk.path)?.group(1); | |
| if (v == null) { | |
| throw FormatException('SDK path has unexpected form', sdk.path); | |
| } | |
| return v; | |
| } | |
| Future<String> _versionedTargetTriple( | |
| String unversionedTriple, | |
| Future<Uri> sdk, | |
| ) async => '$unversionedTriple${_parseVersion(await sdk)}'; | |
| Future<String> iOSArmTargetTripleLatest = _versionedTargetTriple( | |
| iOSArmTargetTripleUnversioned, | |
| iOSSdk, | |
| ); | |
| Future<String> iOSArm64TargetTripleLatest = _versionedTargetTriple( | |
| iOSArm64TargetTripleUnversioned, | |
| iOSSdk, | |
| ); | |
| Future<String> iOSX64TargetTripleLatest = _versionedTargetTriple( | |
| iOSX64TargetTripleUnversioned, | |
| iOSSdk, | |
| ); | |
| Future<String> macOSArm64TargetTripleLatest = _versionedTargetTriple( | |
| macOSArm64TargetTripleUnversioned, | |
| macOSSdk, | |
| ); | |
| Future<String> macOSX64TargetTripleLatest = _versionedTargetTriple( | |
| macOSX64TargetTripleUnversioned, | |
| macOSSdk, | |
| ); | |
| Future<Uri> hostSdk = _findSdk([]); | |
| Future<Uri> macOSSdk = _findSdk(['--sdk', 'macosx']); | |
| Future<Uri> iOSSdk = _findSdk(['--sdk', 'iphoneos']); | |
| Future<Uri> _findSdk(List<String> args) async => Uri.directory( | |
| (await _runStdout('xcrun', [...args, '--show-sdk-path'])).trim(), | |
| ); |