1 | // Copyright 2014 The Flutter Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | import 'base/file_system.dart'; |
6 | import 'base/utils.dart'; |
7 | import 'platform_plugins.dart'; |
8 | import 'project.dart'; |
9 | |
10 | /// Represents a CMake-based sub-project. |
11 | /// |
12 | /// This defines interfaces common to Windows and Linux projects. |
13 | abstract class CmakeBasedProject { |
14 | /// The parent of this project. |
15 | FlutterProject get parent; |
16 | |
17 | /// Whether the subproject (either Windows or Linux) exists in the Flutter project. |
18 | bool existsSync(); |
19 | |
20 | /// The native project CMake specification. |
21 | File get cmakeFile; |
22 | |
23 | /// Contains definitions for the Flutter library and the tool. |
24 | File get managedCmakeFile; |
25 | |
26 | /// Contains definitions for FLUTTER_ROOT, LOCAL_ENGINE, and more flags for |
27 | /// the build. |
28 | File get generatedCmakeConfigFile; |
29 | |
30 | /// Included CMake with rules and variables for plugin builds. |
31 | File get generatedPluginCmakeFile; |
32 | |
33 | /// The directory to write plugin symlinks. |
34 | Directory get pluginSymlinkDirectory; |
35 | } |
36 | |
37 | /// The Windows sub project. |
38 | class WindowsProject extends FlutterProjectPlatform implements CmakeBasedProject { |
39 | WindowsProject.fromFlutter(this.parent); |
40 | |
41 | @override |
42 | final FlutterProject parent; |
43 | |
44 | @override |
45 | String get pluginConfigKey => WindowsPlugin.kConfigKey; |
46 | |
47 | String get _childDirectory => 'windows' ; |
48 | |
49 | @override |
50 | bool existsSync() => _editableDirectory.existsSync() && cmakeFile.existsSync(); |
51 | |
52 | @override |
53 | File get cmakeFile => _editableDirectory.childFile('CMakeLists.txt' ); |
54 | |
55 | @override |
56 | File get managedCmakeFile => managedDirectory.childFile('CMakeLists.txt' ); |
57 | |
58 | @override |
59 | File get generatedCmakeConfigFile => ephemeralDirectory.childFile('generated_config.cmake' ); |
60 | |
61 | @override |
62 | File get generatedPluginCmakeFile => managedDirectory.childFile('generated_plugins.cmake' ); |
63 | |
64 | /// The native entrypoint's CMake specification. |
65 | File get runnerCmakeFile => runnerDirectory.childFile('CMakeLists.txt' ); |
66 | |
67 | /// The native entrypoint's file that adds Flutter to the window. |
68 | File get runnerFlutterWindowFile => runnerDirectory.childFile('flutter_window.cpp' ); |
69 | |
70 | /// The native entrypoint's resource file. Used to configure things |
71 | /// like the application icon, name, and version. |
72 | File get runnerResourceFile => runnerDirectory.childFile('Runner.rc' ); |
73 | |
74 | @override |
75 | Directory get pluginSymlinkDirectory => ephemeralDirectory.childDirectory('.plugin_symlinks' ); |
76 | |
77 | Directory get _editableDirectory => parent.directory.childDirectory(_childDirectory); |
78 | |
79 | /// The directory in the project that is managed by Flutter. As much as |
80 | /// possible, files that are edited by Flutter tooling after initial project |
81 | /// creation should live here. |
82 | Directory get managedDirectory => _editableDirectory.childDirectory('flutter' ); |
83 | |
84 | /// The subdirectory of [managedDirectory] that contains files that are |
85 | /// generated on the fly. All generated files that are not intended to be |
86 | /// checked in should live here. |
87 | Directory get ephemeralDirectory => managedDirectory.childDirectory('ephemeral' ); |
88 | |
89 | /// The directory in the project that is owned by the app. As much as |
90 | /// possible, Flutter tooling should not edit files in this directory after |
91 | /// initial project creation. |
92 | Directory get runnerDirectory => _editableDirectory.childDirectory('runner' ); |
93 | |
94 | Future<void> ensureReadyForPlatformSpecificTooling() async {} |
95 | } |
96 | |
97 | /// The Linux sub project. |
98 | class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { |
99 | LinuxProject.fromFlutter(this.parent); |
100 | |
101 | @override |
102 | final FlutterProject parent; |
103 | |
104 | @override |
105 | String get pluginConfigKey => LinuxPlugin.kConfigKey; |
106 | |
107 | static final _applicationIdPattern = RegExp( |
108 | r'''^\s*set\s*\(\s*APPLICATION_ID\s*"(.*)"\s*\)\s*$''' , |
109 | ); |
110 | |
111 | Directory get _editableDirectory => parent.directory.childDirectory('linux' ); |
112 | |
113 | /// The directory in the project that is managed by Flutter. As much as |
114 | /// possible, files that are edited by Flutter tooling after initial project |
115 | /// creation should live here. |
116 | Directory get managedDirectory => _editableDirectory.childDirectory('flutter' ); |
117 | |
118 | /// The subdirectory of [managedDirectory] that contains files that are |
119 | /// generated on the fly. All generated files that are not intended to be |
120 | /// checked in should live here. |
121 | Directory get ephemeralDirectory => managedDirectory.childDirectory('ephemeral' ); |
122 | |
123 | @override |
124 | bool existsSync() => _editableDirectory.existsSync(); |
125 | |
126 | @override |
127 | File get cmakeFile => _editableDirectory.childFile('CMakeLists.txt' ); |
128 | |
129 | @override |
130 | File get managedCmakeFile => managedDirectory.childFile('CMakeLists.txt' ); |
131 | |
132 | @override |
133 | File get generatedCmakeConfigFile => ephemeralDirectory.childFile('generated_config.cmake' ); |
134 | |
135 | @override |
136 | File get generatedPluginCmakeFile => managedDirectory.childFile('generated_plugins.cmake' ); |
137 | |
138 | @override |
139 | Directory get pluginSymlinkDirectory => ephemeralDirectory.childDirectory('.plugin_symlinks' ); |
140 | |
141 | Future<void> ensureReadyForPlatformSpecificTooling() async {} |
142 | |
143 | String? get applicationId { |
144 | return firstMatchInFile(cmakeFile, _applicationIdPattern)?.group(1); |
145 | } |
146 | } |
147 | |