Skip to content

Commit

Permalink
Migrate build_system targets to null safety (#92869)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmagman committed Nov 18, 2021
1 parent 1fe5b75 commit e56c83a
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import 'package:meta/meta.dart';

import '../../android/deferred_components_gen_snapshot_validator.dart';
Expand All @@ -19,8 +17,8 @@ import 'android.dart';
class DeferredComponentsGenSnapshotValidatorTarget extends Target {
/// Create an [AndroidAotDeferredComponentsBundle] implementation for a given [targetPlatform] and [buildMode].
DeferredComponentsGenSnapshotValidatorTarget({
@required this.deferredComponentsDependencies,
@required this.nonDeferredComponentsDependencies,
required this.deferredComponentsDependencies,
required this.nonDeferredComponentsDependencies,
this.title,
this.exitOnFail = true,
});
Expand All @@ -31,7 +29,7 @@ class DeferredComponentsGenSnapshotValidatorTarget extends Target {

/// The title of the [DeferredComponentsGenSnapshotValidator] that is
/// displayed to the developer when logging results.
final String title;
final String? title;

/// Whether to exit the tool if a recommended change is found by the
/// [DeferredComponentsGenSnapshotValidator].
Expand Down Expand Up @@ -72,7 +70,7 @@ class DeferredComponentsGenSnapshotValidatorTarget extends Target {
}

@visibleForTesting
DeferredComponentsGenSnapshotValidator validator;
DeferredComponentsGenSnapshotValidator? validator;

@override
Future<void> build(Environment environment) async {
Expand All @@ -92,18 +90,18 @@ class DeferredComponentsGenSnapshotValidatorTarget extends Target {
abis: _abis
);

validator
validator!
..checkAppAndroidManifestComponentLoadingUnitMapping(
FlutterProject.current().manifest.deferredComponents,
FlutterProject.current().manifest.deferredComponents ?? <DeferredComponent>[],
generatedLoadingUnits,
)
..checkAgainstLoadingUnitsCache(generatedLoadingUnits)
..writeLoadingUnitsCache(generatedLoadingUnits);

validator.handleResults();
validator!.handleResults();

depfileService.writeToFile(
Depfile(validator.inputs, validator.outputs),
Depfile(validator!.inputs, validator!.outputs),
environment.buildDir.childFile('flutter_$name.d'),
);
}
Expand Down
70 changes: 35 additions & 35 deletions packages/flutter_tools/lib/src/build_system/targets/ios.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import 'package:meta/meta.dart';

import '../../artifacts.dart';
Expand Down Expand Up @@ -37,45 +35,47 @@ abstract class AotAssemblyBase extends Target {
final AOTSnapshotter snapshotter = AOTSnapshotter(
fileSystem: environment.fileSystem,
logger: environment.logger,
xcode: globals.xcode,
xcode: globals.xcode!,
artifacts: environment.artifacts,
processManager: environment.processManager,
);
final String buildOutputPath = environment.buildDir.path;
if (environment.defines[kBuildMode] == null) {
final String? environmentBuildMode = environment.defines[kBuildMode];
if (environmentBuildMode == null) {
throw MissingDefineException(kBuildMode, 'aot_assembly');
}
if (environment.defines[kTargetPlatform] == null) {
final String? environmentTargetPlatform = environment.defines[kTargetPlatform];
if (environmentTargetPlatform== null) {
throw MissingDefineException(kTargetPlatform, 'aot_assembly');
}
if (environment.defines[kSdkRoot] == null) {
final String? sdkRoot = environment.defines[kSdkRoot];
if (sdkRoot == null) {
throw MissingDefineException(kSdkRoot, 'aot_assembly');
}

final List<String> extraGenSnapshotOptions = decodeCommaSeparated(environment.defines, kExtraGenSnapshotOptions);
final bool bitcode = environment.defines[kBitcodeFlag] == 'true';
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]);
final String splitDebugInfo = environment.defines[kSplitDebugInfo];
final BuildMode buildMode = getBuildModeForName(environmentBuildMode);
final TargetPlatform targetPlatform = getTargetPlatformForName(environmentTargetPlatform);
final String? splitDebugInfo = environment.defines[kSplitDebugInfo];
final bool dartObfuscation = environment.defines[kDartObfuscation] == 'true';
final List<DarwinArch> darwinArchs = environment.defines[kIosArchs]
?.split(' ')
?.map(getIOSArchForName)
?.toList()
.map(getIOSArchForName)
.toList()
?? <DarwinArch>[DarwinArch.arm64];
if (targetPlatform != TargetPlatform.ios) {
throw Exception('aot_assembly is only supported for iOS applications.');
}

final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
final EnvironmentType? environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
if (environmentType == EnvironmentType.simulator) {
throw Exception(
'release/profile builds are only supported for physical devices. '
'attempted to build for simulator.'
);
}
final String codeSizeDirectory = environment.defines[kCodeSizeDirectory];
final String? codeSizeDirectory = environment.defines[kCodeSizeDirectory];

// If we're building multiple iOS archs the binaries need to be lipo'd
// together.
Expand Down Expand Up @@ -220,14 +220,13 @@ class DebugUniversalFramework extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kSdkRoot] == null) {
final String? sdkRoot = environment.defines[kSdkRoot];
if (sdkRoot == null) {
throw MissingDefineException(kSdkRoot, name);
}

// Generate a trivial App.framework.
final Set<String> iosArchNames = environment.defines[kIosArchs]
?.split(' ')
?.toSet();
final Set<String>? iosArchNames = environment.defines[kIosArchs]?.split(' ').toSet();
final File output = environment.buildDir
.childDirectory('App.framework')
.childFile('App');
Expand All @@ -236,6 +235,7 @@ class DebugUniversalFramework extends Target {
output,
environment,
iosArchNames,
sdkRoot,
);
}
}
Expand Down Expand Up @@ -272,30 +272,31 @@ abstract class UnpackIOS extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kSdkRoot] == null) {
final String? sdkRoot = environment.defines[kSdkRoot];
if (sdkRoot == null) {
throw MissingDefineException(kSdkRoot, name);
}
if (environment.defines[kIosArchs] == null) {
final String? archs = environment.defines[kIosArchs];
if (archs == null) {
throw MissingDefineException(kIosArchs, name);
}
if (environment.defines[kBitcodeFlag] == null) {
throw MissingDefineException(kBitcodeFlag, name);
}
_copyFramework(environment);
_copyFramework(environment, sdkRoot);

final File frameworkBinary = environment.outputDir.childDirectory('Flutter.framework').childFile('Flutter');
final String frameworkBinaryPath = frameworkBinary.path;
if (!frameworkBinary.existsSync()) {
throw Exception('Binary $frameworkBinaryPath does not exist, cannot thin');
}
_thinFramework(environment, frameworkBinaryPath);
_thinFramework(environment, frameworkBinaryPath, archs);
_bitcodeStripFramework(environment, frameworkBinaryPath);
_signFramework(environment, frameworkBinaryPath, buildMode);
}

void _copyFramework(Environment environment) {
final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
void _copyFramework(Environment environment, String sdkRoot) {
final EnvironmentType? environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
final String basePath = environment.artifacts.getArtifactPath(
Artifact.flutterFramework,
platform: TargetPlatform.ios,
Expand All @@ -321,8 +322,7 @@ abstract class UnpackIOS extends Target {
}

/// Destructively thin Flutter.framework to include only the specified architectures.
void _thinFramework(Environment environment, String frameworkBinaryPath) {
final String archs = environment.defines[kIosArchs];
void _thinFramework(Environment environment, String frameworkBinaryPath, String archs) {
final List<String> archList = archs.split(' ').toList();
final ProcessResult infoResult = environment.processManager.runSync(<String>[
'lipo',
Expand Down Expand Up @@ -454,10 +454,11 @@ abstract class IosAssetBundle extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kBuildMode] == null) {
final String? environmentBuildMode = environment.defines[kBuildMode];
if (environmentBuildMode == null) {
throw MissingDefineException(kBuildMode, name);
}
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final BuildMode buildMode = getBuildModeForName(environmentBuildMode);
final Directory frameworkDirectory = environment.outputDir.childDirectory('App.framework');
final String frameworkBinaryPath = frameworkDirectory.childFile('App').path;
final Directory assetDirectory = frameworkDirectory.childDirectory('flutter_assets');
Expand Down Expand Up @@ -574,7 +575,7 @@ class ReleaseIosApplicationBundle extends IosAssetBundle {
/// but it isn't actually executed. To generate something valid, we compile a trivial
/// constant.
Future<void> _createStubAppFramework(File outputFile, Environment environment,
Set<String> iosArchNames) async {
Set<String>? iosArchNames, String sdkRoot) async {
try {
outputFile.createSync(recursive: true);
} on Exception catch (e) {
Expand All @@ -590,13 +591,12 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
static const int Moo = 88;
''');

final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, fileSystem);
final EnvironmentType? environmentType = environmentTypeFromSdkroot(sdkRoot, fileSystem);

await globals.xcode.clang(<String>[
await globals.xcode!.clang(<String>[
'-x',
'c',
for (String arch in iosArchNames) ...<String>['-arch', arch],
for (String arch in iosArchNames ?? <String>{}) ...<String>['-arch', arch],
stubSource.path,
'-dynamiclib',
'-fembed-bitcode-marker',
Expand Down Expand Up @@ -625,7 +625,7 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
}

void _signFramework(Environment environment, String binaryPath, BuildMode buildMode) {
String codesignIdentity = environment.defines[kCodesignIdentity];
String? codesignIdentity = environment.defines[kCodesignIdentity];
if (codesignIdentity == null || codesignIdentity.isEmpty) {
codesignIdentity = '-';
}
Expand Down
13 changes: 8 additions & 5 deletions packages/flutter_tools/lib/src/build_system/targets/linux.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import '../../artifacts.dart';
import '../../base/file_system.dart';
import '../../build_info.dart';
Expand Down Expand Up @@ -49,7 +47,11 @@ class UnpackLinux extends Target {

@override
Future<void> build(Environment environment) async {
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final String? buildModeEnvironment = environment.defines[kBuildMode];
if (buildModeEnvironment == null) {
throw MissingDefineException(kBuildMode, name);
}
final BuildMode buildMode = getBuildModeForName(buildModeEnvironment);
final String engineSourcePath = environment.artifacts
.getArtifactPath(
Artifact.linuxDesktopPath,
Expand Down Expand Up @@ -117,10 +119,11 @@ abstract class BundleLinuxAssets extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kBuildMode] == null) {
final String? buildModeEnvironment = environment.defines[kBuildMode];
if (buildModeEnvironment == null) {
throw MissingDefineException(kBuildMode, 'bundle_linux_assets');
}
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final BuildMode buildMode = getBuildModeForName(buildModeEnvironment);
final Directory outputDirectory = environment.outputDir
.childDirectory('flutter_assets');
if (!outputDirectory.existsSync()) {
Expand Down
37 changes: 21 additions & 16 deletions packages/flutter_tools/lib/src/build_system/targets/macos.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import '../../artifacts.dart';
import '../../base/build.dart';
import '../../base/file_system.dart';
Expand Down Expand Up @@ -46,10 +44,11 @@ abstract class UnpackMacOS extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kBuildMode] == null) {
final String? buildModeEnvironment = environment.defines[kBuildMode];
if (buildModeEnvironment == null) {
throw MissingDefineException(kBuildMode, 'unpack_macos');
}
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final BuildMode buildMode = getBuildModeForName(buildModeEnvironment);
final String basePath = environment.artifacts.getArtifactPath(Artifact.flutterMacOSFramework, mode: buildMode);

final ProcessResult result = environment.processManager.runSync(<String>[
Expand Down Expand Up @@ -182,7 +181,7 @@ class DebugMacOSFramework extends Target {

final Iterable<DarwinArch> darwinArchs = environment.defines[kDarwinArchs]
?.split(' ')
?.map(getDarwinArchForName)
.map(getDarwinArchForName)
?? <DarwinArch>[DarwinArch.x86_64];

final Iterable<String> darwinArchArguments =
Expand All @@ -193,7 +192,7 @@ class DebugMacOSFramework extends Target {
..writeAsStringSync(r'''
static const int Moo = 88;
''');
final RunResult result = await globals.xcode.clang(<String>[
final RunResult result = await globals.xcode!.clang(<String>[
'-x',
'c',
debugApp.path,
Expand Down Expand Up @@ -231,23 +230,28 @@ class CompileMacOSFramework extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kBuildMode] == null) {
final String? buildModeEnvironment = environment.defines[kBuildMode];
if (buildModeEnvironment == null) {
throw MissingDefineException(kBuildMode, 'compile_macos_framework');
}
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final String? targetPlatformEnvironment = environment.defines[kTargetPlatform];
if (targetPlatformEnvironment == null) {
throw MissingDefineException(kTargetPlatform, 'kernel_snapshot');
}
final BuildMode buildMode = getBuildModeForName(buildModeEnvironment);
if (buildMode == BuildMode.debug) {
throw Exception('precompiled macOS framework only supported in release/profile builds.');
}
final String buildOutputPath = environment.buildDir.path;
final String codeSizeDirectory = environment.defines[kCodeSizeDirectory];
final String splitDebugInfo = environment.defines[kSplitDebugInfo];
final String? codeSizeDirectory = environment.defines[kCodeSizeDirectory];
final String? splitDebugInfo = environment.defines[kSplitDebugInfo];
final bool dartObfuscation = environment.defines[kDartObfuscation] == 'true';
final List<String> extraGenSnapshotOptions = decodeCommaSeparated(environment.defines, kExtraGenSnapshotOptions);
final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]);
final TargetPlatform targetPlatform = getTargetPlatformForName(targetPlatformEnvironment);
final List<DarwinArch> darwinArchs = environment.defines[kDarwinArchs]
?.split(' ')
?.map(getDarwinArchForName)
?.toList()
.map(getDarwinArchForName)
.toList()
?? <DarwinArch>[DarwinArch.x86_64];
if (targetPlatform != TargetPlatform.darwin) {
throw Exception('compile_macos_framework is only supported for darwin TargetPlatform.');
Expand All @@ -256,7 +260,7 @@ class CompileMacOSFramework extends Target {
final AOTSnapshotter snapshotter = AOTSnapshotter(
fileSystem: environment.fileSystem,
logger: environment.logger,
xcode: globals.xcode,
xcode: globals.xcode!,
artifacts: environment.artifacts,
processManager: environment.processManager
);
Expand Down Expand Up @@ -353,10 +357,11 @@ abstract class MacOSBundleFlutterAssets extends Target {

@override
Future<void> build(Environment environment) async {
if (environment.defines[kBuildMode] == null) {
final String? buildModeEnvironment = environment.defines[kBuildMode];
if (buildModeEnvironment == null) {
throw MissingDefineException(kBuildMode, 'compile_macos_framework');
}
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final BuildMode buildMode = getBuildModeForName(buildModeEnvironment);
final Directory frameworkRootDirectory = environment
.outputDir
.childDirectory('App.framework');
Expand Down

0 comments on commit e56c83a

Please sign in to comment.