Unverified Commit 8663aea5 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] run UWP builds ahead of cmake (#80879)

parent 9c0270d9
...@@ -164,12 +164,72 @@ Future<void> buildWindowsUwp(WindowsUwpProject windowsProject, BuildInfo buildIn ...@@ -164,12 +164,72 @@ Future<void> buildWindowsUwp(WindowsUwpProject windowsProject, BuildInfo buildIn
'Building Windows application...', 'Building Windows application...',
); );
try { try {
// The Cmake re-entrant build does not work for UWP, so the flutter build is
// run in advance.
await _runFlutterBuild(buildDirectory, buildInfo, target);
await _runCmakeGeneration(cmakePath, buildDirectory, windowsProject.cmakeFile.parent); await _runCmakeGeneration(cmakePath, buildDirectory, windowsProject.cmakeFile.parent);
await _runBuild(cmakePath, buildDirectory, buildModeName, install: false); await _runBuild(cmakePath, buildDirectory, buildModeName, install: false);
} finally { } finally {
status.cancel(); status.cancel();
} }
throwToolExit('Windows UWP builds are not implemented.'); }
const Map<BuildMode, String> _targets = <BuildMode, String>{
BuildMode.debug: 'debug_bundle_windows_assets_uwp',
BuildMode.profile: 'profile_bundle_windows_assets_uwp',
BuildMode.release: 'release_bundle_windows_assets_uwp',
};
Future<void> _runFlutterBuild(Directory buildDirectory, BuildInfo buildInfo, String targetFile) async {
await buildDirectory.create(recursive: true);
int result;
String flutterEngine;
String localEngine;
if (globals.artifacts is LocalEngineArtifacts) {
final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
final String engineOutPath = localEngineArtifacts.engineOutPath;
flutterEngine = globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath));
localEngine = globals.fs.path.basename(engineOutPath);
}
try {
result = await globals.processUtils.stream(
<String>[
globals.fs.path.join(Cache.flutterRoot, 'bin', 'flutter'),
if (globals.logger.isVerbose)
'--verbose',
if (flutterEngine != null) '--local-engine-src-path=$flutterEngine',
if (localEngine != null) '--local-engine=$localEngine',
'assemble',
'--no-version-check',
'--output=build',
'-dTargetPlatform=windows-uwp-x64',
'-dTrackWidgetCreation=${buildInfo.trackWidgetCreation}',
'-dBuildMode=${getNameForBuildMode(buildInfo.mode)}',
'-dTargetFile=$targetFile',
'-dTreeShakeIcons="${buildInfo.treeShakeIcons}"',
'-dDartObfuscation=${buildInfo.dartObfuscation}',
if (buildInfo.bundleSkSLPath != null)
'-iBundleSkSLPath=${buildInfo.bundleSkSLPath}',
if (buildInfo.codeSizeDirectory != null)
'-dCodeSizeDirectory=${buildInfo.codeSizeDirectory}',
if (buildInfo.splitDebugInfoPath != null)
'-dSplitDebugInfo=${buildInfo.splitDebugInfoPath}',
if (buildInfo.dartDefines != null && buildInfo.dartDefines.isNotEmpty)
'--DartDefines=${encodeDartDefines(buildInfo.dartDefines)}',
if (buildInfo.extraGenSnapshotOptions != null && buildInfo.extraGenSnapshotOptions.isNotEmpty)
'--ExtraGenSnapshotOptions=${buildInfo.extraGenSnapshotOptions}',
if (buildInfo.extraFrontEndOptions != null && buildInfo.extraFrontEndOptions.isNotEmpty)
'--ExtraFrontEndOptions=${buildInfo.extraFrontEndOptions}',
_targets[buildInfo.mode],
],
trace: true,
);
} on ArgumentError {
throwToolExit("cmake not found. Run 'flutter doctor' for more information.");
}
if (result != 0) {
throwToolExit('Unable to generate build files');
}
} }
Future<void> _runCmakeGeneration(String cmakePath, Directory buildDir, Directory sourceDir) async { Future<void> _runCmakeGeneration(String cmakePath, Directory buildDir, Directory sourceDir) async {
......
...@@ -51,5 +51,5 @@ Future<void> createManifest({ ...@@ -51,5 +51,5 @@ Future<void> createManifest({
outputs.add(project.ephemeralDirectory.childFile('icudtl.dat')); outputs.add(project.ephemeralDirectory.childFile('icudtl.dat'));
project.ephemeralDirectory.childFile('install_manifest') project.ephemeralDirectory.childFile('install_manifest')
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync(outputs.map((File file) => file.absolute.path).join('\n')); ..writeAsStringSync(outputs.map((File file) => file.absolute.uri.path.substring(1)).join('\n'));
} }
...@@ -53,6 +53,7 @@ void main() { ...@@ -53,6 +53,7 @@ void main() {
setUpAll(() { setUpAll(() {
Cache.disableLocking(); Cache.disableLocking();
Cache.flutterRoot = '';
}); });
setUp(() { setUp(() {
...@@ -530,7 +531,7 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier ...@@ -530,7 +531,7 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier
setUpMockProjectFilesForBuild(); setUpMockProjectFilesForBuild();
// This message should include 'To enable, run "flutter config --enable-windows-uwp-desktop"." // This message should include 'To enable, run "flutter config --enable-windows-uwp-desktop"."
// once the `windowsUwpEmbedding` feature is available on all platforms. // once the `windowsUwpEmbedding` feature is available on all channels.
expect(createTestCommandRunner(command).run( expect(createTestCommandRunner(command).run(
const <String>['winuwp', '--no-pub'] const <String>['winuwp', '--no-pub']
), throwsToolExit(message: RegExp(r'"build winuwp" is not currently supported\.$'))); ), throwsToolExit(message: RegExp(r'"build winuwp" is not currently supported\.$')));
...@@ -541,19 +542,34 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier ...@@ -541,19 +542,34 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier
FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: false), FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: false),
}); });
testUsingContext('Windows UWP build fails after writing Cmake file', () async { testUsingContext('Windows UWP build completes successfully', () async {
final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(cmakePath); final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(cmakePath);
final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() final BuildWindowsUwpCommand command = BuildWindowsUwpCommand()
..visualStudioOverride = fakeVisualStudio; ..visualStudioOverride = fakeVisualStudio;
setUpMockUwpFilesForBuild(0); setUpMockUwpFilesForBuild(0);
expect(createTestCommandRunner(command).run( await createTestCommandRunner(command).run(
const <String>['winuwp', '--no-pub'] const <String>['winuwp', '--no-pub']
), throwsToolExit(message: 'Windows UWP builds are not implemented')); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Platform: () => windowsPlatform, Platform: () => windowsPlatform,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[ ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>[
r'C:\flutter\bin\flutter',
'assemble',
'--no-version-check',
'--output=build',
'-dTargetPlatform=windows-uwp-x64',
'-dTrackWidgetCreation=true',
'-dBuildMode=release',
r'-dTargetFile=lib\main.dart',
'-dTreeShakeIcons="true"',
'-dDartObfuscation=false',
'release_bundle_windows_assets_uwp'
],
),
cmakeGenerationCommand(winuwp: true), cmakeGenerationCommand(winuwp: true),
buildCommand('Release', stdout: 'STDOUT STUFF', winuwp: true), buildCommand('Release', stdout: 'STDOUT STUFF', winuwp: true),
]), ]),
......
...@@ -22,7 +22,7 @@ void main() { ...@@ -22,7 +22,7 @@ void main() {
FileSystem fileSystem; FileSystem fileSystem;
setUp(() { setUp(() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
}); });
testUsingContext('Generates install manifest for a debug build', () async { testUsingContext('Generates install manifest for a debug build', () async {
...@@ -44,11 +44,11 @@ void main() { ...@@ -44,11 +44,11 @@ void main() {
final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest'); final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest');
expect(manifest, exists); expect(manifest, exists);
expect(manifest.readAsLinesSync(), unorderedEquals(<String>[ expect(manifest.readAsLinesSync(), unorderedEquals(<String>[
'/build/winuwp/flutter_assets/kernel_blob.bin', 'C:/build/winuwp/flutter_assets/kernel_blob.bin',
'/build/winuwp/flutter_assets/AssetManifest.json', 'C:/build/winuwp/flutter_assets/AssetManifest.json',
'/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll', 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll',
'/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb', 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb',
'/winuwp/flutter/ephemeral/icudtl.dat', 'C:/winuwp/flutter/ephemeral/icudtl.dat',
])); ]));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
...@@ -74,11 +74,11 @@ void main() { ...@@ -74,11 +74,11 @@ void main() {
final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest'); final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest');
expect(manifest, exists); expect(manifest, exists);
expect(manifest.readAsLinesSync(), unorderedEquals(<String>[ expect(manifest.readAsLinesSync(), unorderedEquals(<String>[
'/build/winuwp/app.so', 'C:/build/winuwp/app.so',
'/build/winuwp/flutter_assets/AssetManifest.json', 'C:/build/winuwp/flutter_assets/AssetManifest.json',
'/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll', 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll',
'/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb', 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb',
'/winuwp/flutter/ephemeral/icudtl.dat' 'C:/winuwp/flutter/ephemeral/icudtl.dat'
])); ]));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
...@@ -128,14 +128,14 @@ flutter: ...@@ -128,14 +128,14 @@ flutter:
final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest'); final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest');
expect(manifest, exists); expect(manifest, exists);
expect(manifest.readAsLinesSync(), unorderedEquals(<String>[ expect(manifest.readAsLinesSync(), unorderedEquals(<String>[
'/build/winuwp/app.so', 'C:/build/winuwp/app.so',
'/build/winuwp/flutter_assets/assets/foo.png', 'C:/build/winuwp/flutter_assets/assets/foo.png',
'/build/winuwp/flutter_assets/AssetManifest.json', 'C:/build/winuwp/flutter_assets/AssetManifest.json',
'/build/winuwp/flutter_assets/FontManifest.json', 'C:/build/winuwp/flutter_assets/FontManifest.json',
'/build/winuwp/flutter_assets/NOTICES', 'C:/build/winuwp/flutter_assets/NOTICES',
'/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll', 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll',
'/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb', 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb',
'/winuwp/flutter/ephemeral/icudtl.dat' 'C:/winuwp/flutter/ephemeral/icudtl.dat'
])); ]));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment