Skip to content

feat(flutter_tools): migrate Desktop build commands to typed options - #193323

Merged
auto-submit[bot] merged 4 commits into
flutter:masterfrom
kevmoo:pr7-desktop-build-options
Oct 8, 2026
Merged

auto-submit[bot] merged 4 commits into
flutter:masterfrom
kevmoo:pr7-desktop-build-options

Conversation

@kevmoo

@kevmoo kevmoo commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

Migrate BuildLinuxCommand (build linux) and BuildWindowsCommand (build windows) to typed OptionDescriptors and OptionBundles (following #191018, #191510, #191760, #192307, #192455, #192524, and #192818):

  • Add DesktopBuildOptionsBundle in common_options.dart, encapsulating CommonBuildOptionsBundle, BuildModeOptionsBundle, DartCompileOptionsBundle, BuildInfoOptions.flavor, splitDebugInfo, obfuscate, extraFrontEndOptions, extraGenSnapshotOptions, performanceMeasurementFile, analyzeSize, codeSizeDirectory, trackWidgetCreation, and configOnly.
  • Migrate BuildLinuxCommand (build_linux.dart) to DesktopBuildOptionsBundle, DefaultedEnumOptionDescriptor<TargetPlatform> (_targetPlatformOption), and DefaultedStringOptionDescriptor (_targetSysroot), replacing untyped boolArg('config-only'), stringArg('target-platform')!, and stringArg('target-sysroot')! queries.
  • Migrate BuildWindowsCommand (build_windows.dart) to DesktopBuildOptionsBundle and getValue(DesktopBuildOptionsBundle.configOnly).
  • Delete the obsolete FlutterCommand.addCommonDesktopBuildOptions helper method from flutter_command.dart (no remaining callers in flutter_tools).

Pre-launch Checklist

  • I read the [Contributor Guide] and followed the process outlined there for submitting PRs.
  • I read the [Tree Hygiene] wiki page, which explains my responsibilities.
  • I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement].
  • I signed the [CLA].
  • I listed at least one issue that this PR fixes in the description above.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is [test-exempt].
  • I followed the [breaking change policy] and added [Data Driven Fixes] where supported.
  • All existing and new tests are passing.

Migrate `BuildLinuxCommand` (`build linux`) and `BuildWindowsCommand`
(`build windows`) to typed `OptionDescriptor`s and `OptionBundle`s:

- Add `DesktopBuildOptionsBundle` in `common_options.dart` (encapsulating
  `CommonBuildOptionsBundle`, `BuildModeOptionsBundle`, `DartCompileOptionsBundle`,
  `BuildInfoOptions.flavor`, `splitDebugInfo`, `obfuscate`, `extraFrontEndOptions`,
  `extraGenSnapshotOptions`, `performanceMeasurementFile`, `analyzeSize`,
  `codeSizeDirectory`, `trackWidgetCreation`, and `configOnly`).
- Migrate `BuildLinuxCommand` to `DesktopBuildOptionsBundle`,
  `DefaultedEnumOptionDescriptor<TargetPlatform>` (`_targetPlatformOption`),
  and `DefaultedStringOptionDescriptor` (`_targetSysroot`).
- Migrate `BuildWindowsCommand` to `DesktopBuildOptionsBundle`.
- Remove obsolete `FlutterCommand.addCommonDesktopBuildOptions`.
@github-actions github-actions Bot added tool Affects the "flutter" command-line tool. See also t: labels. team-windows Owned by the Windows platform team team-linux Owned by the Linux platform team labels Sep 25, 2026
@kevmoo
kevmoo marked this pull request as ready for review September 25, 2026 04:02
@kevmoo
kevmoo requested review from a team as code owners September 25, 2026 04:02

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the desktop build commands for Linux and Windows to use the new DesktopBuildOptionsBundle for registering common build options, removing the deprecated addCommonDesktopBuildOptions helper. Feedback suggests refactoring the _targetPlatformOption in BuildLinuxCommand from a static factory method to a late final instance field to avoid recreating the descriptor when retrieving its value.

@kevmoo kevmoo added the CICD Run CI/CD label Sep 26, 2026
@kevmoo
kevmoo requested a review from bkonyi October 7, 2026 23:31
@kevmoo kevmoo added the autosubmit Merge PR when tree becomes green via auto submit App label Oct 8, 2026
@auto-submit
auto-submit Bot added this pull request to the merge queue Oct 8, 2026
Merged via the queue into flutter:master with commit 21d8093 Oct 8, 2026
23 checks passed
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Oct 8, 2026
@kevmoo
kevmoo deleted the pr7-desktop-build-options branch October 8, 2026 18:50
andywolff pushed a commit to andywolff/flutter that referenced this pull request Oct 13, 2026
…lutter#194017)

### Rationale

`FlutterTestRunner.runTests` accepted 33 loose parameters (duplicating
23 of them on `runTestsBySpawningLightweightEngines` alongside
duplicated `package:test` CLI argument lists), and
`DriverService.startTest` accepted 12 loose parameters fed by untyped
`boolArg` / `stringArg` / regex splitting in `TestCommand` and
`DriveCommand`. Following flutter#191018, flutter#191510, flutter#191760, flutter#192307, flutter#192455,
flutter#192524, flutter#192818, and flutter#193323, this change introduces immutable
service-layer specification objects and migrates `TestCommand` and
`DriveCommand` to typed `OptionDescriptor`s.

### Summary of Changes

- Introduce `@immutable class TestFilterSpecification` and `@immutable
class TestExecutionSpecification` (with `toPackageTestArgs()`) in
`test/runner.dart`, shrinking `FlutterTestRunner.runTests` from 33
parameters to 3 (`testWrapper`, `testFiles`, `spec`) and
`runTestsBySpawningLightweightEngines` from 25 parameters to 2
(`testFiles`, `spec`).
- Migrate `TestCommand` (`commands/test.dart`) from inline `argParser`
registrations and untyped `boolArg`/`stringArg`/`stringsArg` queries to
private typed `OptionDescriptor` constants (`argParser.addDescriptors` +
`getValue` / `wasParsed`), and update `bin/fuchsia_tester.dart`.
- Introduce `@immutable class DriveTestSpecification` (with
`parseBrowserDimension`) in `drive/drive_service.dart`, shrinking
`DriverService.startTest` (and `FlutterDriverService` /
`WebDriverService`) from 12 parameters to 2 (`testFile`, `spec`).
- Migrate `DriveCommand` (`commands/drive.dart`) from inline
registrations and ad-hoc string/int/enum parsing to private typed
`OptionDescriptor` constants (`IntOptionDescriptor`,
`DefaultedEnumOptionDescriptor<Browser>`, etc.) and
`DriveTestSpecification`.
- Update unit tests across `test_test.dart`, `drive_test.dart`,
`drive_service_test.dart`, and `web_driver_service_test.dart`.

### Flow / Surface Delta

```mermaid
flowchart LR
    A["TestCommand (OptionDescriptors)"] --> B["TestExecutionSpecification"]
    B --> C["FlutterTestRunner.runTests(spec)"]
    D["DriveCommand (OptionDescriptors)"] --> E["DriveTestSpecification"]
    E --> F["DriverService.startTest(spec)"]
```

### Verification

