Skip to content

Commit

Permalink
Add build macos --config-only option. (#118649)
Browse files Browse the repository at this point in the history
Co-authored-by: a-wallen <stephenwallen@google.com>
  • Loading branch information
a-wallen and a-wallen authored Jan 19, 2023
1 parent 2258590 commit 1dd7f45
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 1 deletion.
10 changes: 10 additions & 0 deletions packages/flutter_tools/lib/src/commands/build_macos.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ class BuildMacosCommand extends BuildSubCommand {
required bool verboseHelp,
}) : super(verboseHelp: verboseHelp) {
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);
usesFlavorOption();
argParser
.addFlag('config-only',
help: 'Update the project configuration without performing a build. '
'This can be used in CI/CD process that create an archive to avoid '
'performing duplicate work.'
);
}

@override
Expand All @@ -39,6 +46,8 @@ class BuildMacosCommand extends BuildSubCommand {
@override
bool get supported => globals.platform.isMacOS;

bool get configOnly => boolArgDeprecated('config-only');

@override
Future<FlutterCommandResult> runCommand() async {
final BuildInfo buildInfo = await getBuildInfo();
Expand All @@ -55,6 +64,7 @@ class BuildMacosCommand extends BuildSubCommand {
buildInfo: buildInfo,
targetOverride: targetFile,
verboseLogging: globals.logger.isVerbose,
configOnly: configOnly,
sizeAnalyzer: SizeAnalyzer(
fileSystem: globals.fs,
logger: globals.logger,
Expand Down
5 changes: 4 additions & 1 deletion packages/flutter_tools/lib/src/macos/build_macos.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Future<void> buildMacOS({
required BuildInfo buildInfo,
String? targetOverride,
required bool verboseLogging,
bool configOnly = false,
SizeAnalyzer? sizeAnalyzer,
}) async {
final Directory? xcodeWorkspace = flutterProject.macos.xcodeWorkspace;
Expand Down Expand Up @@ -78,6 +79,9 @@ Future<void> buildMacOS({
if (!flutterProject.macos.outputFileList.existsSync()) {
flutterProject.macos.outputFileList.createSync(recursive: true);
}
if (configOnly) {
return;
}

final Directory xcodeProject = flutterProject.macos.xcodeProject;

Expand All @@ -97,7 +101,6 @@ Future<void> buildMacOS({
if (configuration == null) {
throwToolExit('Unable to find expected configuration in Xcode project.');
}

// Run the Xcode build.
final Stopwatch sw = Stopwatch()..start();
final Status status = globals.logger.startProgress(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';

import '../src/common.dart';
import 'test_utils.dart';

void main() {
test('flutter build macOS --config only updates generated xcconfig file without performing build', () async {
final String workingDirectory = fileSystem.path.join(
getFlutterRoot(),
'dev',
'integration_tests',
'flutter_gallery',
);
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');

await processManager.run(<String>[
flutterBin,
...getLocalEngineArguments(),
'clean',
], workingDirectory: workingDirectory);
final List<String> buildCommand = <String>[
flutterBin,
...getLocalEngineArguments(),
'build',
'macos',
'--config-only',
'--release',
'--obfuscate',
'--split-debug-info=info',
];
final ProcessResult firstRunResult = await processManager.run(buildCommand, workingDirectory: workingDirectory);

printOnFailure('Output of flutter build macOS:');
final String firstRunStdout = firstRunResult.stdout.toString();
printOnFailure('First run stdout: $firstRunStdout');
printOnFailure('First run stderr: ${firstRunResult.stderr}');

expect(firstRunResult.exitCode, 0);
expect(firstRunStdout, contains('Running pod install'));

final File generatedConfig = fileSystem.file(fileSystem.path.join(
workingDirectory,
'macos',
'Flutter',
'ephemeral',
'Flutter-Generated.xcconfig',
));

// Config is updated if command succeeded.
expect(generatedConfig, exists);
expect(generatedConfig.readAsStringSync(), contains('DART_OBFUSCATION=true'));

// file that only exists if app was fully built.
final File frameworkPlist = fileSystem.file(fileSystem.path.join(
workingDirectory,
'build',
'macos',
'Build',
'Products',
'Release',
'App.framework',
'Resources',
'Info.plist'
));

expect(frameworkPlist, isNot(exists));

// Run again with no changes.
final ProcessResult secondRunResult = await processManager.run(buildCommand, workingDirectory: workingDirectory);
final String secondRunStdout = secondRunResult.stdout.toString();
printOnFailure('Second run stdout: $secondRunStdout');
printOnFailure('Second run stderr: ${secondRunResult.stderr}');

expect(secondRunResult.exitCode, 0);
}, skip: !platform.isMacOS); // [intended] macOS builds only work on macos.
}

0 comments on commit 1dd7f45

Please sign in to comment.