Make Flutter tooling work on Android without Xcode being installed (#15161)
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 0d48146..49eb677 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -104,7 +104,7 @@
}
class Xcode {
- bool get isInstalledAndMeetsVersionCheck => isInstalled && xcodeVersionSatisfactory;
+ bool get isInstalledAndMeetsVersionCheck => isInstalled && isVersionSatisfactory;
String _xcodeSelectPath;
String get xcodeSelectPath {
@@ -121,11 +121,15 @@
bool get isInstalled {
if (xcodeSelectPath == null || xcodeSelectPath.isEmpty)
return false;
- if (xcodeVersionText == null || !xcodeVersionRegex.hasMatch(xcodeVersionText))
- return false;
- return true;
+ return xcodeProjectInterpreter.isInstalled;
}
+ int get majorVersion => xcodeProjectInterpreter.majorVersion;
+
+ int get minorVersion => xcodeProjectInterpreter.minorVersion;
+
+ String get versionText => xcodeProjectInterpreter.versionText;
+
bool _eulaSigned;
/// Has the EULA been signed?
bool get eulaSigned {
@@ -145,61 +149,17 @@
return _eulaSigned;
}
- final RegExp xcodeVersionRegex = new RegExp(r'Xcode ([0-9.]+)');
- void _updateXcodeVersion() {
- try {
- _xcodeVersionText = processManager.runSync(<String>['/usr/bin/xcodebuild', '-version']).stdout.trim().replaceAll('\n', ', ');
- final Match match = xcodeVersionRegex.firstMatch(xcodeVersionText);
- if (match == null)
- return;
-
- final String version = match.group(1);
- final List<String> components = version.split('.');
- _xcodeMajorVersion = int.parse(components[0]);
- _xcodeMinorVersion = components.length == 1 ? 0 : int.parse(components[1]);
- } on ProcessException {
- // Ignore: leave values null.
- }
- }
-
- String _xcodeVersionText;
- String get xcodeVersionText {
- if (_xcodeVersionText == null)
- _updateXcodeVersion();
- return _xcodeVersionText;
- }
-
- int _xcodeMajorVersion;
- int get xcodeMajorVersion {
- if (_xcodeMajorVersion == null)
- _updateXcodeVersion();
- return _xcodeMajorVersion;
- }
-
- int _xcodeMinorVersion;
- int get xcodeMinorVersion {
- if (_xcodeMinorVersion == null)
- _updateXcodeVersion();
- return _xcodeMinorVersion;
- }
-
- bool get xcodeVersionSatisfactory {
- if (xcodeVersionText == null || !xcodeVersionRegex.hasMatch(xcodeVersionText))
+ bool get isVersionSatisfactory {
+ if (!xcodeProjectInterpreter.isInstalled)
return false;
- return _xcodeVersionCheckValid(xcodeMajorVersion, xcodeMinorVersion);
+ if (majorVersion > kXcodeRequiredVersionMajor)
+ return true;
+ if (majorVersion == kXcodeRequiredVersionMajor)
+ return minorVersion >= kXcodeRequiredVersionMinor;
+ return false;
}
}
-bool _xcodeVersionCheckValid(int major, int minor) {
- if (major > kXcodeRequiredVersionMajor)
- return true;
-
- if (major == kXcodeRequiredVersionMajor)
- return minor >= kXcodeRequiredVersionMinor;
-
- return false;
-}
-
Future<XcodeBuildResult> buildXcodeProject({
BuildableIOSApp app,
BuildInfo buildInfo,
@@ -547,23 +507,19 @@
final Map<String, String> buildSettings;
}
-final RegExp _xcodeVersionRegExp = new RegExp(r'Xcode (\d+)\..*');
final String _xcodeRequirement = 'Xcode $kXcodeRequiredVersionMajor.$kXcodeRequiredVersionMinor or greater is required to develop for iOS.';
bool _checkXcodeVersion() {
if (!platform.isMacOS)
return false;
- try {
- final String version = runCheckedSync(<String>['xcodebuild', '-version']);
- final Match match = _xcodeVersionRegExp.firstMatch(version);
- if (int.parse(match[1]) < kXcodeRequiredVersionMajor) {
- printError('Found "${match[0]}". $_xcodeRequirement');
- return false;
- }
- } catch (e) {
+ if (!xcodeProjectInterpreter.isInstalled) {
printError('Cannot find "xcodebuild". $_xcodeRequirement');
return false;
}
+ if (!xcode.isVersionSatisfactory) {
+ printError('Found "${xcodeProjectInterpreter.versionText}". $_xcodeRequirement');
+ return false;
+ }
return true;
}