// 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/utils.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 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); } }