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
List<String> interpolateStringList(List<String> toInterpolate, Map<String, String> replacementValues) {
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 @@
// found in the LICENSE file.
import 'base/file_system.dart';
import 'project.dart';
import 'cmake_project.dart';
/// 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';
import '../base/file_system.dart';
import '../build_info.dart';
import '../globals_null_migrated.dart' as globals;
import '../project.dart';
import '../xcode_project.dart';
import 'plist_parser.dart';
/// Tests whether a [Directory] is an iOS bundle directory.
......
......@@ -5,7 +5,7 @@
import '../../base/file_system.dart';
import '../../base/logger.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.
class DeploymentTargetMigration extends ProjectMigrator {
......
......@@ -5,7 +5,7 @@
import '../../base/file_system.dart';
import '../../base/logger.dart';
import '../../base/project_migrator.dart';
import '../../project.dart';
import '../../xcode_project.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
......
......@@ -5,7 +5,7 @@
import '../../base/file_system.dart';
import '../../base/logger.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.
class ProjectBuildLocationMigration extends ProjectMigrator {
......
......@@ -6,8 +6,8 @@ import '../../base/common.dart';
import '../../base/file_system.dart';
import '../../base/logger.dart';
import '../../base/project_migrator.dart';
import '../../project.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.
// This caused issues switching between a real device and simulator due to architecture mismatch.
......
......@@ -5,7 +5,7 @@
import '../../base/file_system.dart';
import '../../base/logger.dart';
import '../../base/project_migrator.dart';
import '../../project.dart';
import '../../xcode_project.dart';
// Xcode legacy build system no longer supported by Xcode.
// Set in https://github.com/flutter/flutter/pull/21901/.
......
......@@ -6,8 +6,8 @@ import '../application_package.dart';
import '../base/file_system.dart';
import '../build_info.dart';
import '../cmake.dart';
import '../cmake_project.dart';
import '../globals_null_migrated.dart' as globals;
import '../project.dart';
abstract class LinuxApp extends ApplicationPackage {
LinuxApp({required String projectBundleId}) : super(id: projectBundleId);
......
......@@ -12,11 +12,11 @@ import '../base/utils.dart';
import '../build_info.dart';
import '../cache.dart';
import '../cmake.dart';
import '../cmake_project.dart';
import '../convert.dart';
import '../flutter_plugins.dart';
import '../globals_null_migrated.dart' as globals;
import '../migrations/cmake_custom_command_migration.dart';
import '../project.dart';
// Matches the following error and warning patterns:
// - <file path>:<line>:<column>: (fatal) error: <error...>
......
......@@ -13,7 +13,7 @@ import '../base/utils.dart';
import '../build_info.dart';
import '../globals_null_migrated.dart' as globals;
import '../ios/plist_parser.dart';
import '../project.dart';
import '../xcode_project.dart';
/// Tests whether a [FileSystemEntity] is an macOS bundle directory.
bool _isBundleDirectory(FileSystemEntity entity) =>
......
......@@ -17,8 +17,8 @@ import '../base/version.dart';
import '../build_info.dart';
import '../cache.dart';
import '../ios/xcodeproj.dart';
import '../project.dart';
import '../reporting/reporting.dart';
import '../xcode_project.dart';
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.
......
......@@ -6,8 +6,8 @@ import '../../base/common.dart';
import '../../base/file_system.dart';
import '../../base/logger.dart';
import '../../base/project_migrator.dart';
import '../../project.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.
class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator {
......
......@@ -5,7 +5,7 @@
import '../base/file_system.dart';
import '../base/logger.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
// and special characters correctly.
......
This diff is collapsed.
......@@ -11,8 +11,8 @@ import '../base/file_system.dart';
import '../base/utils.dart';
import '../build_info.dart';
import '../cmake.dart';
import '../cmake_project.dart';
import '../globals_null_migrated.dart' as globals;
import '../project.dart';
abstract class WindowsApp extends ApplicationPackage {
WindowsApp({@required String projectBundleId}) : super(id: projectBundleId);
......
......@@ -14,11 +14,11 @@ import '../base/utils.dart';
import '../build_info.dart';
import '../cache.dart';
import '../cmake.dart';
import '../cmake_project.dart';
import '../convert.dart';
import '../flutter_plugins.dart';
import '../globals_null_migrated.dart' as globals;
import '../migrations/cmake_custom_command_migration.dart';
import '../project.dart';
import 'install_manifest.dart';
import 'visual_studio.dart';
......
......@@ -12,7 +12,7 @@ import '../base/file_system.dart';
import '../base/logger.dart';
import '../base/platform.dart';
import '../build_info.dart';
import '../project.dart';
import '../cmake_project.dart';
/// Generate an install manifest that is required for CMAKE on UWP projects.
Future<void> createManifest({
......
This diff is collapsed.
......@@ -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/remove_framework_link_and_embedding_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/xcode_project.dart';
import 'package:test/fake.dart';
import '../../src/common.dart';
......
......@@ -7,8 +7,8 @@ import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.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/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/xcode_project.dart';
import 'package:test/fake.dart';
import '../../src/common.dart';
......
......@@ -7,8 +7,8 @@ import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/project_migrator.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/project.dart';
import 'package:test/fake.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