Skip to content

[tools,pigeon] Update tooling to handle Windows build output changes #4826

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions packages/pigeon/tool/shared/test_suites.dart
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,30 @@ Future<int> _runWindowsUnitTests() async {
return compileCode;
}

return runProcess(
'$examplePath/build/windows/plugins/test_plugin/Debug/test_plugin_test.exe',
<String>[]);
// Depending on the Flutter version, the build output path is different. To
// handle both master and stable, and to future-proof against the changes
// that will happen in https://github.com/flutter/flutter/issues/129807
// - Try arm64, to future-proof against arm64 support.
// - Try x64, to cover pre-arm64 support on arm64 hosts, as well as x64 hosts
// running newer versions of Flutter.
// - Fall back to the pre-arch path, to support running against stable.
// TODO(stuartmorgan): Remove all this when these tests no longer need to
// support a version of Flutter without
// https://github.com/flutter/flutter/issues/129807, and just construct the
// version of the path with the current architecture.
const String buildDirBase = '$examplePath/build/windows';
const String buildRelativeBinaryPath =
'plugins/test_plugin/Debug/test_plugin_test.exe';
const String arm64Path = '$buildDirBase/arm64/$buildRelativeBinaryPath';
const String x64Path = '$buildDirBase/x64/$buildRelativeBinaryPath';
const String oldPath = '$buildDirBase/$buildRelativeBinaryPath';
if (File(arm64Path).existsSync()) {
return runProcess(arm64Path, <String>[]);
} else if (File(x64Path).existsSync()) {
return runProcess(x64Path, <String>[]);
} else {
return runProcess(oldPath, <String>[]);
}
}

Future<int> _runWindowsIntegrationTests() async {
Expand Down
19 changes: 12 additions & 7 deletions script/tool/lib/src/common/cmake.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class CMakeProject {
required this.buildMode,
this.processRunner = const ProcessRunner(),
this.platform = const LocalPlatform(),
this.arch,
});

/// The directory of a Flutter project to run Gradle commands in.
Expand All @@ -31,6 +32,11 @@ class CMakeProject {
/// The platform that commands are being run on.
final Platform platform;

/// The architecture subdirectory of the build.
// TODO(stuartmorgan): Make this non-nullable once Flutter 3.13 is no longer
// supported, since at that point there will always be a subdirectory.
final String? arch;

/// The build mode (e.g., Debug, Release).
///
/// This is a constructor paramater because on Linux many properties depend
Expand All @@ -46,14 +52,13 @@ class CMakeProject {
Directory get buildDirectory {
Directory buildDir =
flutterProject.childDirectory('build').childDirectory(_platformDirName);
if (arch != null) {
buildDir = buildDir.childDirectory(arch!);
}
if (platform.isLinux) {
buildDir = buildDir
// TODO(stuartmorgan): Support arm64 if that ever becomes a supported
// CI configuration for the repository.
.childDirectory('x64')
// Linux uses a single-config generator, so the base build directory
// includes the configuration.
.childDirectory(buildMode.toLowerCase());
// Linux uses a single-config generator, so the base build directory
// includes the configuration.
buildDir = buildDir.childDirectory(buildMode.toLowerCase());
}
return buildDir;
}
Expand Down
54 changes: 48 additions & 6 deletions script/tool/lib/src/native_test_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:ffi';

import 'package:file/file.dart';
import 'package:meta/meta.dart';

Expand Down Expand Up @@ -41,7 +43,9 @@ class NativeTestCommand extends PackageLoopingCommand {
super.packagesDir, {
super.processRunner,
super.platform,
}) : _xcode = Xcode(processRunner: processRunner, log: true) {
Abi? abi,
}) : _abi = abi ?? Abi.current(),
_xcode = Xcode(processRunner: processRunner, log: true) {
argParser.addOption(
_iOSDestinationFlag,
help: 'Specify the destination when running iOS tests.\n'
Expand All @@ -63,6 +67,9 @@ class NativeTestCommand extends PackageLoopingCommand {
help: 'Runs native integration (UI) tests', defaultsTo: true);
}

// The ABI of the host.
final Abi _abi;

// The device destination flags for iOS tests.
List<String> _iOSDestinationFlags = <String>[];

Expand Down Expand Up @@ -548,9 +555,10 @@ this command.
isTestBinary: isTestBinary);
}

/// Finds every file in the [buildDirectoryName] subdirectory of [plugin]'s
/// build directory for which [isTestBinary] is true, and runs all of them,
/// returning the overall result.
/// Finds every file in the relevant (based on [platformName], [buildMode],
/// and [arch]) subdirectory of [plugin]'s build directory for which
/// [isTestBinary] is true, and runs all of them, returning the overall
/// result.
///
/// The binaries are assumed to be Google Test test binaries, thus returning
/// zero for success and non-zero for failure.
Expand All @@ -563,11 +571,45 @@ this command.
final List<File> testBinaries = <File>[];
bool hasMissingBuild = false;
bool buildFailed = false;
String? arch;
const String x64DirName = 'x64';
const String arm64DirName = 'arm64';
if (platform.isWindows) {
arch = _abi == Abi.windowsX64 ? x64DirName : arm64DirName;
} else if (platform.isLinux) {
// TODO(stuartmorgan): Support arm64 if that ever becomes a supported
// CI configuration for the repository.
arch = 'x64';
}
for (final RepositoryPackage example in plugin.getExamples()) {
final CMakeProject project = CMakeProject(example.directory,
CMakeProject project = CMakeProject(example.directory,
buildMode: buildMode,
processRunner: processRunner,
platform: platform);
platform: platform,
arch: arch);
if (platform.isWindows) {
if (arch == arm64DirName && !project.isConfigured()) {
// Check for x64, to handle builds newer than 3.13, but that don't yet
// have https://github.com/flutter/flutter/issues/129807.
// TODO(stuartmorgan): Remove this when CI no longer supports a
// version of Flutter without the issue above fixed.
project = CMakeProject(example.directory,
buildMode: buildMode,
processRunner: processRunner,
platform: platform,
arch: x64DirName);
}
if (!project.isConfigured()) {
// Check again without the arch subdirectory, since 3.13 doesn't
// have it yet.
// TODO(stuartmorgan): Remove this when CI no longer supports Flutter
// 3.13.
project = CMakeProject(example.directory,
buildMode: buildMode,
processRunner: processRunner,
platform: platform);
}
}
if (!project.isConfigured()) {
printError('ERROR: Run "flutter build" on ${example.displayName}, '
'or run this tool\'s "build-examples" command, for the target '
Expand Down
Loading