Unverified Commit e028d0f0 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Split project.dart into CMake and Xcode projects (#85359)

parent 610ee89b
...@@ -443,3 +443,19 @@ String interpolateString(String toInterpolate, Map<String, String> replacementVa ...@@ -443,3 +443,19 @@ String interpolateString(String toInterpolate, Map<String, String> replacementVa
List<String> interpolateStringList(List<String> toInterpolate, Map<String, String> replacementValues) { List<String> interpolateStringList(List<String> toInterpolate, Map<String, String> replacementValues) {
return toInterpolate.map((String s) => interpolateString(s, replacementValues)).toList(); return toInterpolate.map((String s) => interpolateString(s, replacementValues)).toList();
} }
/// Returns the first line-based match for [regExp] in [file].
///
/// Assumes UTF8 encoding.
Match? firstMatchInFile(File file, RegExp regExp) {
if (!file.existsSync()) {
return null;
}
for (final String line in file.readAsLinesSync()) {
final Match? match = regExp.firstMatch(line);
if (match != null) {
return match;
}
}
return null;
}
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'base/file_system.dart'; import 'base/file_system.dart';
import 'project.dart'; import 'cmake_project.dart';
/// Extracts the `BINARY_NAME` from a project's CMake file. /// Extracts the `BINARY_NAME` from a project's CMake file.
/// ///
......
// 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 'package:meta/meta.dart';
import 'package:xml/xml.dart';
import 'base/common.dart';
import 'base/file_system.dart';
import 'base/utils.dart';
import 'cmake.dart';
import 'platform_plugins.dart';
import 'project.dart';
/// Represents a CMake-based sub-project.
///
/// This defines interfaces common to Windows and Linux projects.
abstract class CmakeBasedProject {
/// The parent of this project.
FlutterProject get parent;
/// Whether the subproject (either Windows or Linux) exists in the Flutter project.
bool existsSync();
/// The native project CMake specification.
File get cmakeFile;
/// Contains definitions for the Flutter library and the tool.
File get managedCmakeFile;
/// Contains definitions for FLUTTER_ROOT, LOCAL_ENGINE, and more flags for
/// the build.
File get generatedCmakeConfigFile;
/// Included CMake with rules and variables for plugin builds.
File get generatedPluginCmakeFile;
/// The directory to write plugin symlinks.
Directory get pluginSymlinkDirectory;
}
/// The Windows sub project.
class WindowsProject extends FlutterProjectPlatform implements CmakeBasedProject {
WindowsProject.fromFlutter(this.parent);
@override
final FlutterProject parent;
@override
String get pluginConfigKey => WindowsPlugin.kConfigKey;
String get _childDirectory => 'windows';
@override
bool existsSync() => _editableDirectory.existsSync() && cmakeFile.existsSync();
@override
File get cmakeFile => _editableDirectory.childFile('CMakeLists.txt');
@override
File get managedCmakeFile => managedDirectory.childFile('CMakeLists.txt');
@override
File get generatedCmakeConfigFile => ephemeralDirectory.childFile('generated_config.cmake');
@override
File get generatedPluginCmakeFile => managedDirectory.childFile('generated_plugins.cmake');
@override
Directory get pluginSymlinkDirectory => ephemeralDirectory.childDirectory('.plugin_symlinks');
Directory get _editableDirectory => parent.directory.childDirectory(_childDirectory);
/// The directory in the project that is managed by Flutter. As much as
/// possible, files that are edited by Flutter tooling after initial project
/// creation should live here.
Directory get managedDirectory => _editableDirectory.childDirectory('flutter');
/// The subdirectory of [managedDirectory] that contains files that are
/// generated on the fly. All generated files that are not intended to be
/// checked in should live here.
Directory get ephemeralDirectory => managedDirectory.childDirectory('ephemeral');
Future<void> ensureReadyForPlatformSpecificTooling() async {}
}
/// The Windows UWP version of the Windows project.
class WindowsUwpProject extends WindowsProject {
WindowsUwpProject.fromFlutter(FlutterProject parent) : super.fromFlutter(parent);
@override
String get _childDirectory => 'winuwp';
File get runnerCmakeFile => _editableDirectory.childDirectory('runner_uwp').childFile('CMakeLists.txt');
/// Eventually this will be used to check if the user's unstable project needs to be regenerated.
int? get projectVersion => int.tryParse(_editableDirectory.childFile('project_version').readAsStringSync());
/// Retrieve the GUID of the UWP package.
String? get packageGuid => _packageGuid ??= getCmakePackageGuid(runnerCmakeFile);
String? _packageGuid;
File get appManifest => _editableDirectory.childDirectory('runner_uwp').childFile('appxmanifest.in');
String? get packageVersion => _packageVersion ??= parseAppVersion(this);
String? _packageVersion;
}
@visibleForTesting
String? parseAppVersion(WindowsUwpProject project) {
final File appManifestFile = project.appManifest;
if (!appManifestFile.existsSync()) {
return null;
}
XmlDocument document;
try {
document = XmlDocument.parse(appManifestFile.readAsStringSync());
} on XmlParserException {
throwToolExit('Error parsing $appManifestFile. Please ensure that the appx manifest is a valid XML document and try again.');
}
for (final XmlElement metaData in document.findAllElements('Identity')) {
return metaData.getAttribute('Version');
}
return null;
}
/// The Linux sub project.
class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject {
LinuxProject.fromFlutter(this.parent);
@override
final FlutterProject parent;
@override
String get pluginConfigKey => LinuxPlugin.kConfigKey;
static final RegExp _applicationIdPattern = RegExp(r'''^\s*set\s*\(\s*APPLICATION_ID\s*"(.*)"\s*\)\s*$''');
Directory get _editableDirectory => parent.directory.childDirectory('linux');
/// The directory in the project that is managed by Flutter. As much as
/// possible, files that are edited by Flutter tooling after initial project
/// creation should live here.
Directory get managedDirectory => _editableDirectory.childDirectory('flutter');
/// The subdirectory of [managedDirectory] that contains files that are
/// generated on the fly. All generated files that are not intended to be
/// checked in should live here.
Directory get ephemeralDirectory => managedDirectory.childDirectory('ephemeral');
@override
bool existsSync() => _editableDirectory.existsSync();
@override
File get cmakeFile => _editableDirectory.childFile('CMakeLists.txt');
@override
File get managedCmakeFile => managedDirectory.childFile('CMakeLists.txt');
@override
File get generatedCmakeConfigFile => ephemeralDirectory.childFile('generated_config.cmake');
@override
File get generatedPluginCmakeFile => managedDirectory.childFile('generated_plugins.cmake');
@override
Directory get pluginSymlinkDirectory => ephemeralDirectory.childDirectory('.plugin_symlinks');
Future<void> ensureReadyForPlatformSpecificTooling() async {}
String? get applicationId {
return firstMatchInFile(cmakeFile, _applicationIdPattern)?.group(1);
}
}
...@@ -6,7 +6,7 @@ import '../application_package.dart'; ...@@ -6,7 +6,7 @@ import '../application_package.dart';
import '../base/file_system.dart'; import '../base/file_system.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../globals_null_migrated.dart' as globals; import '../globals_null_migrated.dart' as globals;
import '../project.dart'; import '../xcode_project.dart';
import 'plist_parser.dart'; import 'plist_parser.dart';
/// Tests whether a [Directory] is an iOS bundle directory. /// Tests whether a [Directory] is an iOS bundle directory.
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../project.dart'; import '../../xcode_project.dart';
/// Update the minimum iOS deployment version to the minimum allowed by Xcode without causing a warning. /// Update the minimum iOS deployment version to the minimum allowed by Xcode without causing a warning.
class DeploymentTargetMigration extends ProjectMigrator { class DeploymentTargetMigration extends ProjectMigrator {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../project.dart'; import '../../xcode_project.dart';
// The Runner target should inherit its build configuration from Generated.xcconfig. // The Runner target should inherit its build configuration from Generated.xcconfig.
// However the top-level Runner project should not inherit any build configuration so // However the top-level Runner project should not inherit any build configuration so
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../project.dart'; import '../../xcode_project.dart';
// Update the xcodeproj build location. Legacy build location does not work with Swift Packages. // Update the xcodeproj build location. Legacy build location does not work with Swift Packages.
class ProjectBuildLocationMigration extends ProjectMigrator { class ProjectBuildLocationMigration extends ProjectMigrator {
......
...@@ -6,8 +6,8 @@ import '../../base/common.dart'; ...@@ -6,8 +6,8 @@ import '../../base/common.dart';
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../project.dart';
import '../../reporting/reporting.dart'; import '../../reporting/reporting.dart';
import '../../xcode_project.dart';
// Xcode 11.4 requires linked and embedded frameworks to contain all targeted architectures before build phases are run. // Xcode 11.4 requires linked and embedded frameworks to contain all targeted architectures before build phases are run.
// This caused issues switching between a real device and simulator due to architecture mismatch. // This caused issues switching between a real device and simulator due to architecture mismatch.
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../project.dart'; import '../../xcode_project.dart';
// Xcode legacy build system no longer supported by Xcode. // Xcode legacy build system no longer supported by Xcode.
// Set in https://github.com/flutter/flutter/pull/21901/. // Set in https://github.com/flutter/flutter/pull/21901/.
......
...@@ -6,8 +6,8 @@ import '../application_package.dart'; ...@@ -6,8 +6,8 @@ import '../application_package.dart';
import '../base/file_system.dart'; import '../base/file_system.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../cmake.dart'; import '../cmake.dart';
import '../cmake_project.dart';
import '../globals_null_migrated.dart' as globals; import '../globals_null_migrated.dart' as globals;
import '../project.dart';
abstract class LinuxApp extends ApplicationPackage { abstract class LinuxApp extends ApplicationPackage {
LinuxApp({required String projectBundleId}) : super(id: projectBundleId); LinuxApp({required String projectBundleId}) : super(id: projectBundleId);
......
...@@ -12,11 +12,11 @@ import '../base/utils.dart'; ...@@ -12,11 +12,11 @@ import '../base/utils.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../cache.dart'; import '../cache.dart';
import '../cmake.dart'; import '../cmake.dart';
import '../cmake_project.dart';
import '../convert.dart'; import '../convert.dart';
import '../flutter_plugins.dart'; import '../flutter_plugins.dart';
import '../globals_null_migrated.dart' as globals; import '../globals_null_migrated.dart' as globals;
import '../migrations/cmake_custom_command_migration.dart'; import '../migrations/cmake_custom_command_migration.dart';
import '../project.dart';
// Matches the following error and warning patterns: // Matches the following error and warning patterns:
// - <file path>:<line>:<column>: (fatal) error: <error...> // - <file path>:<line>:<column>: (fatal) error: <error...>
......
...@@ -13,7 +13,7 @@ import '../base/utils.dart'; ...@@ -13,7 +13,7 @@ import '../base/utils.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../globals_null_migrated.dart' as globals; import '../globals_null_migrated.dart' as globals;
import '../ios/plist_parser.dart'; import '../ios/plist_parser.dart';
import '../project.dart'; import '../xcode_project.dart';
/// Tests whether a [FileSystemEntity] is an macOS bundle directory. /// Tests whether a [FileSystemEntity] is an macOS bundle directory.
bool _isBundleDirectory(FileSystemEntity entity) => bool _isBundleDirectory(FileSystemEntity entity) =>
......
...@@ -17,8 +17,8 @@ import '../base/version.dart'; ...@@ -17,8 +17,8 @@ import '../base/version.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../cache.dart'; import '../cache.dart';
import '../ios/xcodeproj.dart'; import '../ios/xcodeproj.dart';
import '../project.dart';
import '../reporting/reporting.dart'; import '../reporting/reporting.dart';
import '../xcode_project.dart';
const String noCocoaPodsConsequence = ''' const String noCocoaPodsConsequence = '''
CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side. CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
......
...@@ -6,8 +6,8 @@ import '../../base/common.dart'; ...@@ -6,8 +6,8 @@ import '../../base/common.dart';
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/project_migrator.dart'; import '../../base/project_migrator.dart';
import '../../project.dart';
import '../../reporting/reporting.dart'; import '../../reporting/reporting.dart';
import '../../xcode_project.dart';
// Remove the linking and embedding logic from the Xcode project to give the tool more control over these. // Remove the linking and embedding logic from the Xcode project to give the tool more control over these.
class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator { class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import '../base/file_system.dart'; import '../base/file_system.dart';
import '../base/logger.dart'; import '../base/logger.dart';
import '../base/project_migrator.dart'; import '../base/project_migrator.dart';
import '../project.dart'; import '../cmake_project.dart';
// CMake's add_custom_command() should use VERBATIM to handle escaping of spaces // CMake's add_custom_command() should use VERBATIM to handle escaping of spaces
// and special characters correctly. // and special characters correctly.
......
This diff is collapsed.
...@@ -11,8 +11,8 @@ import '../base/file_system.dart'; ...@@ -11,8 +11,8 @@ import '../base/file_system.dart';
import '../base/utils.dart'; import '../base/utils.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../cmake.dart'; import '../cmake.dart';
import '../cmake_project.dart';
import '../globals_null_migrated.dart' as globals; import '../globals_null_migrated.dart' as globals;
import '../project.dart';
abstract class WindowsApp extends ApplicationPackage { abstract class WindowsApp extends ApplicationPackage {
WindowsApp({@required String projectBundleId}) : super(id: projectBundleId); WindowsApp({@required String projectBundleId}) : super(id: projectBundleId);
......
...@@ -14,11 +14,11 @@ import '../base/utils.dart'; ...@@ -14,11 +14,11 @@ import '../base/utils.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../cache.dart'; import '../cache.dart';
import '../cmake.dart'; import '../cmake.dart';
import '../cmake_project.dart';
import '../convert.dart'; import '../convert.dart';
import '../flutter_plugins.dart'; import '../flutter_plugins.dart';
import '../globals_null_migrated.dart' as globals; import '../globals_null_migrated.dart' as globals;
import '../migrations/cmake_custom_command_migration.dart'; import '../migrations/cmake_custom_command_migration.dart';
import '../project.dart';
import 'install_manifest.dart'; import 'install_manifest.dart';
import 'visual_studio.dart'; import 'visual_studio.dart';
......
...@@ -12,7 +12,7 @@ import '../base/file_system.dart'; ...@@ -12,7 +12,7 @@ import '../base/file_system.dart';
import '../base/logger.dart'; import '../base/logger.dart';
import '../base/platform.dart'; import '../base/platform.dart';
import '../build_info.dart'; import '../build_info.dart';
import '../project.dart'; import '../cmake_project.dart';
/// Generate an install manifest that is required for CMAKE on UWP projects. /// Generate an install manifest that is required for CMAKE on UWP projects.
Future<void> createManifest({ Future<void> createManifest({
......
This diff is collapsed.
...@@ -11,8 +11,8 @@ import 'package:flutter_tools/src/ios/migrations/project_base_configuration_migr ...@@ -11,8 +11,8 @@ import 'package:flutter_tools/src/ios/migrations/project_base_configuration_migr
import 'package:flutter_tools/src/ios/migrations/project_build_location_migration.dart'; import 'package:flutter_tools/src/ios/migrations/project_build_location_migration.dart';
import 'package:flutter_tools/src/ios/migrations/remove_framework_link_and_embedding_migration.dart'; import 'package:flutter_tools/src/ios/migrations/remove_framework_link_and_embedding_migration.dart';
import 'package:flutter_tools/src/ios/migrations/xcode_build_system_migration.dart'; import 'package:flutter_tools/src/ios/migrations/xcode_build_system_migration.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/xcode_project.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import '../../src/common.dart'; import '../../src/common.dart';
......
...@@ -7,8 +7,8 @@ import 'package:file/memory.dart'; ...@@ -7,8 +7,8 @@ import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/project_migrator.dart'; import 'package:flutter_tools/src/base/project_migrator.dart';
import 'package:flutter_tools/src/macos/migrations/remove_macos_framework_link_and_embedding_migration.dart'; import 'package:flutter_tools/src/macos/migrations/remove_macos_framework_link_and_embedding_migration.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/xcode_project.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import '../../src/common.dart'; import '../../src/common.dart';
......
...@@ -7,8 +7,8 @@ import 'package:file/memory.dart'; ...@@ -7,8 +7,8 @@ import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/project_migrator.dart'; import 'package:flutter_tools/src/base/project_migrator.dart';
import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/cmake_project.dart';
import 'package:flutter_tools/src/migrations/cmake_custom_command_migration.dart'; import 'package:flutter_tools/src/migrations/cmake_custom_command_migration.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import '../../src/common.dart'; import '../../src/common.dart';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment