Add --target support for Windows and Linux (#34660)
- Adds desktop projects to ApplicationPackageStore
- Plumbs target overrides through the desktop builds
diff --git a/packages/flutter_tools/bin/tool_backend.dart b/packages/flutter_tools/bin/tool_backend.dart
index 96322f2..09de95b 100644
--- a/packages/flutter_tools/bin/tool_backend.dart
+++ b/packages/flutter_tools/bin/tool_backend.dart
@@ -13,7 +13,7 @@
final String projectDirectory = Platform.environment['PROJECT_DIR'];
final bool verbose = Platform.environment['VERBOSE_SCRIPT_LOGGING'] != null;
final bool trackWidgetCreation = Platform.environment['TRACK_WIDGET_CREATION'] != null;
- final String flutterTarget = Platform.environment['FLUTTER_TARGET'] ?? 'lib/main.dart';
+ final String flutterTarget = Platform.environment['FLUTTER_TARGET'] ?? path.join('lib', 'main.dart');
final String flutterEngine = Platform.environment['FLUTTER_ENGINE'];
final String localEngine = Platform.environment['LOCAL_ENGINE'];
final String flutterRoot = Platform.environment['FLUTTER_ROOT'];
diff --git a/packages/flutter_tools/lib/src/bundle.dart b/packages/flutter_tools/lib/src/bundle.dart
index 42fd38a..f298114 100644
--- a/packages/flutter_tools/lib/src/bundle.dart
+++ b/packages/flutter_tools/lib/src/bundle.dart
@@ -18,7 +18,7 @@
import 'globals.dart';
import 'project.dart';
-const String defaultMainPath = 'lib/main.dart';
+String get defaultMainPath => fs.path.join('lib', 'main.dart');
const String defaultAssetBasePath = '.';
const String defaultManifestPath = 'pubspec.yaml';
String get defaultDepfilePath => fs.path.join(getBuildDirectory(), 'snapshot_blob.bin.d');
@@ -55,7 +55,7 @@
Future<void> build({
TargetPlatform platform,
BuildMode buildMode,
- String mainPath = defaultMainPath,
+ String mainPath,
String manifestPath = defaultManifestPath,
String applicationKernelFilePath,
String depfilePath,
@@ -70,6 +70,7 @@
List<String> fileSystemRoots,
String fileSystemScheme,
}) async {
+ mainPath ??= defaultMainPath;
depfilePath ??= defaultDepfilePath;
assetDirPath ??= getAssetBuildDirectory();
packagesPath ??= fs.path.absolute(PackageMap.globalPackagesPath);
diff --git a/packages/flutter_tools/lib/src/commands/build_linux.dart b/packages/flutter_tools/lib/src/commands/build_linux.dart
index c1f15dd..4175b6d 100644
--- a/packages/flutter_tools/lib/src/commands/build_linux.dart
+++ b/packages/flutter_tools/lib/src/commands/build_linux.dart
@@ -16,6 +16,7 @@
/// A command to build a linux desktop target through a build shell script.
class BuildLinuxCommand extends BuildSubCommand {
BuildLinuxCommand() {
+ usesTargetOption();
argParser.addFlag('debug',
negatable: false,
help: 'Build a debug version of your app.',
@@ -59,7 +60,7 @@
if (!flutterProject.linux.existsSync()) {
throwToolExit('No Linux desktop project configured.');
}
- await buildLinux(flutterProject.linux, buildInfo);
+ await buildLinux(flutterProject.linux, buildInfo, target: targetFile);
return null;
}
}
diff --git a/packages/flutter_tools/lib/src/commands/build_windows.dart b/packages/flutter_tools/lib/src/commands/build_windows.dart
index 2f59aec..884d26f 100644
--- a/packages/flutter_tools/lib/src/commands/build_windows.dart
+++ b/packages/flutter_tools/lib/src/commands/build_windows.dart
@@ -16,6 +16,7 @@
/// A command to build a windows desktop target through a build shell script.
class BuildWindowsCommand extends BuildSubCommand {
BuildWindowsCommand() {
+ usesTargetOption();
argParser.addFlag('debug',
negatable: false,
help: 'Build a debug version of your app.',
@@ -59,7 +60,7 @@
if (!flutterProject.windows.existsSync()) {
throwToolExit('No Windows desktop project configured.');
}
- await buildWindows(flutterProject.windows, buildInfo);
+ await buildWindows(flutterProject.windows, buildInfo, target: targetFile);
return null;
}
}
diff --git a/packages/flutter_tools/lib/src/linux/linux_device.dart b/packages/flutter_tools/lib/src/linux/linux_device.dart
index 3746aa5..17b8002 100644
--- a/packages/flutter_tools/lib/src/linux/linux_device.dart
+++ b/packages/flutter_tools/lib/src/linux/linux_device.dart
@@ -81,7 +81,11 @@
}) async {
_lastBuiltMode = debuggingOptions.buildInfo.mode;
if (!prebuiltApplication) {
- await buildLinux(FlutterProject.current().linux, debuggingOptions.buildInfo);
+ await buildLinux(
+ FlutterProject.current().linux,
+ debuggingOptions.buildInfo,
+ target: mainPath,
+ );
}
await stopApp(package);
final Process process = await processManager.start(<String>[
diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart
index 781b095..9f1a82c 100644
--- a/packages/flutter_tools/lib/src/windows/build_windows.dart
+++ b/packages/flutter_tools/lib/src/windows/build_windows.dart
@@ -18,13 +18,15 @@
import 'visual_studio.dart';
/// Builds the Windows project using msbuild.
-Future<void> buildWindows(WindowsProject windowsProject, BuildInfo buildInfo, {String target = 'lib/main.dart'}) async {
+Future<void> buildWindows(WindowsProject windowsProject, BuildInfo buildInfo, {String target}) async {
final Map<String, String> environment = <String, String>{
'FLUTTER_ROOT': Cache.flutterRoot,
- 'FLUTTER_TARGET': target,
'PROJECT_DIR': windowsProject.project.directory.path,
'TRACK_WIDGET_CREATION': (buildInfo?.trackWidgetCreation == true).toString(),
};
+ if (target != null) {
+ environment['FLUTTER_TARGET'] = target;
+ }
if (artifacts is LocalEngineArtifacts) {
final LocalEngineArtifacts localEngineArtifacts = artifacts;
final String engineOutPath = localEngineArtifacts.engineOutPath;
diff --git a/packages/flutter_tools/lib/src/windows/windows_device.dart b/packages/flutter_tools/lib/src/windows/windows_device.dart
index d55df6d..f2e5e10 100644
--- a/packages/flutter_tools/lib/src/windows/windows_device.dart
+++ b/packages/flutter_tools/lib/src/windows/windows_device.dart
@@ -82,7 +82,11 @@
bool ipv6 = false,
}) async {
if (!prebuiltApplication) {
- await buildWindows(FlutterProject.current().windows, debuggingOptions.buildInfo);
+ await buildWindows(
+ FlutterProject.current().windows,
+ debuggingOptions.buildInfo,
+ target: mainPath,
+ );
}
await stopApp(package);
final Process process = await processManager.start(<String>[
diff --git a/packages/flutter_tools/test/commands/attach_test.dart b/packages/flutter_tools/test/commands/attach_test.dart
index bf5730d..769f315 100644
--- a/packages/flutter_tools/test/commands/attach_test.dart
+++ b/packages/flutter_tools/test/commands/attach_test.dart
@@ -34,7 +34,7 @@
setUp(() {
Cache.disableLocking();
testFileSystem.directory('lib').createSync();
- testFileSystem.file('lib/main.dart').createSync();
+ testFileSystem.file(testFileSystem.path.join('lib', 'main.dart')).createSync();
});
group('with one device and no specified target file', () {
@@ -246,7 +246,7 @@
..createSync();
// Delete the main.dart file to be sure that attach works without it.
- fs.file('lib/main.dart').deleteSync();
+ fs.file(fs.path.join('lib', 'main.dart')).deleteSync();
final AttachCommand command = AttachCommand(hotRunnerFactory: mockHotRunnerFactory);
await createTestCommandRunner(command).run(<String>['attach', '-t', foo.path, '-v']);
diff --git a/packages/flutter_tools/test/commands/build_linux_test.dart b/packages/flutter_tools/test/commands/build_linux_test.dart
index da9d918..312d1d2 100644
--- a/packages/flutter_tools/test/commands/build_linux_test.dart
+++ b/packages/flutter_tools/test/commands/build_linux_test.dart
@@ -63,6 +63,7 @@
fs.file('linux/build.sh').createSync(recursive: true);
fs.file('pubspec.yaml').createSync();
fs.file('.packages').createSync();
+ fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
expect(createTestCommandRunner(command).run(
const <String>['build', 'linux']
@@ -78,6 +79,7 @@
fs.file('linux/build.sh').createSync(recursive: true);
fs.file('pubspec.yaml').createSync();
fs.file('.packages').createSync();
+ fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
when(mockProcessManager.start(<String>[
'make',
diff --git a/packages/flutter_tools/test/commands/build_windows_test.dart b/packages/flutter_tools/test/commands/build_windows_test.dart
index 4c7b9e3..7784797 100644
--- a/packages/flutter_tools/test/commands/build_windows_test.dart
+++ b/packages/flutter_tools/test/commands/build_windows_test.dart
@@ -87,6 +87,7 @@
when(mockVisualStudio.vcvarsPath).thenReturn(vcvarsPath);
fs.file('pubspec.yaml').createSync();
fs.file('.packages').createSync();
+ fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
expect(createTestCommandRunner(command).run(
const <String>['build', 'windows']
@@ -104,6 +105,7 @@
when(mockVisualStudio.vcvarsPath).thenReturn(vcvarsPath);
fs.file('pubspec.yaml').createSync();
fs.file('.packages').createSync();
+ fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
when(mockProcessManager.start(<String>[
r'C:\packages\flutter_tools\bin\vs_build.bat',