Generate a makefile for Linux plugins (#51520)
When generating the plugin registrant for Linux, also generate a
makefile that can be included in the app-level Makefile to manage all of
the plugin targets and flags, exporting them in a few known variables
for use in the outer makefile.
Part of #32720
diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart
index 7fb5e87..50bb3db 100644
--- a/packages/flutter_tools/test/general.shard/plugins_test.dart
+++ b/packages/flutter_tools/test/general.shard/plugins_test.dart
@@ -83,7 +83,13 @@
linuxProject = MockLinuxProject();
when(flutterProject.linux).thenReturn(linuxProject);
when(linuxProject.pluginConfigKey).thenReturn('linux');
- when(linuxProject.pluginSymlinkDirectory).thenReturn(flutterProject.directory.childDirectory('linux').childDirectory('symlinks'));
+ final Directory linuxManagedDirectory = flutterProject.directory.childDirectory('linux').childDirectory('flutter');
+ final Directory linuxEphemeralDirectory = linuxManagedDirectory.childDirectory('ephemeral');
+ when(linuxProject.managedDirectory).thenReturn(linuxManagedDirectory);
+ when(linuxProject.ephemeralDirectory).thenReturn(linuxEphemeralDirectory);
+ when(linuxProject.pluginSymlinkDirectory).thenReturn(linuxEphemeralDirectory.childDirectory('.plugin_symlinks'));
+ when(linuxProject.makeFile).thenReturn(linuxManagedDirectory.parent.childFile('Makefile'));
+ when(linuxProject.generatedPluginMakeFile).thenReturn(linuxManagedDirectory.childFile('generated_plugins.mk'));
when(linuxProject.existsSync()).thenReturn(false);
when(mockClock.now()).thenAnswer(
@@ -871,6 +877,51 @@
FeatureFlags: () => featureFlags,
});
+ testUsingContext('Injecting creates generated Linux registrant', () async {
+ when(linuxProject.existsSync()).thenReturn(true);
+ when(featureFlags.isLinuxEnabled).thenReturn(true);
+ when(flutterProject.isModule).thenReturn(false);
+ configureDummyPackageAsPlugin();
+
+ await injectPlugins(flutterProject, checkProjects: true);
+
+ final File registrantHeader = linuxProject.managedDirectory.childFile('generated_plugin_registrant.h');
+ final File registrantImpl = linuxProject.managedDirectory.childFile('generated_plugin_registrant.cc');
+
+ expect(registrantHeader.existsSync(), isTrue);
+ expect(registrantImpl.existsSync(), isTrue);
+ expect(registrantImpl.readAsStringSync(), contains('SomePluginRegisterWithRegistrar'));
+ }, overrides: <Type, Generator>{
+ FileSystem: () => fs,
+ ProcessManager: () => FakeProcessManager.any(),
+ FeatureFlags: () => featureFlags,
+ });
+
+ testUsingContext('Injecting creates generated Linux plugin makefile', () async {
+ when(linuxProject.existsSync()).thenReturn(true);
+ when(featureFlags.isLinuxEnabled).thenReturn(true);
+ when(flutterProject.isModule).thenReturn(false);
+ configureDummyPackageAsPlugin();
+
+ await injectPlugins(flutterProject, checkProjects: true);
+
+ final File pluginMakefile = linuxProject.generatedPluginMakeFile;
+
+ expect(pluginMakefile.existsSync(), isTrue);
+ final String contents = pluginMakefile.readAsStringSync();
+ expect(contents, contains('libapackage_plugin.so'));
+ // Verify all the variables the app-level Makefile rely on.
+ expect(contents, contains('PLUGIN_TARGETS='));
+ expect(contents, contains('PLUGIN_LIBRARIES='));
+ expect(contents, contains('PLUGIN_LDFLAGS='));
+ expect(contents, contains('PLUGIN_CPPFLAGS='));
+ }, overrides: <Type, Generator>{
+ FileSystem: () => fs,
+ ProcessManager: () => FakeProcessManager.any(),
+ FeatureFlags: () => featureFlags,
+ });
+
+
testUsingContext('Injecting creates generated Windows registrant', () async {
when(windowsProject.existsSync()).thenReturn(true);
when(featureFlags.isWindowsEnabled).thenReturn(true);