blob: 71c95f209e1fcb50d7766c0ce268eb00225ba7bc [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../../base/file_system.dart';
import '../../base/logger.dart';
import '../../project.dart';
import 'ios_migrator.dart';
// The Runner target should inherit its build configuration from Generated.xcconfig.
// However the top-level Runner project should not inherit any build configuration so
// the Flutter build settings do not stomp on non-Flutter targets.
class ProjectBaseConfigurationMigration extends IOSMigrator {
ProjectBaseConfigurationMigration(IosProject project, Logger logger)
: _xcodeProjectInfoFile = project.xcodeProjectInfoFile,
super(logger);
final File _xcodeProjectInfoFile;
@override
bool migrate() {
if (!_xcodeProjectInfoFile.existsSync()) {
logger.printTrace('Xcode project not found, skipping Runner project build settings and configuration migration');
return true;
}
final String originalProjectContents = _xcodeProjectInfoFile.readAsStringSync();
// Example:
//
// 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
// isa = XCConfigurationList;
// buildConfigurations = (
// 97C147031CF9000F007C1171 /* Debug */,
// 97C147041CF9000F007C1171 /* Release */,
// 2436755321828D23008C7051 /* Profile */,
// );
final RegExp projectBuildConfigurationList = RegExp(
r'\/\* Build configuration list for PBXProject "Runner" \*\/ = {\s*isa = XCConfigurationList;\s*buildConfigurations = \(\s*(.*) \/\* Debug \*\/,\s*(.*) \/\* Release \*\/,\s*(.*) \/\* Profile \*\/,',
multiLine: true,
);
final RegExpMatch match = projectBuildConfigurationList.firstMatch(originalProjectContents);
// If the PBXProject "Runner" build configuration identifiers can't be parsed, default to the generated template identifiers.
final String debugIdentifier = match?.group(1) ?? '97C147031CF9000F007C117D';
final String releaseIdentifier = match?.group(2) ?? '97C147041CF9000F007C117D';
final String profileIdentifier = match?.group(3) ?? '249021D3217E4FDB00AE95B9';
// Debug
final String debugBaseConfigurationOriginal = '''
$debugIdentifier /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
''';
final String debugBaseConfigurationReplacement = '''
$debugIdentifier /* Debug */ = {
isa = XCBuildConfiguration;
''';
String newProjectContents = originalProjectContents.replaceAll(debugBaseConfigurationOriginal, debugBaseConfigurationReplacement);
// Profile
final String profileBaseConfigurationOriginal = '''
$profileIdentifier /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
''';
final String profileBaseConfigurationReplacement = '''
$profileIdentifier /* Profile */ = {
isa = XCBuildConfiguration;
''';
newProjectContents = newProjectContents.replaceAll(profileBaseConfigurationOriginal, profileBaseConfigurationReplacement);
// Release
final String releaseBaseConfigurationOriginal = '''
$releaseIdentifier /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
''';
final String releaseBaseConfigurationReplacement = '''
$releaseIdentifier /* Release */ = {
isa = XCBuildConfiguration;
''';
newProjectContents = newProjectContents.replaceAll(releaseBaseConfigurationOriginal, releaseBaseConfigurationReplacement);
if (originalProjectContents != newProjectContents) {
logger.printStatus('Project base configurations detected, removing.');
_xcodeProjectInfoFile.writeAsStringSync(newProjectContents.toString());
}
return true;
}
}