Add build warning for non-debug desktop builds (#38932)
When building in profile or release mode on desktop, add a prominent
warning that it's actually a debug build. This is to help address issues
with people being unaware of the current state of builds due to
following third-party guides rather than official documentation.
macOS is not included since PRs are in flight for macOS release support.
diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart
index 0e6fd7e..fc87fef 100644
--- a/packages/flutter_tools/lib/src/linux/build_linux.dart
+++ b/packages/flutter_tools/lib/src/linux/build_linux.dart
@@ -38,6 +38,15 @@
..createSync(recursive: true)
..writeAsStringSync(buffer.toString());
+ if (!buildInfo.isDebug) {
+ const String warning = '🚧 ';
+ printStatus(warning * 20);
+ printStatus('Warning: Only debug is currently implemented for Linux. This is effectively a debug build.');
+ printStatus('See https://github.com/flutter/flutter/issues/38478 for details and updates.');
+ printStatus(warning * 20);
+ printStatus('');
+ }
+
// Invoke make.
final Stopwatch sw = Stopwatch()..start();
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 05e7f5a..0c51060 100644
--- a/packages/flutter_tools/lib/src/windows/build_windows.dart
+++ b/packages/flutter_tools/lib/src/windows/build_windows.dart
@@ -42,6 +42,15 @@
'Please run `flutter doctor` for more details.');
}
+ if (!buildInfo.isDebug) {
+ const String warning = '🚧 ';
+ printStatus(warning * 20);
+ printStatus('Warning: Only debug is currently implemented for Windows. This is effectively a debug build.');
+ printStatus('See https://github.com/flutter/flutter/issues/38477 for details and updates.');
+ printStatus(warning * 20);
+ printStatus('');
+ }
+
final String buildScript = fs.path.join(
Cache.flutterRoot,
'packages',
diff --git a/packages/flutter_tools/test/general.shard/commands/build_linux_test.dart b/packages/flutter_tools/test/general.shard/commands/build_linux_test.dart
index 0e1c809..7cdb2a8 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_linux_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_linux_test.dart
@@ -7,10 +7,12 @@
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
+import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/features.dart';
+import 'package:flutter_tools/src/globals.dart';
import 'package:flutter_tools/src/linux/makefile.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:mockito/mockito.dart';
@@ -131,6 +133,35 @@
}, overrides: <Type, Generator>{
FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: false),
});
+
+ testUsingContext('Release build prints an under-construction warning', () async {
+ final BuildCommand command = BuildCommand();
+ applyMocksToCommand(command);
+ 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',
+ '-C',
+ '/linux',
+ ], runInShell: true)).thenAnswer((Invocation invocation) async {
+ return mockProcess;
+ });
+
+ await createTestCommandRunner(command).run(
+ const <String>['build', 'linux']
+ );
+
+ final BufferLogger bufferLogger = logger;
+ expect(bufferLogger.statusText, contains('🚧'));
+ }, overrides: <Type, Generator>{
+ FileSystem: () => MemoryFileSystem(),
+ ProcessManager: () => mockProcessManager,
+ Platform: () => linuxPlatform,
+ FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true),
+ });
}
class MockProcessManager extends Mock implements ProcessManager {}
diff --git a/packages/flutter_tools/test/general.shard/commands/build_windows_test.dart b/packages/flutter_tools/test/general.shard/commands/build_windows_test.dart
index 948eae0..81debd3 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_windows_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_windows_test.dart
@@ -6,10 +6,12 @@
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
+import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/features.dart';
+import 'package:flutter_tools/src/globals.dart';
import 'package:flutter_tools/src/windows/visual_studio.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
@@ -139,6 +141,38 @@
VisualStudio: () => mockVisualStudio,
FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true),
});
+
+ testUsingContext('Release build prints an under-construction warning', () async {
+ final BuildCommand command = BuildCommand();
+ applyMocksToCommand(command);
+ fs.file(solutionPath).createSync(recursive: true);
+ 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',
+ vcvarsPath,
+ fs.path.basename(solutionPath),
+ 'Release',
+ ], workingDirectory: fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
+ return mockProcess;
+ });
+
+ await createTestCommandRunner(command).run(
+ const <String>['build', 'windows']
+ );
+
+ final BufferLogger bufferLogger = logger;
+ expect(bufferLogger.statusText, contains('🚧'));
+ }, overrides: <Type, Generator>{
+ FileSystem: () => memoryFilesystem,
+ ProcessManager: () => mockProcessManager,
+ Platform: () => windowsPlatform,
+ VisualStudio: () => mockVisualStudio,
+ FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true),
+ });
}
class MockProcessManager extends Mock implements ProcessManager {}