diff --git a/.ci.yaml b/.ci.yaml index 49334e1c88..83d6386af7 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -951,10 +951,8 @@ targets: {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:117.0"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, - {"dependency": "cmake", "version": "build_id:8787856497187628321"}, - {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"}, - {"dependency": "ninja", "version": "version:1.9.0"}, - {"dependency": "open_jdk", "version": "version:11"} + {"dependency": "open_jdk", "version": "version:11"}, + {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"} ] shard: tool_integration_tests subshard: "1_4" @@ -977,10 +975,8 @@ targets: {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:117.0"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, - {"dependency": "cmake", "version": "build_id:8787856497187628321"}, - {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"}, - {"dependency": "ninja", "version": "version:1.9.0"}, - {"dependency": "open_jdk", "version": "version:11"} + {"dependency": "open_jdk", "version": "version:11"}, + {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"} ] shard: tool_integration_tests subshard: "2_4" @@ -1003,10 +999,8 @@ targets: {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:117.0"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, - {"dependency": "cmake", "version": "build_id:8787856497187628321"}, - {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"}, - {"dependency": "ninja", "version": "version:1.9.0"}, - {"dependency": "open_jdk", "version": "version:11"} + {"dependency": "open_jdk", "version": "version:11"}, + {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"} ] shard: tool_integration_tests subshard: "3_4" @@ -1029,10 +1023,8 @@ targets: {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:117.0"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, - {"dependency": "cmake", "version": "build_id:8787856497187628321"}, - {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"}, - {"dependency": "ninja", "version": "version:1.9.0"}, - {"dependency": "open_jdk", "version": "version:11"} + {"dependency": "open_jdk", "version": "version:11"}, + {"dependency": "goldctl", "version": "git_revision:f808dcff91b221ae313e540c09d79696cd08b8de"} ] shard: tool_integration_tests subshard: "4_4" diff --git a/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart b/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart index c92c1d6949..6e73882927 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart @@ -12,7 +12,6 @@ import '../../base/platform.dart'; import '../../build_info.dart'; import '../../dart/package_map.dart'; import '../../ios/native_assets.dart'; -import '../../linux/native_assets.dart'; import '../../macos/native_assets.dart'; import '../../macos/xcode.dart'; import '../../native_assets.dart'; @@ -119,21 +118,6 @@ class NativeAssets extends Target { fileSystem: fileSystem, buildRunner: buildRunner, ); - case TargetPlatform.linux_arm64: - case TargetPlatform.linux_x64: - final String? environmentBuildMode = environment.defines[kBuildMode]; - if (environmentBuildMode == null) { - throw MissingDefineException(kBuildMode, name); - } - final BuildMode buildMode = BuildMode.fromCliName(environmentBuildMode); - (_, dependencies) = await buildNativeAssetsLinux( - targetPlatform: targetPlatform, - buildMode: buildMode, - projectUri: projectUri, - yamlParentDirectory: environment.buildDir.uri, - fileSystem: fileSystem, - buildRunner: buildRunner, - ); case TargetPlatform.tester: if (const LocalPlatform().isMacOS) { (_, dependencies) = await buildNativeAssetsMacOS( @@ -145,15 +129,6 @@ class NativeAssets extends Target { buildRunner: buildRunner, flutterTester: true, ); - } else if (const LocalPlatform().isLinux) { - (_, dependencies) = await buildNativeAssetsLinux( - buildMode: BuildMode.debug, - projectUri: projectUri, - yamlParentDirectory: environment.buildDir.uri, - fileSystem: fileSystem, - buildRunner: buildRunner, - flutterTester: true, - ); } else { // TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757 // Write the file we claim to have in the [outputs]. @@ -167,6 +142,8 @@ class NativeAssets extends Target { case TargetPlatform.android: case TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_x64: + case TargetPlatform.linux_arm64: + case TargetPlatform.linux_x64: case TargetPlatform.web_javascript: case TargetPlatform.windows_x64: // TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757 diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart index 1bcf07361f..410416aa63 100644 --- a/packages/flutter_tools/lib/src/linux/build_linux.dart +++ b/packages/flutter_tools/lib/src/linux/build_linux.dart @@ -17,7 +17,6 @@ import '../convert.dart'; import '../flutter_plugins.dart'; import '../globals.dart' as globals; import '../migrations/cmake_custom_command_migration.dart'; -import '../migrations/cmake_native_assets_migration.dart'; // Matches the following error and warning patterns: // - ::: (fatal) error: @@ -46,7 +45,6 @@ Future buildLinux( final List migrators = [ CmakeCustomCommandMigration(linuxProject, logger), - CmakeNativeAssetsMigration(linuxProject, 'linux', logger), ]; final ProjectMigration migration = ProjectMigration(migrators); diff --git a/packages/flutter_tools/lib/src/linux/native_assets.dart b/packages/flutter_tools/lib/src/linux/native_assets.dart deleted file mode 100644 index a9dcb334d8..0000000000 --- a/packages/flutter_tools/lib/src/linux/native_assets.dart +++ /dev/null @@ -1,238 +0,0 @@ -// 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:native_assets_builder/native_assets_builder.dart' show BuildResult; -import 'package:native_assets_cli/native_assets_cli.dart' hide BuildMode; -import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli; - -import '../base/common.dart'; -import '../base/file_system.dart'; -import '../base/io.dart'; -import '../build_info.dart'; -import '../globals.dart' as globals; -import '../native_assets.dart'; - -/// Dry run the native builds. -/// -/// This does not build native assets, it only simulates what the final paths -/// of all assets will be so that this can be embedded in the kernel file. -Future dryRunNativeAssetsLinux({ - required NativeAssetsBuildRunner buildRunner, - required Uri projectUri, - bool flutterTester = false, - required FileSystem fileSystem, -}) async { - if (await hasNoPackageConfig(buildRunner) || await isDisabledAndNoNativeAssets(buildRunner)) { - return null; - } - - final Uri buildUri_ = nativeAssetsBuildUri(projectUri, OS.linux); - final Iterable nativeAssetPaths = await dryRunNativeAssetsLinuxInternal( - fileSystem, - projectUri, - flutterTester, - buildRunner, - ); - final Uri nativeAssetsUri = await writeNativeAssetsYaml( - nativeAssetPaths, - buildUri_, - fileSystem, - ); - return nativeAssetsUri; -} - -Future> dryRunNativeAssetsLinuxInternal( - FileSystem fileSystem, - Uri projectUri, - bool flutterTester, - NativeAssetsBuildRunner buildRunner, -) async { - const OS targetOs = OS.linux; - final Uri buildUri_ = nativeAssetsBuildUri(projectUri, targetOs); - - globals.logger.printTrace('Dry running native assets for $targetOs.'); - final List nativeAssets = (await buildRunner.dryRun( - linkModePreference: LinkModePreference.dynamic, - targetOs: targetOs, - workingDirectory: projectUri, - includeParentEnvironment: true, - )) - .assets; - ensureNoLinkModeStatic(nativeAssets); - globals.logger.printTrace('Dry running native assets for $targetOs done.'); - final Uri? absolutePath = flutterTester ? buildUri_ : null; - final Map assetTargetLocations = _assetTargetLocations(nativeAssets, absolutePath); - final Iterable nativeAssetPaths = assetTargetLocations.values; - return nativeAssetPaths; -} - -/// Builds native assets. -/// -/// If [targetPlatform] is omitted, the current target architecture is used. -/// -/// If [flutterTester] is true, absolute paths are emitted in the native -/// assets mapping. This can be used for JIT mode without sandbox on the host. -/// This is used in `flutter test` and `flutter run -d flutter-tester`. -Future<(Uri? nativeAssetsYaml, List dependencies)> buildNativeAssetsLinux({ - required NativeAssetsBuildRunner buildRunner, - TargetPlatform? targetPlatform, - required Uri projectUri, - required BuildMode buildMode, - bool flutterTester = false, - Uri? yamlParentDirectory, - required FileSystem fileSystem, -}) async { - const OS targetOs = OS.linux; - final Uri buildUri_ = nativeAssetsBuildUri(projectUri, targetOs); - final Directory buildDir = fileSystem.directory(buildUri_); - if (!await buildDir.exists()) { - // CMake requires the folder to exist to do copying. - await buildDir.create(recursive: true); - } - if (await hasNoPackageConfig(buildRunner) || await isDisabledAndNoNativeAssets(buildRunner)) { - final Uri nativeAssetsYaml = await writeNativeAssetsYaml([], yamlParentDirectory ?? buildUri_, fileSystem); - return (nativeAssetsYaml, []); - } - - final Target target = targetPlatform != null ? _getNativeTarget(targetPlatform) : Target.current; - final native_assets_cli.BuildMode buildModeCli = nativeAssetsBuildMode(buildMode); - - globals.logger.printTrace('Building native assets for $target $buildModeCli.'); - final BuildResult result = await buildRunner.build( - linkModePreference: LinkModePreference.dynamic, - target: target, - buildMode: buildModeCli, - workingDirectory: projectUri, - includeParentEnvironment: true, - cCompilerConfig: await buildRunner.cCompilerConfig, - ); - final List nativeAssets = result.assets; - final Set dependencies = result.dependencies.toSet(); - ensureNoLinkModeStatic(nativeAssets); - globals.logger.printTrace('Building native assets for $target done.'); - final Uri? absolutePath = flutterTester ? buildUri_ : null; - final Map assetTargetLocations = _assetTargetLocations(nativeAssets, absolutePath); - await _copyNativeAssetsLinux( - buildUri_, - assetTargetLocations, - buildMode, - fileSystem, - ); - final Uri nativeAssetsUri = await writeNativeAssetsYaml( - assetTargetLocations.values, - yamlParentDirectory ?? buildUri_, - fileSystem, - ); - return (nativeAssetsUri, dependencies.toList()); -} - -Map _assetTargetLocations( - List nativeAssets, - Uri? absolutePath, -) => - { - for (final Asset asset in nativeAssets) asset: _targetLocationLinux(asset, absolutePath), - }; - -Asset _targetLocationLinux(Asset asset, Uri? absolutePath) { - final AssetPath path = asset.path; - switch (path) { - case AssetSystemPath _: - case AssetInExecutable _: - case AssetInProcess _: - return asset; - case AssetAbsolutePath _: - final String fileName = path.uri.pathSegments.last; - Uri uri; - if (absolutePath != null) { - // Flutter tester needs full host paths. - uri = absolutePath.resolve(fileName); - } else { - // Flutter Desktop needs "absolute" paths inside the app. - // "relative" in the context of native assets would be relative to the - // kernel or aot snapshot. - uri = Uri(path: fileName); - } - return asset.copyWith(path: AssetAbsolutePath(uri)); - } - throw Exception('Unsupported asset path type ${path.runtimeType} in asset $asset'); -} - -/// Extract the [Target] from a [TargetPlatform]. -Target _getNativeTarget(TargetPlatform targetPlatform) { - switch (targetPlatform) { - case TargetPlatform.linux_x64: - return Target.linuxX64; - case TargetPlatform.linux_arm64: - return Target.linuxArm64; - case TargetPlatform.android: - case TargetPlatform.ios: - case TargetPlatform.darwin: - case TargetPlatform.windows_x64: - case TargetPlatform.fuchsia_arm64: - case TargetPlatform.fuchsia_x64: - case TargetPlatform.tester: - case TargetPlatform.web_javascript: - case TargetPlatform.android_arm: - case TargetPlatform.android_arm64: - case TargetPlatform.android_x64: - case TargetPlatform.android_x86: - throw Exception('Unknown targetPlatform: $targetPlatform.'); - } -} - -Future _copyNativeAssetsLinux( - Uri buildUri, - Map assetTargetLocations, - BuildMode buildMode, - FileSystem fileSystem, -) async { - if (assetTargetLocations.isNotEmpty) { - globals.logger.printTrace('Copying native assets to ${buildUri.toFilePath()}.'); - final Directory buildDir = fileSystem.directory(buildUri.toFilePath()); - if (!buildDir.existsSync()) { - buildDir.createSync(recursive: true); - } - for (final MapEntry assetMapping in assetTargetLocations.entries) { - final Uri source = (assetMapping.key.path as AssetAbsolutePath).uri; - final Uri target = (assetMapping.value.path as AssetAbsolutePath).uri; - final Uri targetUri = buildUri.resolveUri(target); - final String targetFullPath = targetUri.toFilePath(); - await fileSystem.file(source).copy(targetFullPath); - } - globals.logger.printTrace('Copying native assets done.'); - } -} - -/// Flutter expects `clang++` to be on the path on Linux hosts. -/// -/// Search for the accompanying `clang`, `ar`, and `ld`. -Future cCompilerConfigLinux() async { - const String kClangPlusPlusBinary = 'clang++'; - const String kClangBinary = 'clang'; - const String kArBinary = 'llvm-ar'; - const String kLdBinary = 'ld.lld'; - - final ProcessResult whichResult = await globals.processManager.run(['which', kClangPlusPlusBinary]); - if (whichResult.exitCode != 0) { - throwToolExit('Failed to find $kClangPlusPlusBinary on PATH.'); - } - File clangPpFile = globals.fs.file((whichResult.stdout as String).trim()); - clangPpFile = globals.fs.file(await clangPpFile.resolveSymbolicLinks()); - - final Directory clangDir = clangPpFile.parent; - final Map binaryPaths = {}; - for (final String binary in [kClangBinary, kArBinary, kLdBinary]) { - final File binaryFile = clangDir.childFile(binary); - if (!await binaryFile.exists()) { - throwToolExit("Failed to find $binary relative to $clangPpFile: $binaryFile doesn't exist."); - } - binaryPaths[binary] = binaryFile.uri; - } - return CCompilerConfig( - ar: binaryPaths[kArBinary], - cc: binaryPaths[kClangBinary], - ld: binaryPaths[kLdBinary], - ); -} diff --git a/packages/flutter_tools/lib/src/migrations/cmake_native_assets_migration.dart b/packages/flutter_tools/lib/src/migrations/cmake_native_assets_migration.dart deleted file mode 100644 index fe9ba86a03..0000000000 --- a/packages/flutter_tools/lib/src/migrations/cmake_native_assets_migration.dart +++ /dev/null @@ -1,65 +0,0 @@ -// 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 '../base/file_system.dart'; -import '../base/project_migrator.dart'; -import '../cmake_project.dart'; - -/// Adds the snippet to the CMake file that copies the native assets. -/// -/// ```cmake -/// # Copy the native assets provided by the build.dart from all packages. -/// set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -/// install(DIRECTORY "${NATIVE_ASSETS_DIR}" -/// DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" -/// COMPONENT Runtime) -/// ``` -class CmakeNativeAssetsMigration extends ProjectMigrator { - CmakeNativeAssetsMigration(CmakeBasedProject project, this.os, super.logger) - : _cmakeFile = project.managedCmakeFile; - - final File _cmakeFile; - final String os; - - @override - void migrate() { - if (!_cmakeFile.existsSync()) { - logger.printTrace('CMake project not found, skipping install() NATIVE_ASSETS_DIR migration.'); - return; - } - - final String originalProjectContents = _cmakeFile.readAsStringSync(); - - if (originalProjectContents.contains('set(NATIVE_ASSETS_DIR')) { - // Command is already present. - return; - } - - final String copyNativeAssetsCommand = ''' - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "\${PROJECT_BUILD_DIR}native_assets/$os/") -install(DIRECTORY "\${NATIVE_ASSETS_DIR}" - DESTINATION "\${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -'''; - - // Insert the new command after the bundled libraries loop. - const String bundleLibrariesCommandEnd = r''' -endforeach(bundled_library) -'''; - - String newProjectContents = originalProjectContents; - - newProjectContents = originalProjectContents.replaceFirst( - bundleLibrariesCommandEnd, - '$bundleLibrariesCommandEnd$copyNativeAssetsCommand', - ); - - if (originalProjectContents != newProjectContents) { - logger.printStatus('CMake missing install() NATIVE_ASSETS_DIR command, updating.'); - _cmakeFile.writeAsStringSync(newProjectContents); - } - } -} diff --git a/packages/flutter_tools/lib/src/native_assets.dart b/packages/flutter_tools/lib/src/native_assets.dart index b269fd876e..3253d29191 100644 --- a/packages/flutter_tools/lib/src/native_assets.dart +++ b/packages/flutter_tools/lib/src/native_assets.dart @@ -19,7 +19,6 @@ import 'cache.dart'; import 'features.dart'; import 'globals.dart' as globals; import 'ios/native_assets.dart'; -import 'linux/native_assets.dart'; import 'macos/native_assets.dart'; import 'macos/native_assets_host.dart'; import 'resident_runner.dart'; @@ -169,9 +168,6 @@ class NativeAssetsBuildRunnerImpl implements NativeAssetsBuildRunner { if (globals.platform.isMacOS || globals.platform.isIOS) { return cCompilerConfigMacOS(); } - if (globals.platform.isLinux) { - return cCompilerConfigLinux(); - } throwToolExit( 'Native assets feature not yet implemented for Linux, Windows and Android.', ); @@ -337,13 +333,6 @@ Future dryRunNativeAssets({ fileSystem: fileSystem, buildRunner: buildRunner, ); - } else if (const LocalPlatform().isLinux) { - nativeAssetsYaml = await dryRunNativeAssetsLinux( - projectUri: projectUri, - flutterTester: true, - fileSystem: fileSystem, - buildRunner: buildRunner, - ); } else { await ensureNoNativeAssetsOrOsIsSupported( projectUri, @@ -353,13 +342,6 @@ Future dryRunNativeAssets({ ); nativeAssetsYaml = null; } - case build_info.TargetPlatform.linux_arm64: - case build_info.TargetPlatform.linux_x64: - nativeAssetsYaml = await dryRunNativeAssetsLinux( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: buildRunner, - ); case build_info.TargetPlatform.android_arm: case build_info.TargetPlatform.android_arm64: case build_info.TargetPlatform.android_x64: @@ -367,6 +349,8 @@ Future dryRunNativeAssets({ case build_info.TargetPlatform.android: case build_info.TargetPlatform.fuchsia_arm64: case build_info.TargetPlatform.fuchsia_x64: + case build_info.TargetPlatform.linux_arm64: + case build_info.TargetPlatform.linux_x64: case build_info.TargetPlatform.web_javascript: case build_info.TargetPlatform.windows_x64: await ensureNoNativeAssetsOrOsIsSupported( @@ -398,12 +382,7 @@ Future dryRunNativeAssetsMultipeOSes({ if (targetPlatforms.contains(build_info.TargetPlatform.darwin) || (targetPlatforms.contains(build_info.TargetPlatform.tester) && OS.current == OS.macOS)) ...await dryRunNativeAssetsMacOSInternal(fileSystem, projectUri, false, buildRunner), - if (targetPlatforms.contains(build_info.TargetPlatform.linux_arm64) || - targetPlatforms.contains(build_info.TargetPlatform.linux_x64) || - (targetPlatforms.contains(build_info.TargetPlatform.tester) && OS.current == OS.linux)) - ...await dryRunNativeAssetsLinuxInternal(fileSystem, projectUri, false, buildRunner), - if (targetPlatforms.contains(build_info.TargetPlatform.ios)) - ...await dryRunNativeAssetsIOSInternal(fileSystem, projectUri, buildRunner) + if (targetPlatforms.contains(build_info.TargetPlatform.ios)) ...await dryRunNativeAssetsIOSInternal(fileSystem, projectUri, buildRunner) ]; final Uri nativeAssetsUri = await writeNativeAssetsYaml(nativeAssetPaths, buildUri_, fileSystem); return nativeAssetsUri; diff --git a/packages/flutter_tools/lib/src/test/test_compiler.dart b/packages/flutter_tools/lib/src/test/test_compiler.dart index 347f3623ff..8f50eb9268 100644 --- a/packages/flutter_tools/lib/src/test/test_compiler.dart +++ b/packages/flutter_tools/lib/src/test/test_compiler.dart @@ -16,7 +16,6 @@ import '../bundle.dart'; import '../compile.dart'; import '../flutter_plugins.dart'; import '../globals.dart' as globals; -import '../linux/native_assets.dart'; import '../macos/native_assets.dart'; import '../native_assets.dart'; import '../project.dart'; @@ -182,15 +181,7 @@ class TestCompiler { flutterTester: true, fileSystem: globals.fs, buildRunner: buildRunner, - ); - } else if (globals.platform.isLinux) { - (nativeAssetsYaml, _) = await buildNativeAssetsLinux( - buildMode: BuildMode.debug, - projectUri: projectUri, - flutterTester: true, - fileSystem: globals.fs, - buildRunner: buildRunner, - ); + ); } else { await ensureNoNativeAssetsOrOsIsSupported( projectUri, diff --git a/packages/flutter_tools/templates/app_shared/linux.tmpl/CMakeLists.txt.tmpl b/packages/flutter_tools/templates/app_shared/linux.tmpl/CMakeLists.txt.tmpl index 580180401d..a4fc907bec 100644 --- a/packages/flutter_tools/templates/app_shared/linux.tmpl/CMakeLists.txt.tmpl +++ b/packages/flutter_tools/templates/app_shared/linux.tmpl/CMakeLists.txt.tmpl @@ -127,12 +127,6 @@ foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) COMPONENT Runtime) endforeach(bundled_library) -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. set(FLUTTER_ASSET_DIR_NAME "flutter_assets") diff --git a/packages/flutter_tools/test/general.shard/linux/native_assets_test.dart b/packages/flutter_tools/test/general.shard/linux/native_assets_test.dart deleted file mode 100644 index 34d2fc552f..0000000000 --- a/packages/flutter_tools/test/general.shard/linux/native_assets_test.dart +++ /dev/null @@ -1,374 +0,0 @@ -// 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/file.dart'; -import 'package:file/memory.dart'; -import 'package:file_testing/file_testing.dart'; -import 'package:flutter_tools/src/artifacts.dart'; -import 'package:flutter_tools/src/base/file_system.dart'; -import 'package:flutter_tools/src/base/logger.dart'; -import 'package:flutter_tools/src/base/platform.dart'; -import 'package:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/build_system/build_system.dart'; -import 'package:flutter_tools/src/dart/package_map.dart'; -import 'package:flutter_tools/src/features.dart'; -import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/linux/native_assets.dart'; -import 'package:flutter_tools/src/native_assets.dart'; -import 'package:native_assets_cli/native_assets_cli.dart' hide BuildMode, Target; -import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli; -import 'package:package_config/package_config_types.dart'; - -import '../../src/common.dart'; -import '../../src/context.dart'; -import '../../src/fakes.dart'; -import '../fake_native_assets_build_runner.dart'; - -void main() { - late FakeProcessManager processManager; - late Environment environment; - late Artifacts artifacts; - late FileSystem fileSystem; - late BufferLogger logger; - late Uri projectUri; - - setUp(() { - processManager = FakeProcessManager.empty(); - logger = BufferLogger.test(); - artifacts = Artifacts.test(); - fileSystem = MemoryFileSystem.test(); - environment = Environment.test( - fileSystem.currentDirectory, - inputs: {}, - artifacts: artifacts, - processManager: processManager, - fileSystem: fileSystem, - logger: logger, - ); - environment.buildDir.createSync(recursive: true); - projectUri = environment.projectDir.uri; - }); - - testUsingContext('dry run with no package config', overrides: { - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - expect( - await dryRunNativeAssetsLinux( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - hasPackageConfigResult: false, - ), - ), - null, - ); - expect( - (globals.logger as BufferLogger).traceText, - contains('No package config found. Skipping native assets compilation.'), - ); - }); - - testUsingContext('build with no package config', overrides: { - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - await buildNativeAssetsLinux( - projectUri: projectUri, - buildMode: BuildMode.debug, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - hasPackageConfigResult: false, - ), - ); - expect( - (globals.logger as BufferLogger).traceText, - contains('No package config found. Skipping native assets compilation.'), - ); - }); - - testUsingContext('dry run for multiple OSes with no package config', overrides: { - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - await dryRunNativeAssetsMultipeOSes( - projectUri: projectUri, - fileSystem: fileSystem, - targetPlatforms: [ - TargetPlatform.darwin, - TargetPlatform.ios, - ], - buildRunner: FakeNativeAssetsBuildRunner( - hasPackageConfigResult: false, - ), - ); - expect( - (globals.logger as BufferLogger).traceText, - contains('No package config found. Skipping native assets compilation.'), - ); - }); - - testUsingContext('dry run with assets but not enabled', overrides: { - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - await packageConfig.parent.create(); - await packageConfig.create(); - expect( - () => dryRunNativeAssetsLinux( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', projectUri), - ], - ), - ), - throwsToolExit( - message: 'Package(s) bar require the native assets feature to be enabled. ' - 'Enable using `flutter config --enable-native-assets`.', - ), - ); - }); - - testUsingContext('dry run with assets', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - await packageConfig.parent.create(); - await packageConfig.create(); - final Uri? nativeAssetsYaml = await dryRunNativeAssetsLinux( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', projectUri), - ], - dryRunResult: FakeNativeAssetsBuilderResult( - assets: [ - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.dynamic, - target: native_assets_cli.Target.linuxX64, - path: AssetAbsolutePath(Uri.file('libbar.so')), - ), - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.dynamic, - target: native_assets_cli.Target.linuxArm64, - path: AssetAbsolutePath(Uri.file('libbar.so')), - ), - ], - ), - ), - ); - expect( - nativeAssetsYaml, - projectUri.resolve('build/native_assets/linux/native_assets.yaml'), - ); - expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), - contains('package:bar/bar.dart'), - ); - }); - - testUsingContext('build with assets but not enabled', overrides: { - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - await packageConfig.parent.create(); - await packageConfig.create(); - expect( - () => buildNativeAssetsLinux( - projectUri: projectUri, - buildMode: BuildMode.debug, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', projectUri), - ], - ), - ), - throwsToolExit( - message: 'Package(s) bar require the native assets feature to be enabled. ' - 'Enable using `flutter config --enable-native-assets`.', - ), - ); - }); - - testUsingContext('build no assets', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - await packageConfig.parent.create(); - await packageConfig.create(); - final (Uri? nativeAssetsYaml, _) = await buildNativeAssetsLinux( - projectUri: projectUri, - buildMode: BuildMode.debug, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', projectUri), - ], - ), - ); - expect( - nativeAssetsYaml, - projectUri.resolve('build/native_assets/linux/native_assets.yaml'), - ); - expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), - isNot(contains('package:bar/bar.dart')), - ); - expect( - environment.projectDir - .childDirectory('build') - .childDirectory('native_assets') - .childDirectory('linux'), - exists, - ); - }); - - for (final bool flutterTester in [false, true]) { - String testName = ''; - if (flutterTester) { - testName += ' flutter tester'; - } - testUsingContext('build with assets$testName', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - if (const LocalPlatform().isWindows) { - return; // Backslashes in commands, but we will never run these commands on Windows. - } - final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - await packageConfig.parent.create(); - await packageConfig.create(); - final File dylibAfterCompiling = fileSystem.file('libbar.so'); - // The mock doesn't create the file, so create it here. - await dylibAfterCompiling.create(); - final (Uri? nativeAssetsYaml, _) = await buildNativeAssetsLinux( - projectUri: projectUri, - buildMode: BuildMode.debug, - fileSystem: fileSystem, - flutterTester: flutterTester, - buildRunner: FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', projectUri), - ], - buildResult: FakeNativeAssetsBuilderResult( - assets: [ - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.dynamic, - target: native_assets_cli.Target.linuxX64, - path: AssetAbsolutePath(dylibAfterCompiling.uri), - ), - ], - ), - ), - ); - expect( - nativeAssetsYaml, - projectUri.resolve('build/native_assets/linux/native_assets.yaml'), - ); - expect( - await fileSystem.file(nativeAssetsYaml).readAsString(), - stringContainsInOrder([ - 'package:bar/bar.dart', - if (flutterTester) - // Tests run on host system, so the have the full path on the system. - '- ${projectUri.resolve('/build/native_assets/linux/libbar.so').toFilePath()}' - else - // Apps are a bundle with the dylibs on their dlopen path. - '- libbar.so', - ]), - ); - }); - } - - testUsingContext('static libs not supported', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.empty(), - }, () async { - final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json'); - await packageConfig.parent.create(); - await packageConfig.create(); - expect( - () => dryRunNativeAssetsLinux( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', projectUri), - ], - dryRunResult: FakeNativeAssetsBuilderResult( - assets: [ - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.static, - target: native_assets_cli.Target.macOSArm64, - path: AssetAbsolutePath(Uri.file('bar.a')), - ), - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.static, - target: native_assets_cli.Target.macOSX64, - path: AssetAbsolutePath(Uri.file('bar.a')), - ), - ], - ), - ), - ), - throwsToolExit( - message: 'Native asset(s) package:bar/bar.dart have their link mode set to ' - 'static, but this is not yet supported. ' - 'For more info see https://github.com/dart-lang/sdk/issues/49418.', - ), - ); - }); - - // This logic is mocked in the other tests to avoid having test order - // randomization causing issues with what processes are invoked. - // Exercise the parsing of the process output in this separate test. - testUsingContext('NativeAssetsBuildRunnerImpl.cCompilerConfig', overrides: { - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true), - ProcessManager: () => FakeProcessManager.list( - [ - const FakeCommand( - command: ['which', 'clang++'], - stdout: ''' -/some/path/to/clang++ -''', // Newline at the end of the string. - ) - ], - ), - FileSystem: () => fileSystem, - }, () async { - if (!const LocalPlatform().isLinux) { - // TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757 - return; - } - - await fileSystem.directory('/some/path/to/').create(recursive: true); - await fileSystem.file('/some/path/to/clang++').create(); - await fileSystem.file('/some/path/to/clang').create(); - await fileSystem.file('/some/path/to/llvm-ar').create(); - await fileSystem.file('/some/path/to/ld.lld').create(); - - final File packagesFile = fileSystem - .directory(projectUri) - .childDirectory('.dart_tool') - .childFile('package_config.json'); - await packagesFile.parent.create(); - await packagesFile.create(); - final PackageConfig packageConfig = await loadPackageConfigWithLogging( - packagesFile, - logger: environment.logger, - ); - final NativeAssetsBuildRunner runner = - NativeAssetsBuildRunnerImpl(projectUri, packageConfig, fileSystem, logger); - final CCompilerConfig result = await runner.cCompilerConfig; - expect(result.cc, Uri.file('/some/path/to/clang')); - }); -} diff --git a/packages/flutter_tools/test/general.shard/migrations/cmake_project_migration_test.dart b/packages/flutter_tools/test/general.shard/migrations/cmake_project_migration_test.dart index 8689febb15..36ee8d7824 100644 --- a/packages/flutter_tools/test/general.shard/migrations/cmake_project_migration_test.dart +++ b/packages/flutter_tools/test/general.shard/migrations/cmake_project_migration_test.dart @@ -8,7 +8,6 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/cmake_project.dart'; import 'package:flutter_tools/src/migrations/cmake_custom_command_migration.dart'; -import 'package:flutter_tools/src/migrations/cmake_native_assets_migration.dart'; import 'package:test/fake.dart'; import '../../src/common.dart'; @@ -156,132 +155,6 @@ add_custom_command( expect(testLogger.statusText, contains('add_custom_command() missing VERBATIM or FLUTTER_TARGET_PLATFORM, updating.')); }); }); - - group('migrate add install() NATIVE_ASSETS_DIR command', () { - late MemoryFileSystem memoryFileSystem; - late BufferLogger testLogger; - late FakeCmakeProject mockCmakeProject; - late File managedCmakeFile; - - setUp(() { - memoryFileSystem = MemoryFileSystem.test(); - managedCmakeFile = memoryFileSystem.file('CMakeLists.txtx'); - - testLogger = BufferLogger( - terminal: Terminal.test(), - outputPreferences: OutputPreferences.test(), - ); - - mockCmakeProject = FakeCmakeProject(managedCmakeFile); - }); - - testWithoutContext('skipped if files are missing', () { - final CmakeNativeAssetsMigration cmakeProjectMigration = CmakeNativeAssetsMigration( - mockCmakeProject, - 'linux', - testLogger, - ); - cmakeProjectMigration.migrate(); - expect(managedCmakeFile.existsSync(), isFalse); - - expect(testLogger.traceText, contains('CMake project not found, skipping install() NATIVE_ASSETS_DIR migration.')); - expect(testLogger.statusText, isEmpty); - }); - - testWithoutContext('skipped if nothing to migrate', () { - const String contents = 'Nothing to migrate'; - managedCmakeFile.writeAsStringSync(contents); - final DateTime projectLastModified = managedCmakeFile.lastModifiedSync(); - - final CmakeNativeAssetsMigration cmakeProjectMigration = CmakeNativeAssetsMigration( - mockCmakeProject, - 'linux', - testLogger, - ); - cmakeProjectMigration.migrate(); - - expect(managedCmakeFile.lastModifiedSync(), projectLastModified); - expect(managedCmakeFile.readAsStringSync(), contents); - - expect(testLogger.statusText, isEmpty); - }); - - testWithoutContext('skipped if already migrated', () { - const String contents = r''' -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -'''; - managedCmakeFile.writeAsStringSync(contents); - final DateTime projectLastModified = managedCmakeFile.lastModifiedSync(); - - final CmakeNativeAssetsMigration cmakeProjectMigration = CmakeNativeAssetsMigration( - mockCmakeProject, - 'linux', - testLogger, - ); - cmakeProjectMigration.migrate(); - - expect(managedCmakeFile.lastModifiedSync(), projectLastModified); - expect(managedCmakeFile.readAsStringSync(), contents); - - expect(testLogger.statusText, isEmpty); - }); - - // TODO(dacoharkes): Add test for Windows when adding Windows support. https://github.com/flutter/flutter/issues/129757 - testWithoutContext('is migrated to copy native assets', () { - managedCmakeFile.writeAsStringSync(r''' -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) -'''); - - final CmakeNativeAssetsMigration cmakeProjectMigration = CmakeNativeAssetsMigration( - mockCmakeProject, - 'linux', - testLogger, - ); - cmakeProjectMigration.migrate(); - - expect(managedCmakeFile.readAsStringSync(), r''' -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) -'''); - - expect(testLogger.statusText, contains('CMake missing install() NATIVE_ASSETS_DIR command, updating.')); - }); - }); }); } diff --git a/packages/flutter_tools/test/integration.shard/native_assets_test.dart b/packages/flutter_tools/test/integration.shard/native_assets_test.dart index c6824fb357..e539e74a27 100644 --- a/packages/flutter_tools/test/integration.shard/native_assets_test.dart +++ b/packages/flutter_tools/test/integration.shard/native_assets_test.dart @@ -17,7 +17,6 @@ import 'dart:io'; import 'package:file/file.dart'; import 'package:file_testing/file_testing.dart'; -import 'package:native_assets_cli/native_assets_cli.dart'; import '../src/common.dart'; import 'test_utils.dart' show fileSystem, platform; @@ -57,8 +56,10 @@ const String packageName = 'package_with_native_assets'; const String exampleAppName = '${packageName}_example'; +const String dylibName = 'lib$packageName.dylib'; + void main() { - if (!platform.isMacOS && !platform.isLinux) { + if (!platform.isMacOS) { // TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757 return; } @@ -147,9 +148,6 @@ void main() { if (device == 'macos') { expectDylibIsBundledMacOS(exampleDirectory, buildMode); } - if (device == 'linux') { - expectDylibIsBundledLinux(exampleDirectory, buildMode); - } if (device == hostOs) { expectCCompilerIsConfigured(exampleDirectory); } @@ -203,8 +201,6 @@ void main() { expectDylibIsBundledMacOS(exampleDirectory, buildMode); } else if (buildSubcommand == 'ios') { expectDylibIsBundledIos(exampleDirectory, buildMode); - } else if (buildSubcommand == 'linux') { - expectDylibIsBundledLinux(exampleDirectory, buildMode); } expectCCompilerIsConfigured(exampleDirectory); }); @@ -282,7 +278,7 @@ void expectDylibIsBundledMacOS(Directory appDirectory, String buildMode) { expect(appBundle, exists); final Directory dylibsFolder = appBundle.childDirectory('Contents/Frameworks'); expect(dylibsFolder, exists); - final File dylib = dylibsFolder.childFile(OS.macOS.dylibFileName(packageName)); + final File dylib = dylibsFolder.childFile(dylibName); expect(dylib, exists); } @@ -291,21 +287,7 @@ void expectDylibIsBundledIos(Directory appDirectory, String buildMode) { expect(appBundle, exists); final Directory dylibsFolder = appBundle.childDirectory('Frameworks'); expect(dylibsFolder, exists); - final File dylib = dylibsFolder.childFile(OS.iOS.dylibFileName(packageName)); - expect(dylib, exists); -} - -/// Checks that dylibs are bundled. -/// -/// Sample path: build/linux/x64/release/bundle/lib/libmy_package.so -void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) { - // Linux does not support cross compilation, so always only check current architecture. - final String architecture = Architecture.current.dartPlatform; - final Directory appBundle = appDirectory.childDirectory('build/$hostOs/$architecture/$buildMode/bundle/'); - expect(appBundle, exists); - final Directory dylibsFolder = appBundle.childDirectory('lib/'); - expect(dylibsFolder, exists); - final File dylib = dylibsFolder.childFile(OS.linux.dylibFileName(packageName)); + final File dylib = dylibsFolder.childFile(dylibName); expect(dylib, exists); } @@ -314,7 +296,7 @@ void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) { void expectDylibIsBundledWithFrameworks(Directory appDirectory, String buildMode, String os) { final Directory frameworksFolder = appDirectory.childDirectory('build/$os/framework/${buildMode.upperCaseFirst()}'); expect(frameworksFolder, exists); - final File dylib = frameworksFolder.childFile(OS.macOS.dylibFileName(packageName)); + final File dylib = frameworksFolder.childFile(dylibName); expect(dylib, exists); } diff --git a/packages/flutter_tools/test/integration.shard/transition_test_utils.dart b/packages/flutter_tools/test/integration.shard/transition_test_utils.dart index fa3a7f3b9e..9c34917600 100644 --- a/packages/flutter_tools/test/integration.shard/transition_test_utils.dart +++ b/packages/flutter_tools/test/integration.shard/transition_test_utils.dart @@ -6,7 +6,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'package:flutter_tools/src/base/platform.dart'; import 'package:meta/meta.dart'; import 'package:process/process.dart'; @@ -178,15 +177,9 @@ Future runFlutter( minutes: 10), // must be less than test timeout of 15 minutes! See ../../dart_test.yaml. }) async { - const LocalPlatform platform = LocalPlatform(); final Stopwatch clock = Stopwatch()..start(); final Process process = await processManager.start( - [ - // In a container with no X display, use the virtual framebuffer. - if (platform.isLinux && (platform.environment['DISPLAY'] ?? '').isEmpty) '/usr/bin/xvfb-run', - flutterBin, - ...arguments, - ], + [flutterBin, ...arguments], workingDirectory: workingDirectory, ); final List logs = [];