45 Commits

Author SHA1 Message Date
Matan Lurey
50e4e12c2e Add a "pub workspace" to the root of the engine repository (flutter/engine#53539)
... and use it in `engine_tool` to prove everything is working, i.e. on CI and elsewhere.

Partial work towards https://github.com/flutter/flutter/issues/147883.
Supersedes and closes https://github.com/flutter/engine/pull/51782 (which was a prototype).

See also:
- https://flutter.dev/go/pub-workspace, the design doc on the feature.
- https://github.com/dart-lang/pub-dev/pull/7762, an example PR.

I'll probably end up moving the inline docs in `pubspec.yaml` to a `docs/*.md` once that's a thing.
2024-07-18 16:18:09 +00:00
Reid Baker
02d2b7c8e1 Google java format relocation and formatting update (flutter/engine#53118)
Fixes https://github.com/flutter/flutter/issues/149319
Caused by https://github.com/flutter/engine/pull/52582

Follow up required to add a flag that fails on missing jar files instead of skipping missing jar files.
2024-05-31 18:09:23 +00:00
John McCutchan
88b596ca64 Reduce rebuild times when invoking 'et run' (flutter/engine#52883)
Android only for now but this avoids rebuilding a bunch of test targets that aren't necessary to do a `flutter run` with a custom engine.

I need to fill in some blanks for other platforms before landing.
2024-05-22 17:49:05 +00:00
Matan Lurey
b0e791fce3 et generates {out}/{buildName} if missing on et {build|test|query} (flutter/engine#52866)
Closes https://github.com/flutter/flutter/issues/148442.

This restores functionality that existed prior in https://github.com/flutter/engine/pull/52832:

- Splits `runGn` to `ensureBuildDir`, which is in practice what it does.
2024-05-16 04:03:21 +00:00
Matan Lurey
eafc52c37d Include stdout on a failed gn desc call, and test for it. (flutter/engine#52863)
Fixes https://github.com/flutter/flutter/issues/148431, in that full error output is now shown.

I also filed an additional issue for how we could do better: https://github.com/flutter/flutter/issues/148442.
2024-05-16 01:09:13 +00:00
Matan Lurey
cb19eac08e Short-circuit crawling all targets in et {build|test|query} (flutter/engine#52832)
Closes https://github.com/flutter/flutter/issues/147666.

This is a large change, I'd be happy to either review synchronously or
change commands one at a time, but I think this is overall the right
approach. I also didn't see any reason to reuse the `BuildRunner` code
for these commands, the flow is basically:

```mermaid
graph LR
    A[et targetsOrPatterns] --> B[gn desc --format=json]
    B --> C[existing code that runs ninja/workers]
```

Quick summary of changes:
- Introduced a [`Label` and `TargetPattern`][1] type to avoid awkward
string parsing/manipulation all over
- Replaced `gn_utils` (i.e. `targetsFromCommandLine` and friends) with
[an invocation of `gn desc`][2]
- Some tests were brittle in terms of expected output, I mostly left
them alone and wrote TODOs where applicable

Here is the fun part, results (and some manual integration tests):
```sh
# build, previously was 10-15s, is now ~3s
flutter % time et build -c host_debug_unopt_arm64 //flutter/impeller:impeller_unittests
[2024-05-14T19:05:55.163][macos/host_debug_unopt_arm64: GN]: OK
[2024-05-14T19:05:56.119][macos/host_debug_unopt_arm64: RBE startup]: Proxy started successfully.
[macos/host_debug_unopt_arm64: ninja] 0.0% (0/1) Regenerating ninja files[2024-05-14T19:05:57.309][macos/host_debug_unopt_arm64: ninja]: OK
[2024-05-14T19:05:57.573][macos/host_debug_unopt_arm64: RBE shutdown]: Actions completed: 0
$ENGINE/flutter/bin/et build -c host_debug_unopt_arm64   3.20s user 0.87s system 107% cpu 3.776 total

# test, also benefits from speedup, but I didn't time it
flutter % et test -c host_debug_unopt_arm64 //flutter/fml:fml_unittests
[2024-05-14T19:07:01.843][macos/host_debug_unopt_arm64: GN]: OK
[2024-05-14T19:07:02.707][macos/host_debug_unopt_arm64: RBE startup]: Proxy started successfully.
[2024-05-14T19:07:07.400][macos/host_debug_unopt_arm64: ninja]: 100.0% (3/3) LINK ./fml_unittests
[2024-05-14T19:07:07.404][macos/host_debug_unopt_arm64: ninja]: OK
[2024-05-14T19:07:07.748][macos/host_debug_unopt_arm64: RBE shutdown]: Actions completed: 1 (1 racing local)
OKAY:         7s.95ms //flutter/fml:fml_unittests

# query, also benefits from speedup
flutter % time et query targets -c host_debug_unopt_arm64
//flutter/display_list:display_list_benchmarks
//flutter/display_list:display_list_builder_benchmarks
# ... many targets omitted ...
$ENGINE/flutter/bin/et query targets -c host_debug_unopt_arm64  1.27s user 0.18s system 147% cpu 0.978 total
```

In other words, ~5x improvement on `et build` and `et query` is _much_
faster as well.

[1]:
https://github.com/flutter/engine/compare/main...matanlurey:engine:gn-label?expand=1#diff-ac008475ce9e209f4ecf6594b0cd48d12d86a1ffa0aa7d555375ff43b983eb2b
[2]:
https://github.com/flutter/engine/compare/main...matanlurey:engine:gn-label?expand=1#diff-ad116b8504dd0a500bf758a327c7052e5733a2b465d3295e35b74458d483276f
2024-05-15 12:57:02 -07:00
Matan Lurey
d89f54dd65 Replace json_utils with a modern extension type, add tests. (flutter/engine#52769)
I started on a refactoring of
https://github.com/flutter/flutter/issues/147666, and was frustrated
with the JSON decoding of `gn desc --format=json`, so I used a similar
pattern from my micro-json library (https://pub.dev/packages/jsonut) and
encapsulated it as an extension type.

My favorite is the `JsonObject.map` function which replaces:

```dart
/// Construct a RunTarget from a JSON map.
factory RunTarget.fromJson(Map<String, Object> map) {
  final List<String> errors = <String>[];
  final String name = stringOfJson(map, _nameKey, errors)!;
  final String id = stringOfJson(map, _idKey, errors)!;
  final String targetPlatform =
      stringOfJson(map, _targetPlatformKey, errors)!;

  if (errors.isNotEmpty) {
    throw FormatException('Failed to parse RunTarget: ${errors.join('\n')}');
  }
  return RunTarget._(name, id, targetPlatform);
}
```

... with:

```dart
/// Construct a RunTarget from a JSON map.
factory RunTarget.fromJson(Map<String, Object> map) {
  return JsonObject(map).map((JsonObject json) => RunTarget._(
    json.string(_nameKey),
    json.string(_idKey),
    json.string(_targetPlatformKey),
  ));
}
```
2024-05-13 20:03:43 -07:00
Matan Lurey
0a503306d4 Infer --rbe based on the existence of //flutter/build/rbe (flutter/engine#52700)
Closes https://github.com/flutter/flutter/issues/148006.
2024-05-10 11:49:44 -07:00
Matan Lurey
8ce9cf6200 When et is not attached to a terminal, still split lines for status updates. (flutter/engine#52681)
For illustrative purposes:

```sh
$ et build | grep '.*'
```

... should still get line-per-line status updates, but it does not without this patch.

It's hard to write tests because of global state, so I've declined to do so at the moment.

Closes https://github.com/flutter/flutter/issues/147903.
2024-05-09 18:09:05 +00:00
Matan Lurey
05ff169def Move Logger.test to an injected log output versus leaky abstraction. (flutter/engine#52639)
Previously, `Logger.test` was a leaky abstraction that stored a `@visibleForTesting` variable that was sometimes unused. It saved a few lines of code for tests, but doesn't seem necessary, so I swapped it out for a callback.
2024-05-07 22:56:17 +00:00
Matan Lurey
ea78cc7551 Move setting the logging level into the Logger constructor, refactor. (flutter/engine#52624)
Based on @zanderso's feedback here: https://github.com/flutter/engine/pull/52619#discussion_r1592868979.

I think this is the most succinct way to setup logging, it also doesn't seem to make sense to allow the level to be configured at runtime, so boom.
2024-05-07 21:00:54 +00:00
Matan Lurey
8618834019 Move verbose to environment.verbose, pass to ninja --verbose if provided. (flutter/engine#52619)
Closes https://github.com/flutter/flutter/issues/147894.

While doing this PR I realized we were basically passing `(bool verbose, Envrionment)` as a tuple around, so I just moved the concept _into_ `Environment` directly, and made the necessary code changes across the tool and tests.

To clarify, this does _not_ mimic the output of `ninja --verbose` _today_, because we also don't stream the output directly, and instead do terminal magic. Combined with a hypothetical fix for https://github.com/flutter/flutter/issues/147903, this would work exactly the same as before.

/cc @loic-sharma @johnmccutchan
2024-05-07 19:07:31 +00:00
Brandon DeRosier
dfed7164a1 et phone home (flutter/engine#52506)
<img width="684" alt="image" src="https://github.com/flutter/engine/assets/919017/2dcdc7e9-b0e1-434d-9078-1de6a3d57d35">
2024-05-02 01:36:30 +00:00
John McCutchan
1c441f353d Fix et run (flutter/engine#52477)
et run was broken in https://github.com/flutter/engine/pull/51803

this PR adds the missing calls to mangledConfigName before invoking flutter run
2024-05-01 14:20:04 +00:00
Zachary Anderson
448613ae74 Remove references to goma (flutter/engine#52411)
This removes goma most places except for the arguments to the `gn`
script, which are referenced by recipes. This does not remove goma
capabilities from the GN build entirely. That requires changes in the
buildroot which have to be staged after this change.
2024-04-29 09:40:16 -07:00
Zachary Anderson
f1ac2c5650 [et] Don't require the --verbose flag when requesting a ci/ build (flutter/engine#52339)
https://github.com/flutter/engine/pull/52021 introduced a bug where `ci`
build could only be specified when also passing the `--verbose` flag.
This PR fixes the issue so that by default the `help` message will only
show `ci` builds when `--verbose` is passed to `help`, but the `ci`
builds can be specified even without the `--verbose` flag.
2024-04-23 16:46:11 -07:00
Chris Bracken
2929b70726 Add containsCommand matcher (flutter/engine#52306)
Adds a `Matcher` that can be used against a `List<ExecutedProcess>` to check if a command that matches a predicate was executed. Fails if no such command was found.

An alternative would be to take a single regex instead of a closure.

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
2024-04-23 21:23:05 +00:00
Chris Bracken
0ce6126c47 [et] Lookup output filesystem path, not label (flutter/engine#52248)
Sets BuildTarget.executable to the `root_out_dir`-relative path of the
executable (e.g. `displaylist_unittests`) instead of its label (e.g.
`//out/host_debug/displaylist_unittests`). This is required since, in
the lines following the output lookup, we assume it to be a path
relative to the build output directory.

Also breaks out functions for:
* `_runGnDesc`: returns the JSON output of `gn desc buildDir target`
* `_runGnOutputs`: returns the output files listed by `gn outputs
buildDir target`

Noticed while working on:
https://github.com/flutter/flutter/issues/147071

## 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] and the [C++,
Objective-C, Java style guides].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I added new tests to check the change I am making or feature I am
adding, or the PR is [test-exempt]. See [testing the engine] for
instructions on writing and running engine tests.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I signed the [CLA].
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#overview
[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene
[test-exempt]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo
[C++, Objective-C, Java style guides]:
https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
[testing the engine]:
https://github.com/flutter/flutter/wiki/Testing-the-engine
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes
[Discord]: https://github.com/flutter/flutter/wiki/Chat
2024-04-22 11:13:16 -07:00
Chris Bracken
c9f3a89bf4 [et] Fix concurrent modification exception (flutter/engine#52247)
We cannot modify the list of build targets as we're iterating over it. Instead of removing non-test/non-executable elements, instead we add executable test targets to a separate testTargets list and use that.

Noticed while working on: https://github.com/flutter/flutter/issues/147071

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
2024-04-20 03:40:59 +00:00
Zachary Anderson
0b6ce345a3 [et] Correctly plumb usage line length limit (flutter/engine#52039)
The `Command`s added to a `CommandRunner` don't automatically inherit
the `CommandRunner`'s usage line length limit. This PR does the
necessary plumbing. Help messages look nicer now.
2024-04-11 08:39:05 -07:00
Zachary Anderson
2163fc1bc9 [et] Adds --lto flag to build. Plumbs verbose flag differently. (flutter/engine#52021)
This PR does two things. First, in many of the `ci` builds, LTO is
enabled by default. This is usually not what we want when doing local
builds, so this PR adds an `--lto` flag to the `build` command which is
disabled by default, causing `--no-lto` to be passed to GN. When `--lto`
is passed to the `build` command, `--lto` is passed to GN, which results
in the build using LTO.

Second, this PR eagerly parses the `--verbose` flag out of the command
line so that help messages can optionally show less information. In
particular, in this PR, `ci` and `web_test` builds are only displayed by
`help build` when `--verbose` is passed to the `help` command. There's
some extra text in the help message as well indicating that passing
`--verbose` to `help` will show more builds.
2024-04-10 11:09:14 -07:00
Jason Simmons
f745408809 Move the Dart SDK to //flutter/third_party/dart (flutter/engine#51917) 2024-04-09 12:48:09 +00:00
Zachary Anderson
785386dc2f [et] Run GN before looking for targets. Default to build config targets (flutter/engine#51956)
Addresses the notes I left on
https://github.com/flutter/engine/pull/51868. Mainly fixes an issue in
which the `build`, `query`, and `test` commands would fail if GN had not
yet been run for the requested configuration. Instead, in this PR, if
the build output directory doesn't exist yet, then it will run GN before
querying the targets.

Additionally, for the `build` command, if no targets are specified on
the command line, the PR uses the targets in the build config as the
default rather than all targets. `query` and `test` keep the same
behavior.
2024-04-08 13:26:57 -07:00
Zachary Anderson
a7eaa48c9a Adds human readable descriptions to build configs (flutter/engine#51929)
Step 4 of https://github.com/flutter/flutter/issues/145263

Hopefully these descriptions will be more useful than the list of GN
args.
2024-04-05 13:43:04 -07:00
Zachary Anderson
72ea5c99e3 [et] Fixup help text a bit (flutter/engine#51930)
The multiline string literal retains the newlines.
2024-04-05 09:23:12 -07:00
John McCutchan
6b4db1f60a Expand understanding of build targets in et (flutter/engine#51868)
- s/TestTarget/BuildTarget.
- Use a more informative way of querying for build targets from gn
- Port existing code to use new interfaces
- Replace 'query tests' with 'query targets' and a --testonly flag
- Extend 'et build' with support for build target selectors.
- Extend 'et query targets' with support for build target selectors.
2024-04-04 11:28:04 -07:00
Zachary Anderson
87162bdc8a [et] Prepare local_engine.json for CI, teach et to understand local build names (flutter/engine#51803)
This is steps (2) and (3) of
https://github.com/flutter/flutter/issues/145263.

The next steps after this are to:
1. Fix any issues that come up when running `local_engine.json` in CI.
1. Step (4) of https://github.com/flutter/flutter/issues/145263
1. Fill in some missing builds in `local_engine.json`.
2024-04-02 19:21:15 -07:00
John McCutchan
7245fef9ad Add et query tests and et test commands (flutter/engine#51605)
- `et query tests` enumerates all test binaries encoded in BUILD.gn
files.
- `et test` builds, then, runs a set of tests in parallel
- Tests
2024-03-28 16:11:24 -07:00
Gray Mackall
48710ab05d Make the et feature request link properly add the github label (flutter/engine#51594)
The label has a space in it, so it doesn't get properly added with the current link.

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
2024-03-21 23:34:06 +00:00
Zachary Anderson
66fa3dd66c Pass some missing --disable-dart-dev and --suppress-analytics to dart (flutter/engine#51473) 2024-03-17 08:46:11 -07:00
Matan Lurey
9daf9265d9 Add some header-goodies for et. (flutter/engine#51434)
I.e. a "open issues" and "file an issue" link.

---------

Co-authored-by: Loïc Sharma <737941+loic-sharma@users.noreply.github.com>
2024-03-14 16:38:46 -07:00
Zachary Anderson
da1a3b464c [et] build and run commands disable RBE with a flag or when not available (flutter/engine#51404) 2024-03-14 14:30:41 -07:00
John McCutchan
aba108f662 Small improvements to et lint command (flutter/engine#51372)
- Default to dumping out lint logs (can be disabled with `--quiet`
flag).
- Add Logger.fatal which logs an error and throws a FatalError which is
caught in main.
- Simplify `findDartBinDirectory` implementation.
- Make JSON serialized process artifacts more human readable.
2024-03-13 13:39:08 -07:00
John McCutchan
c2d3e6ce09 Add et lint command (flutter/engine#51238)
- Invokes lints for dart, python, c, and java.
- Captures all output of executions into an artifacts file (a json
file).
- Runs lints concurrently.
- Cool status display while running.
- Tests.
2024-03-12 23:29:25 -07:00
Loïc Sharma
8f1baa30bb [et] Allow users to update dependencies (flutter/engine#51177)
Allow users to update dependencies. Examples:

* `et fetch` Fetch dependencies

In the future, `et build` will update dependencies if it detects that they have changed.

Also:
* Updates the status in the README
* Adds instructions on how to run tests
* Fixes `et run`'s description
* Makes the `--verbose` flag global
2024-03-06 17:00:23 +00:00
John McCutchan
5a25c24c43 Add device selection to et run (flutter/engine#51184)
- `et run` now detects the target device automatically and builds the
related engine builds.
- `et run -- -d <device-id>` also works.
2024-03-05 10:49:05 -08:00
John McCutchan
0be7a9c4f0 Add et run command (flutter/engine#51037)
The `run` command builds both the host and target engines and then invokes `flutter run` so that it runs the app using the custom engine builds.

It is expected that 'et run' be used inside the directory of a flutter application.

Command line flags passed after `--` will be forwarded to `flutter run`.

Some examples:

- `et run` Build the debug variant and runs the app in that mode.
- `et run -- --profile` Build the profile variant and runs the app in that mode.
- `et run -- --release` Build the release variant and runs the app in that mode.

Also:

- Start a local_engine.json builder definition (it is missing a lot)
- Tweak the test fixture.
- Add a new Matcher to litetest.
- Tweaked the build config linter to only care about duplicate build names within the same builder.
2024-03-01 01:09:04 +00:00
John McCutchan
cdeb8166a2 Rename some classes in the engine_build_configs package (flutter/engine#51016)
- BuildConfig -> BuilderConfig
- GlobalBuild -> Build
2024-02-27 15:12:10 -08:00
Zachary Anderson
8a4feb869c [et] Improve the logger for the ninja build, adds a spinner (flutter/engine#50952)
For https://github.com/flutter/flutter/issues/132807

The spinner is mostly copied from the flutter_tool.
2024-02-26 09:31:15 -08:00
John McCutchan
82dd6cd6e3 Add an initial 'build' command to engine_tool (flutter/engine#50681)
* Adds a 'build' command to `et`.
* Renamed `query builds` to `query builders` because that seemed to be
more precise(?)

Some extra requests during review:
1. I've left some questions I'd like answers to at the top of
`build_command.dart` I suspect @zanderso and @loic-sharma can give me
(some?) answers.
2. I suspect I'm holding the FakeProcessManager wrong or there is a
better way to write the tests in `build_command_test.dart`. Pointers to
good examples are appreciated.
2024-02-23 10:02:34 -08:00
Zachary Anderson
701be200cd Starts a .ci.yaml parser (flutter/engine#50783)
Towards https://github.com/flutter/flutter/issues/132807.

This is needed so the engine tool can map the names of CI builders
listed in `.ci.yaml` to the names of the configurations in the build
config json files in `ci/builders`.
2024-02-21 14:56:07 -08:00
Zachary Anderson
6a936a530c [et] Adds a format command (flutter/engine#50747)
For https://github.com/flutter/flutter/issues/132807
2024-02-20 19:40:47 -08:00
Zachary Anderson
77cbd54c43 [et] Adds a .bat entrypoint for Windows (flutter/engine#50784)
For https://github.com/flutter/flutter/issues/132807
2024-02-20 18:48:18 +00:00
Zachary Anderson
80076b93fb [et] Adds a logger (flutter/engine#50693) 2024-02-16 00:22:54 +00:00
Zachary Anderson
82d5e3784f Starts a command line tool for assisting engine dev workflows (flutter/engine#50642)
This is mostly just trying to get some structure in place. I suspect
that the implementation of the `query` command in this PR will get
entirely replaced through improvements.
2024-02-14 12:39:16 -08:00