- Executed `dart analyze --fatal-infos` on `packages/flutter_tools` with
0 issues.
- Executed `dart test` across `test_test.dart`, `drive_test.dart`,
`drive_service_test.dart`, and `web_driver_service_test.dart` (`148/148`
passing).

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
dayanruben pushed a commit to dayanruben/flutter that referenced this pull request Oct 14, 2026
…fig to AndroidBuildInfo (flutter#194016)

### Rationale

`BuildInfo` is the cross-platform build configuration passed across
Android, iOS, Web, Desktop, and Fuchsia targets, yet it carried 6 loose
Android/Gradle fields (`androidProjectArgs`,
`androidGradleProjectCacheDir`, `androidGradleDaemon`,
`androidSkipBuildDependencyValidation`, `androidEnableHcpp`,
`explicitAndroidEnableHcpp`) and the Gradle `-P` flag serializer
`toGradleConfig()`. Following flutter#191018, flutter#191510, flutter#191760, flutter#192307,
flutter#192455, flutter#192524, flutter#192818, and flutter#193323, this change encapsulates those
fields into `AndroidGradleConfig` and moves `toGradleConfig()` onto
`AndroidBuildInfo` where all production callers already operate.

### Summary of Changes

- Introduce `@immutable class AndroidGradleConfig` in `build_info.dart`
and replace the 6 loose `android*` parameters on `BuildInfo` and
`BuildInfo.copyWith` with `androidGradleConfig` (shrinking `BuildInfo`'s
constructor from 28 to 23 parameters while preserving
`AndroidDevice.startApp` forwarding during `flutter run`).
- Move `toGradleConfig()` off `BuildInfo` onto `AndroidBuildInfo` (with
zero `@deprecated` forwarders) and add `gradleDaemon` and
`skipBuildDependencyValidation` convenience getters on
`AndroidBuildInfo`.
- Update `FlutterCommand.getBuildInfo()` in `flutter_command.dart` to
construct `AndroidGradleConfig`.
- Update `buildGradleApp`, `buildGradleAar`, and
`_checkJavaAndGradleCompatibility` in `gradle.dart` to read Gradle
configuration via `AndroidBuildInfo`.
- Update unit tests across `build_info_test.dart`,
`flutter_command_test.dart`, `android_gradle_builder_test.dart`, and
`build_aar_test.dart`.

### Flow / Surface Delta

```mermaid
flowchart LR
    A["FlutterCommand.getBuildInfo()"] --> B["BuildInfo(androidGradleConfig)"]
    B --> C["AndroidBuildInfo.toGradleConfig()"]
    C --> D["gradle.dart (-P flags)"]
```

### Verification

- Executed `dart analyze --fatal-infos` on `packages/flutter_tools` with
0 issues.
- Executed `dart test` across `build_info_test.dart`,
`flutter_command_test.dart`, `android_gradle_builder_test.dart`, and
`build_aar_test.dart` (`160/160` passing).

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
suryaKommana2662 pushed a commit to suryaKommana2662/flutter that referenced this pull request Oct 29, 2026
…lutter#193323)

Migrate `BuildLinuxCommand` (`build linux`) and `BuildWindowsCommand`
(`build windows`) to typed `OptionDescriptor`s and `OptionBundle`s
(following flutter#191018, flutter#191510, flutter#191760, flutter#192307, flutter#192455, flutter#192524, and
flutter#192818):

- Add `DesktopBuildOptionsBundle` in `common_options.dart`,
encapsulating `CommonBuildOptionsBundle`, `BuildModeOptionsBundle`,
`DartCompileOptionsBundle`, `BuildInfoOptions.flavor`, `splitDebugInfo`,
`obfuscate`, `extraFrontEndOptions`, `extraGenSnapshotOptions`,
`performanceMeasurementFile`, `analyzeSize`, `codeSizeDirectory`,
`trackWidgetCreation`, and `configOnly`.
- Migrate `BuildLinuxCommand` (`build_linux.dart`) to
`DesktopBuildOptionsBundle`,
`DefaultedEnumOptionDescriptor<TargetPlatform>`
(`_targetPlatformOption`), and `DefaultedStringOptionDescriptor`
(`_targetSysroot`), replacing untyped `boolArg('config-only')`,
`stringArg('target-platform')!`, and `stringArg('target-sysroot')!`
queries.
- Migrate `BuildWindowsCommand` (`build_windows.dart`) to
`DesktopBuildOptionsBundle` and
`getValue(DesktopBuildOptionsBundle.configOnly)`.
- Delete the obsolete `FlutterCommand.addCommonDesktopBuildOptions`
helper method from `flutter_command.dart` (no remaining callers in
`flutter_tools`).

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
suryaKommana2662 pushed a commit to suryaKommana2662/flutter that referenced this pull request Oct 29, 2026
…lutter#194017)

### Rationale

`FlutterTestRunner.runTests` accepted 33 loose parameters (duplicating
23 of them on `runTestsBySpawningLightweightEngines` alongside
duplicated `package:test` CLI argument lists), and
`DriverService.startTest` accepted 12 loose parameters fed by untyped
`boolArg` / `stringArg` / regex splitting in `TestCommand` and
`DriveCommand`. Following flutter#191018, flutter#191510, flutter#191760, flutter#192307, flutter#192455,
flutter#192524, flutter#192818, and flutter#193323, this change introduces immutable
service-layer specification objects and migrates `TestCommand` and
`DriveCommand` to typed `OptionDescriptor`s.

### Summary of Changes

- Introduce `@immutable class TestFilterSpecification` and `@immutable
class TestExecutionSpecification` (with `toPackageTestArgs()`) in
`test/runner.dart`, shrinking `FlutterTestRunner.runTests` from 33
parameters to 3 (`testWrapper`, `testFiles`, `spec`) and
`runTestsBySpawningLightweightEngines` from 25 parameters to 2
(`testFiles`, `spec`).
- Migrate `TestCommand` (`commands/test.dart`) from inline `argParser`
registrations and untyped `boolArg`/`stringArg`/`stringsArg` queries to
private typed `OptionDescriptor` constants (`argParser.addDescriptors` +
`getValue` / `wasParsed`), and update `bin/fuchsia_tester.dart`.
- Introduce `@immutable class DriveTestSpecification` (with
`parseBrowserDimension`) in `drive/drive_service.dart`, shrinking
`DriverService.startTest` (and `FlutterDriverService` /
`WebDriverService`) from 12 parameters to 2 (`testFile`, `spec`).
- Migrate `DriveCommand` (`commands/drive.dart`) from inline
registrations and ad-hoc string/int/enum parsing to private typed
`OptionDescriptor` constants (`IntOptionDescriptor`,
`DefaultedEnumOptionDescriptor<Browser>`, etc.) and
`DriveTestSpecification`.
- Update unit tests across `test_test.dart`, `drive_test.dart`,
`drive_service_test.dart`, and `web_driver_service_test.dart`.

### Flow / Surface Delta

```mermaid
flowchart LR
    A["TestCommand (OptionDescriptors)"] --> B["TestExecutionSpecification"]
    B --> C["FlutterTestRunner.runTests(spec)"]
    D["DriveCommand (OptionDescriptors)"] --> E["DriveTestSpecification"]
    E --> F["DriverService.startTest(spec)"]
```

### Verification

- Executed `dart analyze --fatal-infos` on `packages/flutter_tools` with
0 issues.
- Executed `dart test` across `test_test.dart`, `drive_test.dart`,
`drive_service_test.dart`, and `web_driver_service_test.dart` (`148/148`
passing).

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
suryaKommana2662 pushed a commit to suryaKommana2662/flutter that referenced this pull request Oct 29, 2026
…fig to AndroidBuildInfo (flutter#194016)

### Rationale

`BuildInfo` is the cross-platform build configuration passed across
Android, iOS, Web, Desktop, and Fuchsia targets, yet it carried 6 loose
Android/Gradle fields (`androidProjectArgs`,
`androidGradleProjectCacheDir`, `androidGradleDaemon`,
`androidSkipBuildDependencyValidation`, `androidEnableHcpp`,
`explicitAndroidEnableHcpp`) and the Gradle `-P` flag serializer
`toGradleConfig()`. Following flutter#191018, flutter#191510, flutter#191760, flutter#192307,
flutter#192455, flutter#192524, flutter#192818, and flutter#193323, this change encapsulates those
fields into `AndroidGradleConfig` and moves `toGradleConfig()` onto
`AndroidBuildInfo` where all production callers already operate.

### Summary of Changes

- Introduce `@immutable class AndroidGradleConfig` in `build_info.dart`
and replace the 6 loose `android*` parameters on `BuildInfo` and
`BuildInfo.copyWith` with `androidGradleConfig` (shrinking `BuildInfo`'s
constructor from 28 to 23 parameters while preserving
`AndroidDevice.startApp` forwarding during `flutter run`).
- Move `toGradleConfig()` off `BuildInfo` onto `AndroidBuildInfo` (with
zero `@deprecated` forwarders) and add `gradleDaemon` and
`skipBuildDependencyValidation` convenience getters on
`AndroidBuildInfo`.
- Update `FlutterCommand.getBuildInfo()` in `flutter_command.dart` to
construct `AndroidGradleConfig`.
- Update `buildGradleApp`, `buildGradleAar`, and
`_checkJavaAndGradleCompatibility` in `gradle.dart` to read Gradle
configuration via `AndroidBuildInfo`.
- Update unit tests across `build_info_test.dart`,
`flutter_command_test.dart`, `android_gradle_builder_test.dart`, and
`build_aar_test.dart`.

### Flow / Surface Delta

```mermaid
flowchart LR
    A["FlutterCommand.getBuildInfo()"] --> B["BuildInfo(androidGradleConfig)"]
    B --> C["AndroidBuildInfo.toGradleConfig()"]
    C --> D["gradle.dart (-P flags)"]
```

### Verification

- Executed `dart analyze --fatal-infos` on `packages/flutter_tools` with
0 issues.
- Executed `dart test` across `build_info_test.dart`,
`flutter_command_test.dart`, `android_gradle_builder_test.dart`, and
`build_aar_test.dart` (`160/160` passing).

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CICD Run CI/CD team-linux Owned by the Linux platform team team-windows Owned by the Windows platform team tool Affects the "flutter" command-line tool. See also t: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants