Unverified Commit d82ef351 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Use assemble build system directly for build ios-framework (#60041)

parent 6a2bc261
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
import 'dart:async'; import 'dart:async';
import '../bundle.dart';
import '../commands/build_linux.dart'; import '../commands/build_linux.dart';
import '../commands/build_macos.dart'; import '../commands/build_macos.dart';
import '../commands/build_windows.dart'; import '../commands/build_windows.dart';
...@@ -29,7 +28,6 @@ class BuildCommand extends FlutterCommand { ...@@ -29,7 +28,6 @@ class BuildCommand extends FlutterCommand {
addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp)); addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
addSubcommand(BuildIOSFrameworkCommand( addSubcommand(BuildIOSFrameworkCommand(
buildSystem: globals.buildSystem, buildSystem: globals.buildSystem,
bundleBuilder: BundleBuilder(),
)); ));
addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp)); addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
addSubcommand(BuildWebCommand(verboseHelp: verboseHelp)); addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
......
...@@ -19,12 +19,10 @@ import '../build_system/build_system.dart'; ...@@ -19,12 +19,10 @@ import '../build_system/build_system.dart';
import '../build_system/targets/common.dart'; import '../build_system/targets/common.dart';
import '../build_system/targets/icon_tree_shaker.dart'; import '../build_system/targets/icon_tree_shaker.dart';
import '../build_system/targets/ios.dart'; import '../build_system/targets/ios.dart';
import '../bundle.dart';
import '../cache.dart'; import '../cache.dart';
import '../convert.dart'; import '../convert.dart';
import '../globals.dart' as globals; import '../globals.dart' as globals;
import '../macos/cocoapod_utils.dart'; import '../macos/cocoapod_utils.dart';
import '../macos/xcode.dart';
import '../plugins.dart'; import '../plugins.dart';
import '../project.dart'; import '../project.dart';
import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult; import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult;
...@@ -38,13 +36,11 @@ import 'build.dart'; ...@@ -38,13 +36,11 @@ import 'build.dart';
class BuildIOSFrameworkCommand extends BuildSubCommand { class BuildIOSFrameworkCommand extends BuildSubCommand {
BuildIOSFrameworkCommand({ BuildIOSFrameworkCommand({
FlutterVersion flutterVersion, // Instantiating FlutterVersion kicks off networking, so delay until it's needed, but allow test injection. FlutterVersion flutterVersion, // Instantiating FlutterVersion kicks off networking, so delay until it's needed, but allow test injection.
@required BundleBuilder bundleBuilder,
@required BuildSystem buildSystem, @required BuildSystem buildSystem,
Cache cache, Cache cache,
Platform platform Platform platform
}) : _flutterVersion = flutterVersion, }) : _flutterVersion = flutterVersion,
_buildSystem = buildSystem, _buildSystem = buildSystem,
_bundleBuilder = bundleBuilder,
_injectedCache = cache, _injectedCache = cache,
_injectedPlatform = platform { _injectedPlatform = platform {
addTreeShakeIconsFlag(); addTreeShakeIconsFlag();
...@@ -98,7 +94,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -98,7 +94,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
); );
} }
final BundleBuilder _bundleBuilder;
final BuildSystem _buildSystem; final BuildSystem _buildSystem;
BuildSystem get buildSystem => _buildSystem ?? globals.buildSystem; BuildSystem get buildSystem => _buildSystem ?? globals.buildSystem;
...@@ -188,8 +183,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -188,8 +183,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
if (modeDirectory.existsSync()) { if (modeDirectory.existsSync()) {
modeDirectory.deleteSync(recursive: true); modeDirectory.deleteSync(recursive: true);
} }
final Directory iPhoneBuildOutput = modeDirectory.childDirectory('iphoneos');
final Directory simulatorBuildOutput = modeDirectory.childDirectory('iphonesimulator');
if (boolArg('cocoapods')) { if (boolArg('cocoapods')) {
// FlutterVersion.instance kicks off git processing which can sometimes fail, so don't try it until needed. // FlutterVersion.instance kicks off git processing which can sometimes fail, so don't try it until needed.
...@@ -201,10 +194,12 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -201,10 +194,12 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
} }
// Build aot, create module.framework and copy. // Build aot, create module.framework and copy.
await _produceAppFramework(buildInfo, iPhoneBuildOutput, simulatorBuildOutput, modeDirectory); await _produceAppFramework(buildInfo, modeDirectory);
// Build and copy plugins. // Build and copy plugins.
await processPodsIfNeeded(_project.ios, getIosBuildDirectory(), buildInfo.mode); await processPodsIfNeeded(_project.ios, getIosBuildDirectory(), buildInfo.mode);
final Directory iPhoneBuildOutput = modeDirectory.childDirectory('iphoneos');
final Directory simulatorBuildOutput = modeDirectory.childDirectory('iphonesimulator');
if (hasPlugins(_project)) { if (hasPlugins(_project)) {
await _producePlugins(buildInfo.mode, xcodeBuildConfiguration, iPhoneBuildOutput, simulatorBuildOutput, modeDirectory, outputDirectory); await _producePlugins(buildInfo.mode, xcodeBuildConfiguration, iPhoneBuildOutput, simulatorBuildOutput, modeDirectory, outputDirectory);
} }
...@@ -345,100 +340,26 @@ end ...@@ -345,100 +340,26 @@ end
await _produceXCFramework(buildInfo, fatFlutterFrameworkCopy); await _produceXCFramework(buildInfo, fatFlutterFrameworkCopy);
} }
Future<void> _produceAppFramework(BuildInfo buildInfo, Directory iPhoneBuildOutput, Directory simulatorBuildOutput, Directory modeDirectory) async { Future<void> _produceAppFramework(BuildInfo buildInfo, Directory modeDirectory) async {
const String appFrameworkName = 'App.framework';
final Directory destinationAppFrameworkDirectory = modeDirectory.childDirectory(appFrameworkName);
if (buildInfo.mode == BuildMode.debug) {
final Status status = globals.logger.startProgress(' ├─Adding placeholder App.framework for debug...', timeout: timeoutConfiguration.fastOperation);
try {
destinationAppFrameworkDirectory.createSync(recursive: true);
await _produceStubAppFrameworkIfNeeded(buildInfo, iPhoneBuildOutput, simulatorBuildOutput, destinationAppFrameworkDirectory);
} finally {
status.stop();
}
} else {
await _produceAotAppFrameworkIfNeeded(buildInfo, modeDirectory);
}
final File sourceInfoPlist = _project.ios.hostAppRoot.childDirectory('Flutter').childFile('AppFrameworkInfo.plist');
final File destinationInfoPlist = destinationAppFrameworkDirectory.childFile('Info.plist')..createSync(recursive: true);
destinationInfoPlist.writeAsBytesSync(sourceInfoPlist.readAsBytesSync());
final Status status = globals.logger.startProgress(
' ├─Assembling Flutter resources for App.framework...', timeout: timeoutConfiguration.slowOperation);
try {
if (buildInfo.mode == BuildMode.debug) {
await _bundleBuilder.build(
platform: TargetPlatform.ios,
buildInfo: buildInfo,
// Relative paths show noise in the compiler https://github.com/dart-lang/sdk/issues/37978.
mainPath: globals.fs.path.absolute(targetFile),
assetDirPath: destinationAppFrameworkDirectory.childDirectory('flutter_assets').path,
precompiledSnapshot: buildInfo.mode != BuildMode.debug,
treeShakeIcons: buildInfo.treeShakeIcons,
);
}
} finally {
status.stop();
}
await _produceXCFramework(buildInfo, destinationAppFrameworkDirectory);
}
Future<void> _produceStubAppFrameworkIfNeeded(BuildInfo buildInfo, Directory iPhoneBuildOutput, Directory simulatorBuildOutput, Directory destinationAppFrameworkDirectory) async {
if (buildInfo.mode != BuildMode.debug) {
return;
}
const String appFrameworkName = 'App.framework'; const String appFrameworkName = 'App.framework';
const String binaryName = 'App';
final Directory iPhoneAppFrameworkDirectory = iPhoneBuildOutput.childDirectory(appFrameworkName);
final File iPhoneAppFrameworkFile = iPhoneAppFrameworkDirectory.childFile(binaryName);
await createStubAppFramework(iPhoneAppFrameworkFile, SdkType.iPhone);
final Directory simulatorAppFrameworkDirectory = simulatorBuildOutput.childDirectory(appFrameworkName);
final File simulatorAppFrameworkFile = simulatorAppFrameworkDirectory.childFile(binaryName);
await createStubAppFramework(simulatorAppFrameworkFile, SdkType.iPhoneSimulator);
final List<String> lipoCommand = <String>[
'xcrun',
'lipo',
'-create',
iPhoneAppFrameworkFile.path,
simulatorAppFrameworkFile.path,
'-output',
destinationAppFrameworkDirectory.childFile(binaryName).path
];
final RunResult lipoResult = await processUtils.run(
lipoCommand,
allowReentrantFlutter: false,
);
if (lipoResult.exitCode != 0) {
throwToolExit('Unable to create compiled dart universal framework: ${lipoResult.stderr}');
}
}
Future<void> _produceAotAppFrameworkIfNeeded(
BuildInfo buildInfo,
Directory destinationDirectory,
) async {
if (buildInfo.mode == BuildMode.debug) {
return;
}
final Status status = globals.logger.startProgress( final Status status = globals.logger.startProgress(
' ├─Building Dart AOT for App.framework...', ' ├─Building App.framework...',
timeout: timeoutConfiguration.slowOperation, timeout: timeoutConfiguration.slowOperation,
); );
try { try {
final Target target = buildInfo.isRelease Target target;
? const ReleaseIosApplicationBundle() if (buildInfo.isDebug) {
: const ProfileIosApplicationBundle(); target = const DebugIosApplicationBundle();
} else if (buildInfo.isProfile) {
target = const ProfileIosApplicationBundle();
} else {
target = const ReleaseIosApplicationBundle();
}
final Environment environment = Environment( final Environment environment = Environment(
projectDir: globals.fs.currentDirectory, projectDir: globals.fs.currentDirectory,
outputDir: destinationDirectory, outputDir: modeDirectory,
buildDir: _project.dartTool.childDirectory('flutter_build'), buildDir: _project.dartTool.childDirectory('flutter_build'),
cacheDir: null, cacheDir: null,
flutterRootDir: globals.fs.directory(Cache.flutterRoot), flutterRootDir: globals.fs.directory(Cache.flutterRoot),
...@@ -469,11 +390,14 @@ end ...@@ -469,11 +390,14 @@ end
for (final ExceptionMeasurement measurement in result.exceptions.values) { for (final ExceptionMeasurement measurement in result.exceptions.values) {
globals.printError(measurement.exception.toString()); globals.printError(measurement.exception.toString());
} }
throwToolExit('The aot build failed.'); throwToolExit('The App.framework build failed.');
} }
} finally { } finally {
status.stop(); status.stop();
} }
final Directory destinationAppFrameworkDirectory = modeDirectory.childDirectory(appFrameworkName);
await _produceXCFramework(buildInfo, destinationAppFrameworkDirectory);
} }
Future<void> _producePlugins( Future<void> _producePlugins(
......
...@@ -9,7 +9,6 @@ import 'package:flutter_tools/src/base/file_system.dart'; ...@@ -9,7 +9,6 @@ import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/bundle.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build_ios_framework.dart'; import 'package:flutter_tools/src/commands/build_ios_framework.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
...@@ -65,7 +64,6 @@ void main() { ...@@ -65,7 +64,6 @@ void main() {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(),
platform: fakePlatform, platform: fakePlatform,
flutterVersion: mockFlutterVersion, flutterVersion: mockFlutterVersion,
cache: mockCache cache: mockCache
...@@ -90,7 +88,6 @@ void main() { ...@@ -90,7 +88,6 @@ void main() {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(),
platform: fakePlatform, platform: fakePlatform,
flutterVersion: mockFlutterVersion, flutterVersion: mockFlutterVersion,
cache: mockCache cache: mockCache
...@@ -112,7 +109,6 @@ void main() { ...@@ -112,7 +109,6 @@ void main() {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(),
platform: fakePlatform, platform: fakePlatform,
flutterVersion: mockFlutterVersion, flutterVersion: mockFlutterVersion,
cache: mockCache cache: mockCache
...@@ -149,11 +145,10 @@ void main() { ...@@ -149,11 +145,10 @@ void main() {
testUsingContext('created when forced', () async { testUsingContext('created when forced', () async {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(), platform: fakePlatform,
platform: fakePlatform, flutterVersion: mockFlutterVersion,
flutterVersion: mockFlutterVersion, cache: mockCache,
cache: mockCache
); );
command.produceFlutterPodspec(BuildMode.debug, outputDirectory, force: true); command.produceFlutterPodspec(BuildMode.debug, outputDirectory, force: true);
...@@ -172,11 +167,10 @@ void main() { ...@@ -172,11 +167,10 @@ void main() {
testUsingContext('contains license and version', () async { testUsingContext('contains license and version', () async {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(), platform: fakePlatform,
platform: fakePlatform, flutterVersion: mockFlutterVersion,
flutterVersion: mockFlutterVersion, cache: mockCache,
cache: mockCache
); );
command.produceFlutterPodspec(BuildMode.debug, outputDirectory); command.produceFlutterPodspec(BuildMode.debug, outputDirectory);
...@@ -192,11 +186,10 @@ void main() { ...@@ -192,11 +186,10 @@ void main() {
testUsingContext('debug URL', () async { testUsingContext('debug URL', () async {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(), platform: fakePlatform,
platform: fakePlatform, flutterVersion: mockFlutterVersion,
flutterVersion: mockFlutterVersion, cache: mockCache,
cache: mockCache
); );
command.produceFlutterPodspec(BuildMode.debug, outputDirectory); command.produceFlutterPodspec(BuildMode.debug, outputDirectory);
...@@ -210,11 +203,10 @@ void main() { ...@@ -210,11 +203,10 @@ void main() {
testUsingContext('profile URL', () async { testUsingContext('profile URL', () async {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(), platform: fakePlatform,
platform: fakePlatform, flutterVersion: mockFlutterVersion,
flutterVersion: mockFlutterVersion, cache: mockCache,
cache: mockCache
); );
command.produceFlutterPodspec(BuildMode.profile, outputDirectory); command.produceFlutterPodspec(BuildMode.profile, outputDirectory);
...@@ -228,11 +220,10 @@ void main() { ...@@ -228,11 +220,10 @@ void main() {
testUsingContext('release URL', () async { testUsingContext('release URL', () async {
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
buildSystem: MockBuildSystem(), buildSystem: MockBuildSystem(),
bundleBuilder: MockBundleBuilder(), platform: fakePlatform,
platform: fakePlatform, flutterVersion: mockFlutterVersion,
flutterVersion: mockFlutterVersion, cache: mockCache,
cache: mockCache
); );
command.produceFlutterPodspec(BuildMode.release, outputDirectory); command.produceFlutterPodspec(BuildMode.release, outputDirectory);
...@@ -253,4 +244,3 @@ class MockFlutterVersion extends Mock implements FlutterVersion {} ...@@ -253,4 +244,3 @@ class MockFlutterVersion extends Mock implements FlutterVersion {}
class MockGitTagVersion extends Mock implements GitTagVersion {} class MockGitTagVersion extends Mock implements GitTagVersion {}
class MockCache extends Mock implements Cache {} class MockCache extends Mock implements Cache {}
class MockBuildSystem extends Mock implements BuildSystem {} class MockBuildSystem extends Mock implements BuildSystem {}
class MockBundleBuilder extends Mock implements BundleBuilder {}
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