diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/build_mode.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/build_mode.dart index 7bbcba0d9b..3c04bdb814 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/build_mode.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/build_mode.dart @@ -31,10 +31,7 @@ final class BuildMode { static const release = BuildMode._('release'); /// All known build modes. - static const values = [ - debug, - release, - ]; + static const values = [debug, release]; /// The name of this [BuildMode]. /// diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/cbuilder.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/cbuilder.dart index 27b04cab8f..b2b40c8ad2 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/cbuilder.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/cbuilder.dart @@ -100,12 +100,12 @@ class CBuilder extends CTool implements Builder { super.optimizationLevel = OptimizationLevel.o3, this.buildMode = BuildMode.release, }) : super( - type: OutputType.executable, - assetName: null, - installName: null, - pic: pie, - linkModePreference: null, - ); + type: OutputType.executable, + assetName: null, + installName: null, + pic: pie, + linkModePreference: null, + ); /// Runs the C Compiler with on this C build spec. /// @@ -118,8 +118,10 @@ class CBuilder extends CTool implements Builder { String? linkInPackage, }) async { if (!input.config.buildCodeAssets) { - logger?.info('buildAssetTypes did not contain "${CodeAsset.type}", ' - 'skipping CodeAsset $assetName build.'); + logger?.info( + 'buildAssetTypes did not contain "${CodeAsset.type}", ' + 'skipping CodeAsset $assetName build.', + ); return; } assert( @@ -130,12 +132,15 @@ class CBuilder extends CTool implements Builder { final outDir = input.outputDirectory; final packageRoot = input.packageRoot; await Directory.fromUri(outDir).create(recursive: true); - final linkMode = - getLinkMode(linkModePreference ?? input.config.code.linkModePreference); - final libUri = outDir - .resolve(input.config.code.targetOS.libraryFileName(name, linkMode)); - final exeUri = - outDir.resolve(input.config.code.targetOS.executableFileName(name)); + final linkMode = getLinkMode( + linkModePreference ?? input.config.code.linkModePreference, + ); + final libUri = outDir.resolve( + input.config.code.targetOS.libraryFileName(name, linkMode), + ); + final exeUri = outDir.resolve( + input.config.code.targetOS.executableFileName(name), + ); final sources = [ for (final source in this.sources) packageRoot.resolveUri(Uri.file(source)), @@ -167,9 +172,10 @@ class CBuilder extends CTool implements Builder { type == OutputType.library && linkMode == DynamicLoadingBundled() ? libUri : null, - staticLibrary: type == OutputType.library && linkMode == StaticLinking() - ? libUri - : null, + staticLibrary: + type == OutputType.library && linkMode == StaticLinking() + ? libUri + : null, executable: type == OutputType.executable ? exeUri : null, // ignore: invalid_use_of_visible_for_testing_member installName: installName, @@ -205,14 +211,15 @@ class CBuilder extends CTool implements Builder { } // ignore: deprecated_member_use if (!input.config.dryRun) { - final includeFiles = await Stream.fromIterable(includes) - .asyncExpand( - (include) => Directory(include.toFilePath()) - .list(recursive: true) - .where((entry) => entry is File) - .map((file) => file.uri), - ) - .toList(); + final includeFiles = + await Stream.fromIterable(includes) + .asyncExpand( + (include) => Directory(include.toFilePath()) + .list(recursive: true) + .where((entry) => entry is File) + .map((file) => file.uri), + ) + .toList(); output.addDependencies({ // Note: We use a Set here to deduplicate the dependencies. diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/clinker.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/clinker.dart index 1f72b050fd..7b64c5bf20 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/clinker.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/clinker.dart @@ -52,16 +52,20 @@ class CLinker extends CTool implements Linker { required Logger? logger, }) async { if (OS.current != OS.linux || input.config.code.targetOS != OS.linux) { - throw UnsupportedError('Currently, only linux is supported for this ' - 'feature. See also https://github.com/dart-lang/native/issues/1376'); + throw UnsupportedError( + 'Currently, only linux is supported for this ' + 'feature. See also https://github.com/dart-lang/native/issues/1376', + ); } final outDir = input.outputDirectory; final packageRoot = input.packageRoot; await Directory.fromUri(outDir).create(recursive: true); - final linkMode = - getLinkMode(linkModePreference ?? input.config.code.linkModePreference); - final libUri = outDir - .resolve(input.config.code.targetOS.libraryFileName(name, linkMode)); + final linkMode = getLinkMode( + linkModePreference ?? input.config.code.linkModePreference, + ); + final libUri = outDir.resolve( + input.config.code.targetOS.libraryFileName(name, linkMode), + ); final sources = [ for (final source in this.sources) packageRoot.resolveUri(Uri.file(source)), @@ -99,23 +103,26 @@ class CLinker extends CTool implements Linker { await task.run(); if (assetName != null) { - output.assets.code.add(CodeAsset( - package: input.packageName, - name: assetName!, - file: libUri, - linkMode: linkMode, - os: input.config.code.targetOS, - architecture: input.config.code.targetArchitecture, - )); + output.assets.code.add( + CodeAsset( + package: input.packageName, + name: assetName!, + file: libUri, + linkMode: linkMode, + os: input.config.code.targetOS, + architecture: input.config.code.targetArchitecture, + ), + ); } - final includeFiles = await Stream.fromIterable(includes) - .asyncExpand( - (include) => Directory(include.toFilePath()) - .list(recursive: true) - .where((entry) => entry is File) - .map((file) => file.uri), - ) - .toList(); + final includeFiles = + await Stream.fromIterable(includes) + .asyncExpand( + (include) => Directory(include.toFilePath()) + .list(recursive: true) + .where((entry) => entry is File) + .map((file) => file.uri), + ) + .toList(); output.addDependencies({ // Note: We use a Set here to deduplicate the dependencies. diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart index f3e7c7f12c..0e19e3b4e3 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart @@ -31,8 +31,8 @@ class CompilerResolver { required this.logger, OS? hostOS, // Only visible for testing. Architecture? hostArchitecture, // Only visible for testing. - }) : hostOS = hostOS ?? OS.current, - hostArchitecture = hostArchitecture ?? Architecture.current; + }) : hostOS = hostOS ?? OS.current, + hostArchitecture = hostArchitecture ?? Architecture.current; Future resolveCompiler() async { // First, check if the launcher provided a direct path to the compiler. @@ -103,20 +103,24 @@ class CompilerResolver { final inputCcUri = codeConfig.cCompiler?.compiler; if (inputCcUri != null) { assert(await File.fromUri(inputCcUri).exists()); - logger?.finer('Using compiler ${inputCcUri.toFilePath()} ' - 'from BuildInput.cCompiler.cc.'); - return (await CompilerRecognizer(inputCcUri).resolve(logger: logger)) - .first; + logger?.finer( + 'Using compiler ${inputCcUri.toFilePath()} ' + 'from BuildInput.cCompiler.cc.', + ); + return (await CompilerRecognizer( + inputCcUri, + ).resolve(logger: logger)).first; } logger?.finer('No compiler set in BuildInput.cCompiler.cc.'); return null; } Future _tryLoadToolFromNativeToolchain(Tool tool) async { - final resolved = (await tool.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == tool) - .toList() - ..sort(); + final resolved = + (await tool.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == tool).toList() + ..sort(); return resolved.isEmpty ? null : resolved.first; } @@ -188,10 +192,13 @@ class CompilerResolver { final inputArUri = codeConfig.cCompiler?.archiver; if (inputArUri != null) { assert(await File.fromUri(inputArUri).exists()); - logger?.finer('Using archiver ${inputArUri.toFilePath()} ' - 'from BuildInput.cCompiler.ar.'); - return (await ArchiverRecognizer(inputArUri).resolve(logger: logger)) - .first; + logger?.finer( + 'Using archiver ${inputArUri.toFilePath()} ' + 'from BuildInput.cCompiler.ar.', + ); + return (await ArchiverRecognizer( + inputArUri, + ).resolve(logger: logger)).first; } logger?.finer('No archiver set in BuildInput.cCompiler.ar.'); return null; @@ -262,8 +269,10 @@ class CompilerResolver { final inputLdUri = codeConfig.cCompiler?.linker; if (inputLdUri != null) { assert(await File.fromUri(inputLdUri).exists()); - logger?.finer('Using linker ${inputLdUri.toFilePath()} ' - 'from cCompiler.ld.'); + logger?.finer( + 'Using linker ${inputLdUri.toFilePath()} ' + 'from cCompiler.ld.', + ); final tools = await LinkerRecognizer(inputLdUri).resolve(logger: logger); return tools.first; } diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/language.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/language.dart index b2a0217cec..c502638e9d 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/language.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/language.dart @@ -20,11 +20,7 @@ class Language { static const Language objectiveC = Language._('objective c'); /// Known values for [Language]. - static const List values = [ - c, - cpp, - objectiveC, - ]; + static const List values = [c, cpp, objectiveC]; @override String toString() => name; diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/linker_options.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/linker_options.dart index c324a66f45..cd2e7aed08 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/linker_options.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/linker_options.dart @@ -38,9 +38,9 @@ class LinkerOptions { List? flags, bool? gcSections, this.linkerScript, - }) : _linkerFlags = flags ?? [], - gcSections = gcSections ?? true, - _wholeArchiveSandwich = false; + }) : _linkerFlags = flags ?? [], + gcSections = gcSections ?? true, + _wholeArchiveSandwich = false; /// Create linking options to tree-shake symbols from the input files. /// @@ -48,14 +48,15 @@ class LinkerOptions { LinkerOptions.treeshake({ Iterable? flags, required Iterable? symbols, - }) : _linkerFlags = [ - ...flags ?? [], - '--strip-debug', - if (symbols != null) ...symbols.expand((e) => ['-u', e]), - ].toList(), - gcSections = true, - _wholeArchiveSandwich = symbols == null, - linkerScript = _createLinkerScript(symbols); + }) : _linkerFlags = + [ + ...flags ?? [], + '--strip-debug', + if (symbols != null) ...symbols.expand((e) => ['-u', e]), + ].toList(), + gcSections = true, + _wholeArchiveSandwich = symbols == null, + linkerScript = _createLinkerScript(symbols); Iterable _toLinkerSyntax(Tool linker, List flagList) { if (linker.isClangLike) { @@ -92,16 +93,14 @@ extension LinkerOptionsExt on LinkerOptions { /// trick, which includes all symbols when linking object files. /// /// Throws if the [linker] is not supported. - Iterable preSourcesFlags( - Tool linker, - Iterable sourceFiles, - ) => + Iterable preSourcesFlags(Tool linker, Iterable sourceFiles) => _toLinkerSyntax( - linker, - sourceFiles.any((source) => source.endsWith('.a')) || - _wholeArchiveSandwich - ? ['--whole-archive'] - : []); + linker, + sourceFiles.any((source) => source.endsWith('.a')) || + _wholeArchiveSandwich + ? ['--whole-archive'] + : [], + ); /// The flags for the specified [linker], which are inserted _after_ the /// sources. @@ -113,14 +112,12 @@ extension LinkerOptionsExt on LinkerOptions { Iterable postSourcesFlags( Tool linker, Iterable sourceFiles, - ) => - _toLinkerSyntax(linker, [ - ..._linkerFlags, - if (gcSections) '--gc-sections', - if (linkerScript != null) - '--version-script=${linkerScript!.toFilePath()}', - if (sourceFiles.any((source) => source.endsWith('.a')) || - _wholeArchiveSandwich) - '--no-whole-archive', - ]); + ) => _toLinkerSyntax(linker, [ + ..._linkerFlags, + if (gcSections) '--gc-sections', + if (linkerScript != null) '--version-script=${linkerScript!.toFilePath()}', + if (sourceFiles.any((source) => source.endsWith('.a')) || + _wholeArchiveSandwich) + '--no-whole-archive', + ]); } diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/linkmode.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/linkmode.dart index da7154e28d..43bc25c729 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/linkmode.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/linkmode.dart @@ -9,7 +9,9 @@ LinkMode getLinkMode(LinkModePreference preference) { preference == LinkModePreference.preferDynamic) { return DynamicLoadingBundled(); } - assert(preference == LinkModePreference.static || - preference == LinkModePreference.preferStatic); + assert( + preference == LinkModePreference.static || + preference == LinkModePreference.preferStatic, + ); return StaticLinking(); } diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/optimization_level.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/optimization_level.dart index 2c8398f899..fecd60851d 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/optimization_level.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/optimization_level.dart @@ -31,8 +31,9 @@ final class OptimizationLevel { static const OptimizationLevel oS = OptimizationLevel._('Os'); /// Unspecified optimization level; the default or compiler-chosen level. - static const OptimizationLevel unspecified = - OptimizationLevel._('unspecified'); + static const OptimizationLevel unspecified = OptimizationLevel._( + 'unspecified', + ); /// Returns the string representation of the optimization level. @override @@ -41,9 +42,9 @@ final class OptimizationLevel { String clangFlag() => '-$_level'; String msvcFlag() => switch (this) { - o3 => o2.msvcFlag(), - _ => '/$_level', - }; + o3 => o2.msvcFlag(), + _ => '/$_level', + }; static const List values = [ o0, diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/output_type.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/output_type.dart index d413afe946..927a3f3c33 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/output_type.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/output_type.dart @@ -2,7 +2,4 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -enum OutputType { - executable, - library, -} +enum OutputType { executable, library } diff --git a/pkgs/native_toolchain_c/lib/src/cbuilder/run_cbuilder.dart b/pkgs/native_toolchain_c/lib/src/cbuilder/run_cbuilder.dart index c244775bfd..de699e529d 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/run_cbuilder.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/run_cbuilder.dart @@ -70,11 +70,11 @@ class RunCBuilder { this.language = Language.c, this.cppLinkStdLib, required this.optimizationLevel, - }) : outDir = input.outputDirectory, - assert([executable, dynamicLibrary, staticLibrary] - .whereType() - .length == - 1) { + }) : outDir = input.outputDirectory, + assert( + [executable, dynamicLibrary, staticLibrary].whereType().length == + 1, + ) { if (codeConfig.targetOS == OS.windows && cppLinkStdLib != null) { throw ArgumentError.value( cppLinkStdLib, @@ -84,8 +84,10 @@ class RunCBuilder { } } - late final _resolver = - CompilerResolver(codeConfig: codeConfig, logger: logger); + late final _resolver = CompilerResolver( + codeConfig: codeConfig, + logger: logger, + ); Future compiler() async => await _resolver.resolveCompiler(); @@ -95,23 +97,20 @@ class RunCBuilder { Future iosSdk(IOSSdk iosSdk, {required Logger? logger}) async { if (iosSdk == IOSSdk.iPhoneOS) { - return (await iPhoneOSSdk.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == iPhoneOSSdk) - .first - .uri; + return (await iPhoneOSSdk.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == iPhoneOSSdk).first.uri; } assert(iosSdk == IOSSdk.iPhoneSimulator); - return (await iPhoneSimulatorSdk.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == iPhoneSimulatorSdk) - .first - .uri; + return (await iPhoneSimulatorSdk.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == iPhoneSimulatorSdk).first.uri; } Future macosSdk({required Logger? logger}) async => - (await macosxSdk.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == macosxSdk) - .first - .uri; + (await macosxSdk.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == macosxSdk).first.uri; Uri androidSysroot(ToolInstance compiler) => compiler.uri.resolve('../sysroot/'); @@ -290,7 +289,7 @@ class RunCBuilder { '-x', 'c++', '-l', - cppLinkStdLib ?? defaultCppLinkStdLib[codeConfig.targetOS]! + cppLinkStdLib ?? defaultCppLinkStdLib[codeConfig.targetOS]!, ], if (optimizationLevel != OptimizationLevel.unspecified) optimizationLevel.clangFlag(), @@ -304,10 +303,7 @@ class RunCBuilder { for (final include in includes) '-I${include.toFilePath()}', ...sourceFiles, if (language == Language.objectiveC) ...[ - for (final framework in frameworks) ...[ - '-framework', - framework, - ], + for (final framework in frameworks) ...['-framework', framework], ], if (executable != null) ...[ '-o', @@ -392,10 +388,7 @@ class RunCBuilder { if (staticLibrary != null) { await runProcess( executable: archiver_!, - arguments: [ - '/out:${staticLibrary!.toFilePath()}', - '*.obj', - ], + arguments: ['/out:${staticLibrary!.toFilePath()}', '*.obj'], workingDirectory: outDir, environment: environment, logger: logger, @@ -425,9 +418,7 @@ class RunCBuilder { IOSSdk.iPhoneOS: 'arm64-apple-ios', IOSSdk.iPhoneSimulator: 'arm64-apple-ios-simulator', }, - Architecture.x64: { - IOSSdk.iPhoneSimulator: 'x86_64-apple-ios-simulator', - }, + Architecture.x64: {IOSSdk.iPhoneSimulator: 'x86_64-apple-ios-simulator'}, }; static const clangWindowsTargetFlags = { diff --git a/pkgs/native_toolchain_c/lib/src/native_toolchain/android_ndk.dart b/pkgs/native_toolchain_c/lib/src/native_toolchain/android_ndk.dart index 9d4547e71f..5e36712c3a 100644 --- a/pkgs/native_toolchain_c/lib/src/native_toolchain/android_ndk.dart +++ b/pkgs/native_toolchain_c/lib/src/native_toolchain/android_ndk.dart @@ -53,9 +53,7 @@ class _AndroidNdkResolver implements ToolResolver { '\$HOME/Android/Sdk/ndk/*/', '\$HOME/Android/Sdk/ndk-bundle/', ], - if (Platform.isMacOS) ...[ - '\$HOME/Library/Android/sdk/ndk/*/', - ], + if (Platform.isMacOS) ...['\$HOME/Library/Android/sdk/ndk/*/'], if (Platform.isWindows) ...[ '\$HOME/AppData/Local/Android/Sdk/ndk/*/', ], @@ -71,11 +69,8 @@ class _AndroidNdkResolver implements ToolResolver { return [ for (final ndkInstance in ndkInstances) ...[ ndkInstance, - ...await tryResolveClang( - ndkInstance, - logger: logger, - ) - ] + ...await tryResolveClang(ndkInstance, logger: logger), + ], ]; } @@ -84,8 +79,9 @@ class _AndroidNdkResolver implements ToolResolver { required Logger? logger, }) async { final result = []; - final prebuiltUri = - androidNdkInstance.uri.resolve('toolchains/llvm/prebuilt/'); + final prebuiltUri = androidNdkInstance.uri.resolve( + 'toolchains/llvm/prebuilt/', + ); final prebuiltDir = Directory.fromUri(prebuiltUri); final hostArchDirs = (await prebuiltDir.list().toList()).whereType().toList(); @@ -94,37 +90,34 @@ class _AndroidNdkResolver implements ToolResolver { .resolve('bin/') .resolve(OS.current.executableFileName('clang')); if (await File.fromUri(clangUri).exists()) { - result.add(await CliVersionResolver.lookupVersion( - ToolInstance( - tool: androidNdkClang, - uri: clangUri, + result.add( + await CliVersionResolver.lookupVersion( + ToolInstance(tool: androidNdkClang, uri: clangUri), + logger: logger, ), - logger: logger, - )); + ); } final arUri = hostArchDir.uri .resolve('bin/') .resolve(OS.current.executableFileName('llvm-ar')); if (await File.fromUri(arUri).exists()) { - result.add(await CliVersionResolver.lookupVersion( - ToolInstance( - tool: androidNdkLlvmAr, - uri: arUri, + result.add( + await CliVersionResolver.lookupVersion( + ToolInstance(tool: androidNdkLlvmAr, uri: arUri), + logger: logger, ), - logger: logger, - )); + ); } final ldUri = hostArchDir.uri .resolve('bin/') .resolve(OS.current.executableFileName('ld.lld')); if (await File.fromUri(arUri).exists()) { - result.add(await CliVersionResolver.lookupVersion( - ToolInstance( - tool: androidNdkLld, - uri: ldUri, + result.add( + await CliVersionResolver.lookupVersion( + ToolInstance(tool: androidNdkLld, uri: ldUri), + logger: logger, ), - logger: logger, - )); + ); } } return result; diff --git a/pkgs/native_toolchain_c/lib/src/native_toolchain/clang.dart b/pkgs/native_toolchain_c/lib/src/native_toolchain/clang.dart index 0b31639e83..34592b9dc8 100644 --- a/pkgs/native_toolchain_c/lib/src/native_toolchain/clang.dart +++ b/pkgs/native_toolchain_c/lib/src/native_toolchain/clang.dart @@ -29,9 +29,7 @@ final Tool clang = Tool( ), InstallLocationResolver( toolName: 'Clang', - paths: [ - 'C:/Program Files/LLVM/bin/clang.exe', - ], + paths: ['C:/Program Files/LLVM/bin/clang.exe'], ), ]), ), diff --git a/pkgs/native_toolchain_c/lib/src/native_toolchain/gcc.dart b/pkgs/native_toolchain_c/lib/src/native_toolchain/gcc.dart index b6d280fcf0..bb3ec8fb70 100644 --- a/pkgs/native_toolchain_c/lib/src/native_toolchain/gcc.dart +++ b/pkgs/native_toolchain_c/lib/src/native_toolchain/gcc.dart @@ -13,10 +13,7 @@ import '../tool/tool_resolver.dart'; final gcc = Tool( name: 'GCC', defaultResolver: CliVersionResolver( - wrappedResolver: PathToolResolver( - toolName: 'GCC', - executableName: 'gcc', - ), + wrappedResolver: PathToolResolver(toolName: 'GCC', executableName: 'gcc'), ), ); @@ -74,14 +71,14 @@ final riscv64LinuxGnuGccAr = _gnuArchiver('riscv64-linux-gnu'); final riscv64LinuxGnuLd = _gnuLinker('riscv64-linux-gnu'); Tool _gcc(String prefix) => Tool( - name: gcc.name, - defaultResolver: CliVersionResolver( - wrappedResolver: PathToolResolver( - toolName: gcc.name, - executableName: '$prefix-gcc', - ), - ), - ); + name: gcc.name, + defaultResolver: CliVersionResolver( + wrappedResolver: PathToolResolver( + toolName: gcc.name, + executableName: '$prefix-gcc', + ), + ), +); Tool _gnuArchiver(String prefix) { final gcc = _gcc(prefix); diff --git a/pkgs/native_toolchain_c/lib/src/native_toolchain/msvc.dart b/pkgs/native_toolchain_c/lib/src/native_toolchain/msvc.dart index bfdce4d2d9..f0a2056bce 100644 --- a/pkgs/native_toolchain_c/lib/src/native_toolchain/msvc.dart +++ b/pkgs/native_toolchain_c/lib/src/native_toolchain/msvc.dart @@ -21,21 +21,19 @@ final Tool vswhere = Tool( name: 'Visual Studio Locator', defaultResolver: CliVersionResolver( arguments: [], - wrappedResolver: ToolResolvers( - [ - PathToolResolver( - toolName: 'Visual Studio Locator', - executableName: 'vswhere.exe', - ), - InstallLocationResolver( - toolName: 'Visual Studio Locator', - paths: [ - 'C:/Program Files \\(x86\\)/Microsoft Visual Studio/Installer/vswhere.exe', - 'C:/Program Files/Microsoft Visual Studio/Installer/vswhere.exe', - ], - ), - ], - ), + wrappedResolver: ToolResolvers([ + PathToolResolver( + toolName: 'Visual Studio Locator', + executableName: 'vswhere.exe', + ), + InstallLocationResolver( + toolName: 'Visual Studio Locator', + paths: [ + 'C:/Program Files \\(x86\\)/Microsoft Visual Studio/Installer/vswhere.exe', + 'C:/Program Files/Microsoft Visual Studio/Installer/vswhere.exe', + ], + ), + ]), ), ); @@ -81,9 +79,7 @@ Tool vcvars(ToolInstance toolInstance) { name: fileName, defaultResolver: InstallLocationResolver( toolName: fileName, - paths: [ - Glob.quote(batchScript.toFilePath().replaceAll('\\', '/')), - ], + paths: [Glob.quote(batchScript.toFilePath().replaceAll('\\', '/'))], ), ); } @@ -238,10 +234,7 @@ Tool _msvcTool({ }) { final executableName = OS.windows.executableFileName(name); if (OS.current != OS.windows) { - return Tool( - name: executableName, - defaultResolver: ToolResolvers([]), - ); + return Tool(name: executableName, defaultResolver: ToolResolvers([])); } final hostArchName = _msvcArchNames[hostArchitecture]!; final targetArchName = _msvcArchNames[targetArchitecture]!; @@ -259,17 +252,15 @@ Tool _msvcTool({ wrappedResolver: resolver, ); } - return Tool( - name: executableName, - defaultResolver: resolver, - ); + return Tool(name: executableName, defaultResolver: resolver); } class VisualStudioResolver implements ToolResolver { @override Future> resolve({required Logger? logger}) async { - final vswhereInstances = - await vswhere.defaultResolver!.resolve(logger: logger); + final vswhereInstances = await vswhere.defaultResolver!.resolve( + logger: logger, + ); final result = []; for (final vswhereInstance in vswhereInstances.take(1)) { @@ -285,8 +276,11 @@ class VisualStudioResolver implements ToolResolver { assert(await dir.exists()); final uri = dir.uri; final version = versionFromString(toolInfoParsed['installationName']!); - final instance = - ToolInstance(tool: visualStudio, uri: uri, version: version); + final instance = ToolInstance( + tool: visualStudio, + uri: uri, + version: version, + ); logger?.fine('Found $instance.'); result.add(instance); } diff --git a/pkgs/native_toolchain_c/lib/src/native_toolchain/recognizer.dart b/pkgs/native_toolchain_c/lib/src/native_toolchain/recognizer.dart index a1cfbbe65b..b8b71f7541 100644 --- a/pkgs/native_toolchain_c/lib/src/native_toolchain/recognizer.dart +++ b/pkgs/native_toolchain_c/lib/src/native_toolchain/recognizer.dart @@ -27,8 +27,11 @@ class CompilerRecognizer implements ToolResolver { if (filePath.contains('-gcc')) { tool = gcc; } else if (filePath.endsWith(os.executableFileName('clang'))) { - final stdout = await CliFilter.executeCli(uri, - arguments: ['--version'], logger: logger); + final stdout = await CliFilter.executeCli( + uri, + arguments: ['--version'], + logger: logger, + ); if (stdout.contains('Apple clang')) { tool = appleClang; } else { @@ -45,9 +48,7 @@ class CompilerRecognizer implements ToolResolver { await CliVersionResolver.lookupVersion( toolInstance, logger: logger, - arguments: [ - if (tool != cl) '--version', - ], + arguments: [if (tool != cl) '--version'], ), ]; } @@ -83,10 +84,7 @@ class LinkerRecognizer implements ToolResolver { final toolInstance = ToolInstance(tool: tool, uri: uri); if (tool == lld) { return [ - await CliVersionResolver.lookupVersion( - toolInstance, - logger: logger, - ), + await CliVersionResolver.lookupVersion(toolInstance, logger: logger), ]; } if (tool == msvcLink) { @@ -133,10 +131,7 @@ class ArchiverRecognizer implements ToolResolver { final toolInstance = ToolInstance(tool: tool, uri: uri); if (tool == llvmAr) { return [ - await CliVersionResolver.lookupVersion( - toolInstance, - logger: logger, - ), + await CliVersionResolver.lookupVersion(toolInstance, logger: logger), ]; } return [toolInstance]; diff --git a/pkgs/native_toolchain_c/lib/src/native_toolchain/xcode.dart b/pkgs/native_toolchain_c/lib/src/native_toolchain/xcode.dart index 48c25c3c0f..dbefb7683e 100644 --- a/pkgs/native_toolchain_c/lib/src/native_toolchain/xcode.dart +++ b/pkgs/native_toolchain_c/lib/src/native_toolchain/xcode.dart @@ -92,7 +92,8 @@ class XCodeSdkResolver implements ToolResolver { final uriSymbolic = Uri.directory(result.stdout.trim()); logger?.fine('Found $sdk at ${uriSymbolic.toFilePath()}'); final uri = Uri.directory( - await Directory.fromUri(uriSymbolic).resolveSymbolicLinks()); + await Directory.fromUri(uriSymbolic).resolveSymbolicLinks(), + ); if (uriSymbolic != uri) { logger?.fine('Found $sdk at ${uri.toFilePath()}'); } diff --git a/pkgs/native_toolchain_c/lib/src/tool/tool.dart b/pkgs/native_toolchain_c/lib/src/tool/tool.dart index ff42f28559..16038568ba 100644 --- a/pkgs/native_toolchain_c/lib/src/tool/tool.dart +++ b/pkgs/native_toolchain_c/lib/src/tool/tool.dart @@ -9,10 +9,7 @@ class Tool { ToolResolver? defaultResolver; - Tool({ - required this.name, - this.defaultResolver, - }); + Tool({required this.name, this.defaultResolver}); @override bool operator ==(Object other) => other is Tool && name == other.name; diff --git a/pkgs/native_toolchain_c/lib/src/tool/tool_instance.dart b/pkgs/native_toolchain_c/lib/src/tool/tool_instance.dart index c1a373b7eb..44f1d4cdda 100644 --- a/pkgs/native_toolchain_c/lib/src/tool/tool_instance.dart +++ b/pkgs/native_toolchain_c/lib/src/tool/tool_instance.dart @@ -18,21 +18,13 @@ class ToolInstance implements Comparable { /// Can be null if version is hard to determine. final Version? version; - ToolInstance({ - required this.tool, - required this.uri, - this.version, - }); + ToolInstance({required this.tool, required this.uri, this.version}); - ToolInstance copyWith({ - Uri? uri, - Version? version, - }) => - ToolInstance( - tool: tool, - uri: uri ?? this.uri, - version: version ?? this.version, - ); + ToolInstance copyWith({Uri? uri, Version? version}) => ToolInstance( + tool: tool, + uri: uri ?? this.uri, + version: version ?? this.version, + ); @override String toString() => 'ToolInstance(${tool.name}, $version, $uri)'; diff --git a/pkgs/native_toolchain_c/lib/src/tool/tool_requirement.dart b/pkgs/native_toolchain_c/lib/src/tool/tool_requirement.dart index 33dba8ba49..5b09270470 100644 --- a/pkgs/native_toolchain_c/lib/src/tool/tool_requirement.dart +++ b/pkgs/native_toolchain_c/lib/src/tool/tool_requirement.dart @@ -22,10 +22,7 @@ class ToolRequirement implements Requirement { final Version? minimumVersion; - ToolRequirement( - this.tool, { - this.minimumVersion, - }); + ToolRequirement(this.tool, {this.minimumVersion}); @override String toString() => diff --git a/pkgs/native_toolchain_c/lib/src/tool/tool_resolver.dart b/pkgs/native_toolchain_c/lib/src/tool/tool_resolver.dart index f665a7d92e..8a82636267 100644 --- a/pkgs/native_toolchain_c/lib/src/tool/tool_resolver.dart +++ b/pkgs/native_toolchain_c/lib/src/tool/tool_resolver.dart @@ -31,11 +31,10 @@ class PathToolResolver extends ToolResolver { final String executableName; - PathToolResolver({ - required this.toolName, - String? executableName, - }) : executableName = executableName ?? - OS.current.executableFileName(toolName.toLowerCase()); + PathToolResolver({required this.toolName, String? executableName}) + : executableName = + executableName ?? + OS.current.executableFileName(toolName.toLowerCase()); @override Future> resolve({required Logger? logger}) async { @@ -45,9 +44,7 @@ class PathToolResolver extends ToolResolver { logger?.fine('Did not find $toolName on PATH.'); return []; } - final toolInstances = [ - ToolInstance(tool: Tool(name: toolName), uri: uri), - ]; + final toolInstances = [ToolInstance(tool: Tool(name: toolName), uri: uri)]; logger?.fine('Found ${toolInstances.single}.'); return toolInstances; } @@ -96,7 +93,7 @@ class CliVersionResolver implements ToolResolver { arguments: arguments, expectedExitCode: expectedExitCode, logger: logger, - ) + ), ]; } @@ -133,8 +130,9 @@ class CliVersionResolver implements ToolResolver { if (process.exitCode != expectedExitCode) { final executablePath = executable.toFilePath(); throw ToolError( - '`$executablePath ${arguments.join(' ')}` returned unexpected exit' - ' code: ${process.exitCode}.'); + '`$executablePath ${arguments.join(' ')}` returned unexpected exit' + ' code: ${process.exitCode}.', + ); } return versionFromString(process.stderr) ?? versionFromString(process.stdout)!; @@ -151,7 +149,7 @@ class PathVersionResolver implements ToolResolver { final toolInstances = await wrappedResolver.resolve(logger: logger); return [ - for (final toolInstance in toolInstances) lookupVersion(toolInstance) + for (final toolInstance in toolInstances) lookupVersion(toolInstance), ]; } @@ -159,9 +157,7 @@ class PathVersionResolver implements ToolResolver { if (toolInstance.version != null) { return toolInstance; } - return toolInstance.copyWith( - version: version(toolInstance.uri), - ); + return toolInstance.copyWith(version: version(toolInstance.uri)); } static Version? version(Uri uri) { @@ -179,19 +175,15 @@ class ToolResolvers implements ToolResolver { @override Future> resolve({required Logger? logger}) async => [ - for (final resolver in resolvers) - ...await resolver.resolve(logger: logger) - ]; + for (final resolver in resolvers) ...await resolver.resolve(logger: logger), + ]; } class InstallLocationResolver implements ToolResolver { final String toolName; final List paths; - InstallLocationResolver({ - required this.toolName, - required this.paths, - }); + InstallLocationResolver({required this.toolName, required this.paths}); static const home = '\$HOME'; @@ -199,7 +191,7 @@ class InstallLocationResolver implements ToolResolver { Future> resolve({required Logger? logger}) async { logger?.finer('Looking for $toolName in $paths.'); final resolvedPaths = [ - for (final path in paths) ...await tryResolvePath(path) + for (final path in paths) ...await tryResolvePath(path), ]; final toolInstances = [ for (final uri in resolvedPaths) @@ -218,7 +210,9 @@ class InstallLocationResolver implements ToolResolver { final homeDir_ = homeDir; assert(homeDir_ != null); path = path.replaceAll( - '$home/', homeDir!.toFilePath().replaceAll('\\', '/')); + '$home/', + homeDir!.toFilePath().replaceAll('\\', '/'), + ); } final result = []; @@ -258,15 +252,20 @@ class RelativeToolResolver implements ToolResolver { Future> resolve({required Logger? logger}) async { final otherToolInstances = await wrappedResolver.resolve(logger: logger); - logger?.finer('Looking for $toolName relative to $otherToolInstances ' - 'with $relativePath.'); + logger?.finer( + 'Looking for $toolName relative to $otherToolInstances ' + 'with $relativePath.', + ); final globs = [ for (final toolInstance in otherToolInstances) - Glob([ - Glob.quote( - toolInstance.uri.resolve('.').toFilePath().replaceAll('\\', '/')), - relativePath.path - ].join()) + Glob( + [ + Glob.quote( + toolInstance.uri.resolve('.').toFilePath().replaceAll('\\', '/'), + ), + relativePath.path, + ].join(), + ), ]; final fileSystemEntities = [ for (final glob in globs) ...await glob.list().toList(), @@ -274,10 +273,7 @@ class RelativeToolResolver implements ToolResolver { final result = [ for (final fileSystemEntity in fileSystemEntities) - ToolInstance( - tool: Tool(name: toolName), - uri: fileSystemEntity.uri, - ), + ToolInstance(tool: Tool(name: toolName), uri: fileSystemEntity.uri), ]; if (result.isNotEmpty) { @@ -305,7 +301,7 @@ class CliFilter implements ToolResolver { final toolInstances = await wrappedResolver.resolve(logger: logger); return [ for (final toolInstance in toolInstances) - await filter(toolInstance, logger: logger) + await filter(toolInstance, logger: logger), ].whereType().toList(); } diff --git a/pkgs/native_toolchain_c/lib/src/utils/run_process.dart b/pkgs/native_toolchain_c/lib/src/utils/run_process.dart index 9892514098..51e4396f05 100644 --- a/pkgs/native_toolchain_c/lib/src/utils/run_process.dart +++ b/pkgs/native_toolchain_c/lib/src/utils/run_process.dart @@ -47,27 +47,32 @@ Future runProcess({ final stdoutSub = process.stdout .transform(utf8.decoder) .transform(const LineSplitter()) - .listen(captureOutput - ? (s) { + .listen( + captureOutput + ? (s) { logger?.fine(s); stdoutBuffer.writeln(s); } - : logger?.fine); + : logger?.fine, + ); final stderrSub = process.stderr .transform(utf8.decoder) .transform(const LineSplitter()) - .listen(captureOutput - ? (s) { + .listen( + captureOutput + ? (s) { logger?.severe(s); stderrBuffer.writeln(s); } - : logger?.severe); + : logger?.severe, + ); - final (exitCode, _, _) = await ( - process.exitCode, - stdoutSub.asFuture(), - stderrSub.asFuture() - ).wait; + final (exitCode, _, _) = + await ( + process.exitCode, + stdoutSub.asFuture(), + stderrSub.asFuture(), + ).wait; final result = RunProcessResult( pid: process.pid, command: commandString, diff --git a/pkgs/native_toolchain_c/lib/src/utils/sem_version.dart b/pkgs/native_toolchain_c/lib/src/utils/sem_version.dart index 39f83426b1..bf15c9d716 100644 --- a/pkgs/native_toolchain_c/lib/src/utils/sem_version.dart +++ b/pkgs/native_toolchain_c/lib/src/utils/sem_version.dart @@ -36,7 +36,9 @@ Version? versionFromString(String containsVersion) { } final _semverRegex = RegExp( - r'(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?'); + r'(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?', +); final _semverRegexReleaxed = RegExp( - r'(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?'); + r'(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?', +); diff --git a/pkgs/native_toolchain_c/pubspec.yaml b/pkgs/native_toolchain_c/pubspec.yaml index 723c4791fc..4709accba5 100644 --- a/pkgs/native_toolchain_c/pubspec.yaml +++ b/pkgs/native_toolchain_c/pubspec.yaml @@ -14,7 +14,7 @@ topics: - native-toolchain environment: - sdk: '>=3.1.0 <4.0.0' + sdk: '>=3.7.0 <4.0.0' dependencies: glob: ^2.1.1 diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart index c49ae3ec03..55aed987a9 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart @@ -2,10 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -@OnPlatform({ - 'mac-os': Timeout.factor(2), - 'windows': Timeout.factor(10), -}) +@OnPlatform({'mac-os': Timeout.factor(2), 'windows': Timeout.factor(10)}) library; import 'dart:io'; @@ -19,39 +16,41 @@ void main() { test('build failure', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final addCOriginalUri = - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); + final addCOriginalUri = packageUri.resolve( + 'test/cbuilder/testfiles/add/src/add.c', + ); final addCUri = tempUri.resolve('add.c'); final addCOriginalContents = await File.fromUri(addCOriginalUri).readAsString(); final addCBrokenContents = addCOriginalContents.replaceAll( - 'int32_t a, int32_t b', 'int64_t blabla'); + 'int32_t a, int32_t b', + 'int64_t blabla', + ); await File.fromUri(addCUri).writeAsString(addCBrokenContents); const name = 'add'; final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: targetOS == OS.macOS - ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) - : null, - targetArchitecture: Architecture.current, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: + targetOS == OS.macOS + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) + : null, + targetArchitecture: Architecture.current, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -63,11 +62,8 @@ void main() { buildMode: BuildMode.release, ); expect( - () => cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ), + () => + cbuilder.run(input: buildInput, output: buildOutput, logger: logger), throwsException, ); }); diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart index 32649f42d9..24bc41b75f 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart @@ -50,8 +50,7 @@ void main() { final optimizationLevel = optimizationLevels[selectOptimizationLevel]; selectOptimizationLevel = (selectOptimizationLevel + 1) % optimizationLevels.length; - test( - 'CBuilder $linkMode library $target minSdkVersion $apiLevel ' + test('CBuilder $linkMode library $target minSdkVersion $apiLevel ' '$optimizationLevel', () async { final tempUri = await tempDirForTest(); final libUri = await buildLib( @@ -144,28 +143,27 @@ Future buildLib( final tempUriShared = tempUri.resolve('shared/'); await Directory.fromUri(tempUriShared).create(); - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUriShared, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.android, - targetArchitecture: targetArchitecture, - cCompiler: cCompiler, - android: AndroidCodeConfig(targetNdkApi: androidNdkApi), - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUriShared, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.android, + targetArchitecture: targetArchitecture, + cCompiler: cCompiler, + android: AndroidCodeConfig(targetNdkApi: androidNdkApi), + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -177,11 +175,7 @@ Future buildLib( flags: flags, buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final libUri = tempUri.resolve(OS.android.libraryFileName(name, linkMode)); return libUri; diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart index 2c95c00091..8f9148d3fb 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart @@ -3,9 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('mac-os') -@OnPlatform({ - 'mac-os': Timeout.factor(2), -}) +@OnPlatform({'mac-os': Timeout.factor(2)}) library; import 'dart:io'; @@ -25,10 +23,7 @@ void main() { return; } - const targets = [ - Architecture.arm64, - Architecture.x64, - ]; + const targets = [Architecture.arm64, Architecture.x64]; // Dont include 'mach-o' or 'Mach-O', different spelling is used. const objdumpFileFormat = { @@ -60,127 +55,137 @@ void main() { selectOptimizationLevel = (selectOptimizationLevel + 1) % optimizationLevels.length; test( - 'CBuilder $linkMode $language library $targetIOSSdk $target' - ' ${installName ?? ''} $optimizationLevel' - .trim(), () async { - final tempUri = await tempDirForTest(); - final tempUri2 = await tempDirForTest(); - final sourceUri = switch (language) { - Language.c => - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'), - Language.objectiveC => packageUri.resolve( - 'test/cbuilder/testfiles/add_objective_c/src/add.m'), - Language() => throw UnimplementedError(), - }; - - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.iOS, - targetArchitecture: target, - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - iOS: IOSCodeConfig( - targetSdk: targetIOSSdk, - targetVersion: flutteriOSHighestBestEffort, + 'CBuilder $linkMode $language library $targetIOSSdk $target' + ' ${installName ?? ''} $optimizationLevel' + .trim(), + () async { + final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); + final sourceUri = switch (language) { + Language.c => packageUri.resolve( + 'test/cbuilder/testfiles/add/src/add.c', ), - cCompiler: cCompiler, - ); + Language.objectiveC => packageUri.resolve( + 'test/cbuilder/testfiles/add_objective_c/src/add.m', + ), + Language() => throw UnimplementedError(), + }; - final buildInput = BuildInput(buildInputBuilder.json); - final buildOutput = BuildOutputBuilder(); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.iOS, + targetArchitecture: target, + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + iOS: IOSCodeConfig( + targetSdk: targetIOSSdk, + targetVersion: flutteriOSHighestBestEffort, + ), + cCompiler: cCompiler, + ); - final cbuilder = CBuilder.library( - name: name, - assetName: name, - sources: [sourceUri.toFilePath()], - installName: installName, - language: language, - optimizationLevel: optimizationLevel, - buildMode: BuildMode.release, - ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + final buildInput = BuildInput(buildInputBuilder.json); + final buildOutput = BuildOutputBuilder(); - final libUri = tempUri.resolve(libName); - final objdumpResult = await runProcess( - executable: Uri.file('objdump'), - arguments: ['-t', libUri.path], - logger: logger, - ); - expect(objdumpResult.exitCode, 0); - final machine = objdumpResult.stdout - .split('\n') - .firstWhere((e) => e.contains('file format')); - expect(machine, contains(objdumpFileFormat[target])); + final cbuilder = CBuilder.library( + name: name, + assetName: name, + sources: [sourceUri.toFilePath()], + installName: installName, + language: language, + optimizationLevel: optimizationLevel, + buildMode: BuildMode.release, + ); + await cbuilder.run( + input: buildInput, + output: buildOutput, + logger: logger, + ); - final otoolResult = await runProcess( - executable: Uri.file('otool'), - arguments: ['-l', libUri.path], - logger: logger, - ); - expect(otoolResult.exitCode, 0); - // As of native_assets_cli 0.10.0, the min target OS version is - // always being passed in. - expect(otoolResult.stdout, - isNot(contains('LC_VERSION_MIN_IPHONEOS'))); - expect(otoolResult.stdout, contains('LC_BUILD_VERSION')); - final platform = otoolResult.stdout - .split('\n') - .firstWhere((e) => e.contains('platform')); - if (targetIOSSdk == IOSSdk.iPhoneOS) { - const platformIosDevice = 2; - expect(platform, contains(platformIosDevice.toString())); - } else { - const platformIosSimulator = 7; - expect(platform, contains(platformIosSimulator.toString())); - } + final libUri = tempUri.resolve(libName); + final objdumpResult = await runProcess( + executable: Uri.file('objdump'), + arguments: ['-t', libUri.path], + logger: logger, + ); + expect(objdumpResult.exitCode, 0); + final machine = objdumpResult.stdout + .split('\n') + .firstWhere((e) => e.contains('file format')); + expect(machine, contains(objdumpFileFormat[target])); - if (linkMode == DynamicLoadingBundled()) { - final libInstallName = - await runOtoolInstallName(libUri, libName); - if (installName == null) { - // If no install path is passed, we have an absolute path. - final tempName = - tempUri.pathSegments.lastWhere((e) => e != ''); - final pathEnding = - Uri.directory(tempName).resolve(libName).toFilePath(); - expect(Uri.file(libInstallName).isAbsolute, true); - expect(libInstallName, contains(pathEnding)); - final targetInstallName = - '@executable_path/Frameworks/$libName'; - await runProcess( - executable: Uri.file('install_name_tool'), - arguments: [ - '-id', - targetInstallName, - libUri.toFilePath(), - ], - logger: logger, - ); - final libInstallName2 = - await runOtoolInstallName(libUri, libName); - expect(libInstallName2, targetInstallName); + final otoolResult = await runProcess( + executable: Uri.file('otool'), + arguments: ['-l', libUri.path], + logger: logger, + ); + expect(otoolResult.exitCode, 0); + // As of native_assets_cli 0.10.0, the min target OS version is + // always being passed in. + expect( + otoolResult.stdout, + isNot(contains('LC_VERSION_MIN_IPHONEOS')), + ); + expect(otoolResult.stdout, contains('LC_BUILD_VERSION')); + final platform = otoolResult.stdout + .split('\n') + .firstWhere((e) => e.contains('platform')); + if (targetIOSSdk == IOSSdk.iPhoneOS) { + const platformIosDevice = 2; + expect(platform, contains(platformIosDevice.toString())); } else { - expect(libInstallName, installName.toFilePath()); + const platformIosSimulator = 7; + expect(platform, contains(platformIosSimulator.toString())); } - } - }); + + if (linkMode == DynamicLoadingBundled()) { + final libInstallName = await runOtoolInstallName( + libUri, + libName, + ); + if (installName == null) { + // If no install path is passed, we have an absolute path. + final tempName = tempUri.pathSegments.lastWhere( + (e) => e != '', + ); + final pathEnding = + Uri.directory(tempName).resolve(libName).toFilePath(); + expect(Uri.file(libInstallName).isAbsolute, true); + expect(libInstallName, contains(pathEnding)); + final targetInstallName = + '@executable_path/Frameworks/$libName'; + await runProcess( + executable: Uri.file('install_name_tool'), + arguments: [ + '-id', + targetInstallName, + libUri.toFilePath(), + ], + logger: logger, + ); + final libInstallName2 = await runOtoolInstallName( + libUri, + libName, + ); + expect(libInstallName2, targetInstallName); + } else { + expect(libInstallName, installName.toFilePath()); + } + } + }, + ); } } } @@ -189,7 +194,7 @@ void main() { for (final iosVersion in [ flutteriOSHighestBestEffort, - flutteriOSHighestSupported + flutteriOSHighestSupported, ]) { for (final linkMode in [DynamicLoadingBundled(), StaticLinking()]) { test('$linkMode ios min version $iosVersion', () async { @@ -229,31 +234,30 @@ Future buildLib( final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.iOS, - targetArchitecture: targetArchitecture, - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - iOS: IOSCodeConfig( - targetSdk: IOSSdk.iPhoneOS, - targetVersion: targetIOSVersion, - ), - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.iOS, + targetArchitecture: targetArchitecture, + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + iOS: IOSCodeConfig( + targetSdk: IOSSdk.iPhoneOS, + targetVersion: targetIOSVersion, + ), + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -264,11 +268,7 @@ Future buildLib( sources: [addCUri.toFilePath()], buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final libUri = tempUri.resolve(OS.iOS.libraryFileName(name, linkMode)); return libUri; diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart index a55dd4324b..cb016445b8 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart @@ -38,31 +38,31 @@ void main() { test('CBuilder $linkMode library $target $optimizationLevel', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final addCUri = - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); + final addCUri = packageUri.resolve( + 'test/cbuilder/testfiles/add/src/add.c', + ); const name = 'add'; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.linux, - targetArchitecture: target, - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.linux, + targetArchitecture: target, + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -80,8 +80,9 @@ void main() { logger: logger, ); - final libUri = - tempUri.resolve(OS.linux.libraryFileName(name, linkMode)); + final libUri = tempUri.resolve( + OS.linux.libraryFileName(name, linkMode), + ); final machine = await readelfMachine(libUri.path); expect(machine, contains(readElfMachine[target])); }); diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart index cd61c3bc2e..55a4885235 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart @@ -3,9 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('mac-os') -@OnPlatform({ - 'mac-os': Timeout.factor(2), -}) +@OnPlatform({'mac-os': Timeout.factor(2)}) library; import 'dart:io'; @@ -22,10 +20,7 @@ void main() { return; } - const targets = [ - Architecture.arm64, - Architecture.x64, - ]; + const targets = [Architecture.arm64, Architecture.x64]; // Dont include 'mach-o' or 'Mach-O', different spelling is used. const objdumpFileFormat = { @@ -44,71 +39,75 @@ void main() { selectOptimizationLevel = (selectOptimizationLevel + 1) % optimizationLevels.length; - test('CBuilder $linkMode $language library $target $optimizationLevel', - () async { - final tempUri = await tempDirForTest(); - final tempUri2 = await tempDirForTest(); - final sourceUri = switch (language) { - Language.c => - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'), - Language.objectiveC => packageUri - .resolve('test/cbuilder/testfiles/add_objective_c/src/add.m'), - Language() => throw UnimplementedError(), - }; - const name = 'add'; - - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.macOS, - targetArchitecture: target, - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - cCompiler: cCompiler, - macOS: MacOSCodeConfig(targetVersion: defaultMacOSVersion), + test( + 'CBuilder $linkMode $language library $target $optimizationLevel', + () async { + final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); + final sourceUri = switch (language) { + Language.c => packageUri.resolve( + 'test/cbuilder/testfiles/add/src/add.c', + ), + Language.objectiveC => packageUri.resolve( + 'test/cbuilder/testfiles/add_objective_c/src/add.m', + ), + Language() => throw UnimplementedError(), + }; + const name = 'add'; + + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.macOS, + targetArchitecture: target, + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + cCompiler: cCompiler, + macOS: MacOSCodeConfig(targetVersion: defaultMacOSVersion), + ); + final buildInput = BuildInput(buildInputBuilder.json); + final buildOutput = BuildOutputBuilder(); + + final cbuilder = CBuilder.library( + name: name, + assetName: name, + sources: [sourceUri.toFilePath()], + language: language, + optimizationLevel: optimizationLevel, + buildMode: BuildMode.release, + ); + await cbuilder.run( + input: buildInput, + output: buildOutput, + logger: logger, + ); + + final libUri = tempUri.resolve( + OS.macOS.libraryFileName(name, linkMode), + ); + final result = await runProcess( + executable: Uri.file('objdump'), + arguments: ['-t', libUri.path], + logger: logger, ); - final buildInput = BuildInput(buildInputBuilder.json); - final buildOutput = BuildOutputBuilder(); - - final cbuilder = CBuilder.library( - name: name, - assetName: name, - sources: [sourceUri.toFilePath()], - language: language, - optimizationLevel: optimizationLevel, - buildMode: BuildMode.release, - ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); - - final libUri = - tempUri.resolve(OS.macOS.libraryFileName(name, linkMode)); - final result = await runProcess( - executable: Uri.file('objdump'), - arguments: ['-t', libUri.path], - logger: logger, - ); - expect(result.exitCode, 0); - final machine = result.stdout - .split('\n') - .firstWhere((e) => e.contains('file format')); - expect(machine, contains(objdumpFileFormat[target])); - }); + expect(result.exitCode, 0); + final machine = result.stdout + .split('\n') + .firstWhere((e) => e.contains('file format')); + expect(machine, contains(objdumpFileFormat[target])); + }, + ); } } } @@ -118,7 +117,7 @@ void main() { for (final macosVersion in [ flutterMacOSLowestBestEffort, - flutterMacOSLowestSupported + flutterMacOSLowestSupported, ]) { for (final linkMode in [DynamicLoadingBundled(), StaticLinking()]) { test('$linkMode macos min version $macosVersion', () async { @@ -158,28 +157,27 @@ Future buildLib( final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.macOS, - targetArchitecture: targetArchitecture, - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - macOS: MacOSCodeConfig(targetVersion: targetMacOSVersion), - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.macOS, + targetArchitecture: targetArchitecture, + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + macOS: MacOSCodeConfig(targetVersion: targetMacOSVersion), + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -190,11 +188,7 @@ Future buildLib( sources: [addCUri.toFilePath()], buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final libUri = tempUri.resolve(OS.iOS.libraryFileName(name, linkMode)); return libUri; diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart index fd3bb1ef93..fc316d6661 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart @@ -3,9 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('windows') -@OnPlatform({ - 'windows': Timeout.factor(10), -}) +@OnPlatform({'windows': Timeout.factor(10)}) library; import 'dart:io'; @@ -28,7 +26,8 @@ void main() async { // Either provided to be MSVC or null which defaults to MSVC. msvc: () async => cCompiler, // Clang on Windows. - clang: () async => CCompilerConfig( + clang: + () async => CCompilerConfig( archiver: (await llvmAr.defaultResolver!.resolve(logger: logger)).first.uri, compiler: @@ -36,7 +35,7 @@ void main() async { linker: (await lld.defaultResolver!.resolve(logger: logger)).first.uri, windows: WindowsCCompilerConfig(), - ) + ), }; const targets = [ @@ -77,36 +76,35 @@ void main() async { (selectOptimizationLevel + 1) % optimizationLevels.length; final buildMode = BuildMode.values[selectBuildMode]; selectBuildMode = (selectBuildMode + 1) % BuildMode.values.length; - test( - 'CBuilder ${compiler.name} $linkMode library $target' + test('CBuilder ${compiler.name} $linkMode library $target' ' $optimizationLevel $buildMode', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final addCUri = - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); + final addCUri = packageUri.resolve( + 'test/cbuilder/testfiles/add/src/add.c', + ); const name = 'add'; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.windows, - targetArchitecture: target, - linkModePreference: linkMode == DynamicLoadingBundled() - ? LinkModePreference.dynamic - : LinkModePreference.static, - cCompiler: await (compilers[compiler]!)(), - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.windows, + targetArchitecture: target, + linkModePreference: + linkMode == DynamicLoadingBundled() + ? LinkModePreference.dynamic + : LinkModePreference.static, + cCompiler: await (compilers[compiler]!)(), + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -124,8 +122,9 @@ void main() async { logger: logger, ); - final libUri = - tempUri.resolve(OS.windows.libraryFileName(name, linkMode)); + final libUri = tempUri.resolve( + OS.windows.libraryFileName(name, linkMode), + ); expect(await File.fromUri(libUri).exists(), true); final result = await runProcess( executable: dumpbinUri, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart index 65b1eb275d..e4bbdd9ad5 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart @@ -2,10 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -@OnPlatform({ - 'mac-os': Timeout.factor(2), - 'windows': Timeout.factor(10), -}) +@OnPlatform({'mac-os': Timeout.factor(2), 'windows': Timeout.factor(10)}) library; import 'dart:ffi'; @@ -24,12 +21,16 @@ void main() { }); final targetOS = OS.current; - final macOSConfig = targetOS == OS.macOS - ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) - : null; + final macOSConfig = + targetOS == OS.macOS + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) + : null; for (final pic in [null, true, false]) { - final picTag = - switch (pic) { null => 'auto_pic', true => 'pic', false => 'no_pic' }; + final picTag = switch (pic) { + null => 'auto_pic', + true => 'pic', + false => 'no_pic', + }; for (final buildMode in BuildMode.values) { final suffix = testSuffix([buildMode, picTag]); @@ -37,8 +38,9 @@ void main() { test('CBuilder executable$suffix', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final helloWorldCUri = packageUri - .resolve('test/cbuilder/testfiles/hello_world/src/hello_world.c'); + final helloWorldCUri = packageUri.resolve( + 'test/cbuilder/testfiles/hello_world/src/hello_world.c', + ); if (!await File.fromUri(helloWorldCUri).exists()) { throw Exception('Run the test from the root directory.'); } @@ -47,27 +49,25 @@ void main() { final logMessages = []; final logger = createCapturingLogger(logMessages); - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -84,8 +84,9 @@ void main() { logger: logger, ); - final executableUri = - tempUri.resolve(OS.current.executableFileName(name)); + final executableUri = tempUri.resolve( + OS.current.executableFileName(name), + ); expect(await File.fromUri(executableUri).exists(), true); final result = await runProcess( executable: executableUri, @@ -123,25 +124,24 @@ void main() { test('CBuilder dylib$suffix', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final addCUri = - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); + final addCUri = packageUri.resolve( + 'test/cbuilder/testfiles/add/src/add.c', + ); const name = 'add'; final logMessages = []; final logger = createCapturingLogger(logMessages); - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: dryRun, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: dryRun); if (buildCodeAssets) { buildInputBuilder.config.setupShared( buildAssetTypes: [CodeAsset.type], @@ -178,8 +178,10 @@ void main() { ); if (!dryRun && buildCodeAssets) { final dylib = openDynamicLibraryForTest(dylibUri.toFilePath()); - final add = dylib.lookupFunction('add'); + final add = dylib.lookupFunction< + Int32 Function(Int32, Int32), + int Function(int, int) + >('add'); expect(add(1, 2), 3); final compilerInvocation = logMessages.singleWhere( @@ -230,8 +232,9 @@ void main() { test('CBuilder flags', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final definesCUri = - packageUri.resolve('test/cbuilder/testfiles/defines/src/defines.c'); + final definesCUri = packageUri.resolve( + 'test/cbuilder/testfiles/defines/src/defines.c', + ); if (!await File.fromUri(definesCUri).exists()) { throw Exception('Run the test from the root directory.'); } @@ -240,27 +243,25 @@ void main() { final logMessages = []; final logger = createCapturingLogger(logMessages); - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -275,18 +276,11 @@ void main() { flags: [flag], buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final executableUri = tempUri.resolve(OS.current.executableFileName(name)); expect(await File.fromUri(executableUri).exists(), true); - final result = await runProcess( - executable: executableUri, - logger: logger, - ); + final result = await runProcess(executable: executableUri, logger: logger); expect(result.exitCode, 0); expect(result.stdout, contains('Macro FOO is defined: USER_FLAG')); @@ -299,35 +293,36 @@ void main() { test('CBuilder includes', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final includeDirectoryUri = - packageUri.resolve('test/cbuilder/testfiles/includes/include'); - final includesHUri = packageUri - .resolve('test/cbuilder/testfiles/includes/include/includes.h'); - final includesCUri = - packageUri.resolve('test/cbuilder/testfiles/includes/src/includes.c'); + final includeDirectoryUri = packageUri.resolve( + 'test/cbuilder/testfiles/includes/include', + ); + final includesHUri = packageUri.resolve( + 'test/cbuilder/testfiles/includes/include/includes.h', + ); + final includesCUri = packageUri.resolve( + 'test/cbuilder/testfiles/includes/src/includes.c', + ); const name = 'includes'; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutputBuilder = BuildOutputBuilder(); @@ -365,27 +360,25 @@ void main() { final logger = createCapturingLogger(logMessages); final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -402,17 +395,15 @@ void main() { std: std, buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final dylibUri = tempUri.resolve(OS.current.dylibFileName(name)); final dylib = openDynamicLibraryForTest(dylibUri.toFilePath()); - final add = dylib.lookupFunction('add'); + final add = dylib + .lookupFunction( + 'add', + ); expect(add(1, 2), 3); final compilerInvocation = logMessages.singleWhere( @@ -425,7 +416,8 @@ void main() { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); final helloWorldCppUri = packageUri.resolve( - 'test/cbuilder/testfiles/hello_world_cpp/src/hello_world_cpp.cc'); + 'test/cbuilder/testfiles/hello_world_cpp/src/hello_world_cpp.cc', + ); if (!await File.fromUri(helloWorldCppUri).exists()) { throw Exception('Run the test from the root directory.'); } @@ -435,27 +427,25 @@ void main() { final logger = createCapturingLogger(logMessages); final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -472,18 +462,11 @@ void main() { language: Language.cpp, buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final executableUri = tempUri.resolve(OS.current.executableFileName(name)); expect(await File.fromUri(executableUri).exists(), true); - final result = await runProcess( - executable: executableUri, - logger: logger, - ); + final result = await runProcess(executable: executableUri, logger: logger); expect(result.exitCode, 0); expect(result.stdout.trim(), endsWith('Hello world.')); @@ -499,7 +482,8 @@ void main() { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); final helloWorldCppUri = packageUri.resolve( - 'test/cbuilder/testfiles/hello_world_cpp/src/hello_world_cpp.cc'); + 'test/cbuilder/testfiles/hello_world_cpp/src/hello_world_cpp.cc', + ); if (!await File.fromUri(helloWorldCppUri).exists()) { throw Exception('Run the test from the root directory.'); } @@ -509,27 +493,25 @@ void main() { final logger = createCapturingLogger(logMessages); final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -557,8 +539,9 @@ void main() { logger: logger, ); - final executableUri = - tempUri.resolve(OS.current.executableFileName(name)); + final executableUri = tempUri.resolve( + OS.current.executableFileName(name), + ); expect(await File.fromUri(executableUri).exists(), true); final result = await runProcess( executable: executableUri, @@ -578,10 +561,12 @@ void main() { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final dynamicallyLinkedSrcUri = - packageUri.resolve('test/cbuilder/testfiles/dynamically_linked/src/'); - final dynamicallyLinkedCUri = - dynamicallyLinkedSrcUri.resolve('dynamically_linked.c'); + final dynamicallyLinkedSrcUri = packageUri.resolve( + 'test/cbuilder/testfiles/dynamically_linked/src/', + ); + final dynamicallyLinkedCUri = dynamicallyLinkedSrcUri.resolve( + 'dynamically_linked.c', + ); final debugCUri = dynamicallyLinkedSrcUri.resolve('debug.c'); final mathCUri = dynamicallyLinkedSrcUri.resolve('math.c'); @@ -594,27 +579,25 @@ void main() { final logger = createCapturingLogger(logMessages); final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: macOSConfig, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: macOSConfig, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -632,8 +615,9 @@ void main() { logger: logger, ); - final debugLibraryFile = - File.fromUri(tempUri.resolve(OS.current.dylibFileName('debug'))); + final debugLibraryFile = File.fromUri( + tempUri.resolve(OS.current.dylibFileName('debug')), + ); final nestedDebugLibraryFile = File.fromUri( tempUri.resolve('debug/').resolve(OS.current.dylibFileName('debug')), ); @@ -672,10 +656,7 @@ void main() { final executableUri = tempUri.resolve(OS.current.executableFileName(name)); expect(await File.fromUri(executableUri).exists(), true); - final result = await runProcess( - executable: executableUri, - logger: logger, - ); + final result = await runProcess(executable: executableUri, logger: logger); expect(result.exitCode, 0); }); } @@ -688,37 +669,37 @@ Future testDefines({ }) async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final definesCUri = - packageUri.resolve('test/cbuilder/testfiles/defines/src/defines.c'); + final definesCUri = packageUri.resolve( + 'test/cbuilder/testfiles/defines/src/defines.c', + ); if (!await File.fromUri(definesCUri).exists()) { throw Exception('Run the test from the root directory.'); } const name = 'defines'; final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: targetOS == OS.macOS - ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) - : null, - targetArchitecture: Architecture.current, - // Ignored by executables. - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: + targetOS == OS.macOS + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) + : null, + targetArchitecture: Architecture.current, + // Ignored by executables. + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -734,18 +715,11 @@ Future testDefines({ ndebugDefine: ndebugDefine, buildMode: buildMode, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final executableUri = tempUri.resolve(OS.current.executableFileName(name)); expect(await File.fromUri(executableUri).exists(), true); - final result = await runProcess( - executable: executableUri, - logger: logger, - ); + final result = await runProcess(executable: executableUri, logger: logger); expect(result.exitCode, 0); if (buildModeDefine) { @@ -761,28 +735,17 @@ Future testDefines({ } if (ndebugDefine && buildMode != BuildMode.debug) { - expect( - result.stdout, - contains('Macro NDEBUG is defined: 1'), - ); + expect(result.stdout, contains('Macro NDEBUG is defined: 1')); } else { - expect( - result.stdout, - contains('Macro NDEBUG is undefined.'), - ); + expect(result.stdout, contains('Macro NDEBUG is undefined.')); } if (customDefineWithValue != null) { expect( result.stdout, - contains( - 'Macro FOO is defined: ${customDefineWithValue ? 'BAR' : '1'}', - ), + contains('Macro FOO is defined: ${customDefineWithValue ? 'BAR' : '1'}'), ); } else { - expect( - result.stdout, - contains('Macro FOO is undefined.'), - ); + expect(result.stdout, contains('Macro FOO is undefined.')); } } diff --git a/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart b/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart index 899e7c0c4f..7635746fb3 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart @@ -2,10 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -@OnPlatform({ - 'mac-os': Timeout.factor(2), - 'windows': Timeout.factor(10), -}) +@OnPlatform({'mac-os': Timeout.factor(2), 'windows': Timeout.factor(10)}) library; import 'package:collection/collection.dart'; @@ -22,63 +19,69 @@ void main() { test('Input provided compiler', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final ar = [ - ...await appleAr.defaultResolver!.resolve(logger: logger), - ...await msvc.lib.defaultResolver!.resolve(logger: logger), - ...await llvmAr.defaultResolver!.resolve(logger: logger), - ].first.uri; - final cc = [ - ...await appleClang.defaultResolver!.resolve(logger: logger), - ...await msvc.cl.defaultResolver!.resolve(logger: logger), - ...await clang.defaultResolver!.resolve(logger: logger), - ].first.uri; - final ld = [ - ...await appleLd.defaultResolver!.resolve(logger: logger), - ...await msvc.msvcLink.defaultResolver!.resolve(logger: logger), - ...await lld.defaultResolver!.resolve(logger: logger), - ].first.uri; - final envScript = [ - ...await msvc.vcvars64.defaultResolver!.resolve(logger: logger) - ].firstOrNull?.uri; + final ar = + [ + ...await appleAr.defaultResolver!.resolve(logger: logger), + ...await msvc.lib.defaultResolver!.resolve(logger: logger), + ...await llvmAr.defaultResolver!.resolve(logger: logger), + ].first.uri; + final cc = + [ + ...await appleClang.defaultResolver!.resolve(logger: logger), + ...await msvc.cl.defaultResolver!.resolve(logger: logger), + ...await clang.defaultResolver!.resolve(logger: logger), + ].first.uri; + final ld = + [ + ...await appleLd.defaultResolver!.resolve(logger: logger), + ...await msvc.msvcLink.defaultResolver!.resolve(logger: logger), + ...await lld.defaultResolver!.resolve(logger: logger), + ].first.uri; + final envScript = + [ + ...await msvc.vcvars64.defaultResolver!.resolve(logger: logger), + ].firstOrNull?.uri; final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: 'dummy', - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: targetOS == OS.macOS - ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) - : null, - targetArchitecture: Architecture.current, - linkModePreference: LinkModePreference.dynamic, - cCompiler: CCompilerConfig( - archiver: ar, - compiler: cc, - linker: ld, - windows: targetOS == OS.windows - ? WindowsCCompilerConfig( - developerCommandPrompt: DeveloperCommandPrompt( - script: envScript!, - arguments: [], - ), - ) - : null, - ), - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: 'dummy', + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: + targetOS == OS.macOS + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) + : null, + targetArchitecture: Architecture.current, + linkModePreference: LinkModePreference.dynamic, + cCompiler: CCompilerConfig( + archiver: ar, + compiler: cc, + linker: ld, + windows: + targetOS == OS.windows + ? WindowsCCompilerConfig( + developerCommandPrompt: DeveloperCommandPrompt( + script: envScript!, + arguments: [], + ), + ) + : null, + ), + ); final buildInput = BuildInput(buildInputBuilder.json); - final resolver = - CompilerResolver(codeConfig: buildInput.config.code, logger: logger); + final resolver = CompilerResolver( + codeConfig: buildInput.config.code, + logger: logger, + ); final compiler = await resolver.resolveCompiler(); final archiver = await resolver.resolveArchiver(); expect(compiler.uri, buildInput.config.code.cCompiler?.compiler); @@ -94,25 +97,23 @@ void main() { test('No compiler found', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: 'dummy', - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectoryShared: tempUri2, - outputDirectory: tempUri, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: OS.windows, - targetArchitecture: Architecture.arm64, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: 'dummy', + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectoryShared: tempUri2, + outputDirectory: tempUri, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: OS.windows, + targetArchitecture: Architecture.arm64, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); diff --git a/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart b/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart index 9b35af6d66..0f091fb942 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart @@ -2,10 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -@OnPlatform({ - 'mac-os': Timeout.factor(2), - 'windows': Timeout.factor(10), -}) +@OnPlatform({'mac-os': Timeout.factor(2), 'windows': Timeout.factor(10)}) library; import 'dart:ffi'; @@ -25,8 +22,9 @@ void main() { test('CBuilder compile objective c', () async { final tempUri = await tempDirForTest(); final tempUri2 = await tempDirForTest(); - final addMUri = - packageUri.resolve('test/cbuilder/testfiles/add_objective_c/src/add.m'); + final addMUri = packageUri.resolve( + 'test/cbuilder/testfiles/add_objective_c/src/add.m', + ); if (!await File.fromUri(addMUri).exists()) { throw Exception('Run the test from the root directory.'); } @@ -36,28 +34,27 @@ void main() { final logger = createCapturingLogger(logMessages); final targetOS = OS.current; - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: targetOS, - macOS: targetOS == OS.macOS - ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) - : null, - targetArchitecture: Architecture.current, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: targetOS, + macOS: + targetOS == OS.macOS + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) + : null, + targetArchitecture: Architecture.current, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -69,17 +66,15 @@ void main() { language: Language.objectiveC, buildMode: BuildMode.release, ); - await cbuilder.run( - input: buildInput, - output: buildOutput, - logger: logger, - ); + await cbuilder.run(input: buildInput, output: buildOutput, logger: logger); final dylibUri = tempUri.resolve(OS.current.dylibFileName(name)); expect(await File.fromUri(dylibUri).exists(), true); final dylib = openDynamicLibraryForTest(dylibUri.toFilePath()); - final add = dylib.lookupFunction('add'); + final add = dylib + .lookupFunction( + 'add', + ); expect(add(1, 2), 3); }); } diff --git a/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart b/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart index e0c97a9035..d52a53cee9 100644 --- a/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart +++ b/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart @@ -26,25 +26,23 @@ Future buildTestArchive( final logger = createCapturingLogger(logMessages); assert(os == OS.linux); // Setup code input for other OSes. - final buildInputBuilder = BuildInputBuilder() - ..setupShared( - packageName: name, - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..config.setupBuild( - linkingEnabled: false, - dryRun: false, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: os, - targetArchitecture: architecture, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final buildInputBuilder = + BuildInputBuilder() + ..setupShared( + packageName: name, + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..config.setupBuild(linkingEnabled: false, dryRun: false) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: os, + targetArchitecture: architecture, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutputBuilder = BuildOutputBuilder(); diff --git a/pkgs/native_toolchain_c/test/clinker/objects_test.dart b/pkgs/native_toolchain_c/test/clinker/objects_test.dart index 3d2ae2041a..d5ebe189f4 100644 --- a/pkgs/native_toolchain_c/test/clinker/objects_test.dart +++ b/pkgs/native_toolchain_c/test/clinker/objects_test.dart @@ -31,25 +31,23 @@ Future main() async { final uri = await buildTestArchive(tempUri, tempUri2, os, architecture); - final linkInputBuilder = LinkInputBuilder() - ..setupShared( - packageName: 'testpackage', - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..setupLink( - assets: [], - recordedUsesFile: null, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: os, - targetArchitecture: architecture, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); + final linkInputBuilder = + LinkInputBuilder() + ..setupShared( + packageName: 'testpackage', + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..setupLink(assets: [], recordedUsesFile: null) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: os, + targetArchitecture: architecture, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); final linkInput = LinkInput(linkInputBuilder.json); final linkOutput = LinkOutputBuilder(); @@ -61,22 +59,12 @@ Future main() async { assetName: '', linkerOptions: LinkerOptions.manual(gcSections: false), sources: [uri.toFilePath()], - ).run( - input: linkInput, - output: linkOutput, - logger: logger, - ); + ).run(input: linkInput, output: linkOutput, logger: logger); final codeAssets = LinkOutput(linkOutput.json).assets.code; expect(codeAssets, hasLength(1)); final asset = codeAssets.first; expect(asset, isA()); - await expectSymbols( - asset: asset, - symbols: [ - 'my_func', - 'my_other_func', - ], - ); + await expectSymbols(asset: asset, symbols: ['my_func', 'my_other_func']); }); } diff --git a/pkgs/native_toolchain_c/test/clinker/throws_test.dart b/pkgs/native_toolchain_c/test/clinker/throws_test.dart index 557472da40..79c47842b6 100644 --- a/pkgs/native_toolchain_c/test/clinker/throws_test.dart +++ b/pkgs/native_toolchain_c/test/clinker/throws_test.dart @@ -16,47 +16,42 @@ Future main() async { continue; } - test( - 'throws on some platforms', - () async { - final tempUri = await tempDirForTest(); - final tempUri2 = await tempDirForTest(); - - final linkInputBuilder = LinkInputBuilder() - ..setupShared( - packageName: 'testpackage', - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectoryShared: tempUri2, - outputDirectory: tempUri, - ) - ..setupLink( - assets: [], - recordedUsesFile: null, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: os, - targetArchitecture: Architecture.x64, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, - ); - - final linkHookInput = LinkInput(linkInputBuilder.json); - - final cLinker = CLinker.library( - name: 'mylibname', - linkerOptions: LinkerOptions.manual(), - ); - await expectLater( - () => cLinker.run( - input: linkHookInput, - output: LinkOutputBuilder(), - logger: logger, - ), - throwsUnsupportedError, - ); - }, - ); + test('throws on some platforms', () async { + final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); + + final linkInputBuilder = + LinkInputBuilder() + ..setupShared( + packageName: 'testpackage', + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectoryShared: tempUri2, + outputDirectory: tempUri, + ) + ..setupLink(assets: [], recordedUsesFile: null) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: os, + targetArchitecture: Architecture.x64, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); + + final linkHookInput = LinkInput(linkInputBuilder.json); + + final cLinker = CLinker.library( + name: 'mylibname', + linkerOptions: LinkerOptions.manual(), + ); + await expectLater( + () => cLinker.run( + input: linkHookInput, + output: LinkOutputBuilder(), + logger: logger, + ), + throwsUnsupportedError, + ); + }); } } diff --git a/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart b/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart index 476a3aefe8..6bdeaecc5a 100644 --- a/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart +++ b/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart @@ -17,28 +17,29 @@ import 'build_testfiles.dart'; Future runTests(List architectures) async { CLinker linkerManual(List sources) => CLinker.library( - name: 'mylibname', - assetName: '', - sources: sources, - linkerOptions: LinkerOptions.manual( - flags: ['--strip-debug', '-u', 'my_other_func'], - gcSections: true, - linkerScript: - packageUri.resolve('test/clinker/testfiles/linker/symbols.lds'), - ), - ); + name: 'mylibname', + assetName: '', + sources: sources, + linkerOptions: LinkerOptions.manual( + flags: ['--strip-debug', '-u', 'my_other_func'], + gcSections: true, + linkerScript: packageUri.resolve( + 'test/clinker/testfiles/linker/symbols.lds', + ), + ), + ); CLinker linkerAuto(List sources) => CLinker.library( - name: 'mylibname', - assetName: '', - sources: sources, - linkerOptions: LinkerOptions.treeshake(symbols: ['my_other_func']), - ); + name: 'mylibname', + assetName: '', + sources: sources, + linkerOptions: LinkerOptions.treeshake(symbols: ['my_other_func']), + ); CLinker linkerAutoEmpty(List sources) => CLinker.library( - name: 'mylibname', - assetName: '', - sources: sources, - linkerOptions: LinkerOptions.treeshake(symbols: null), - ); + name: 'mylibname', + assetName: '', + sources: sources, + linkerOptions: LinkerOptions.treeshake(symbols: null), + ); const os = OS.linux; @@ -50,82 +51,78 @@ Future runTests(List architectures) async { (name: 'auto', linker: linkerAuto), (name: 'autoEmpty', linker: linkerAutoEmpty), ]) { - test('link test with CLinker ${clinker.name} and target $architecture', - () async { - final tempUri = await tempDirForTest(); - final tempUri2 = await tempDirForTest(); - final testArchive = await buildTestArchive( - tempUri, - tempUri2, - os, - architecture, - ); - - final linkInputBuilder = LinkInputBuilder() - ..setupShared( - packageName: 'testpackage', - packageRoot: tempUri, - outputFile: tempUri.resolve('output.json'), - outputDirectory: tempUri, - outputDirectoryShared: tempUri2, - ) - ..setupLink( - assets: [], - recordedUsesFile: null, - ) - ..config.setupShared(buildAssetTypes: [CodeAsset.type]) - ..config.setupCode( - targetOS: os, - targetArchitecture: architecture, - linkModePreference: LinkModePreference.dynamic, - cCompiler: cCompiler, + test( + 'link test with CLinker ${clinker.name} and target $architecture', + () async { + final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); + final testArchive = await buildTestArchive( + tempUri, + tempUri2, + os, + architecture, ); - final linkInput = LinkInput(linkInputBuilder.json); - final linkOutputBuilder = LinkOutputBuilder(); + final linkInputBuilder = + LinkInputBuilder() + ..setupShared( + packageName: 'testpackage', + packageRoot: tempUri, + outputFile: tempUri.resolve('output.json'), + outputDirectory: tempUri, + outputDirectoryShared: tempUri2, + ) + ..setupLink(assets: [], recordedUsesFile: null) + ..config.setupShared(buildAssetTypes: [CodeAsset.type]) + ..config.setupCode( + targetOS: os, + targetArchitecture: architecture, + linkModePreference: LinkModePreference.dynamic, + cCompiler: cCompiler, + ); - printOnFailure(linkInput.config.code.cCompiler.toString()); - printOnFailure(Platform.environment.keys.toList().toString()); - await clinker.linker([testArchive.toFilePath()]).run( - input: linkInput, - output: linkOutputBuilder, - logger: logger, - ); + final linkInput = LinkInput(linkInputBuilder.json); + final linkOutputBuilder = LinkOutputBuilder(); - final linkOutput = LinkOutput(linkOutputBuilder.json); - final asset = linkOutput.assets.code.first; - final filePath = asset.file!.toFilePath(); + printOnFailure(linkInput.config.code.cCompiler.toString()); + printOnFailure(Platform.environment.keys.toList().toString()); + await clinker + .linker([testArchive.toFilePath()]) + .run(input: linkInput, output: linkOutputBuilder, logger: logger); - final machine = await readelfMachine(filePath); - expect(machine, contains(readElfMachine[architecture])); + final linkOutput = LinkOutput(linkOutputBuilder.json); + final asset = linkOutput.assets.code.first; + final filePath = asset.file!.toFilePath(); - final symbols = await nmReadSymbols(asset); - if (clinker.linker != linkerAutoEmpty) { - expect(symbols, contains('my_other_func')); - expect(symbols, isNot(contains('my_func'))); - } else { - expect(symbols, contains('my_other_func')); - expect(symbols, contains('my_func')); - } + final machine = await readelfMachine(filePath); + expect(machine, contains(readElfMachine[architecture])); - final du = Process.runSync('du', ['-sb', filePath]).stdout as String; - final sizeInBytes = int.parse(du.split('\t')[0]); - sizes[clinker.name] = sizeInBytes; - }); + final symbols = await nmReadSymbols(asset); + if (clinker.linker != linkerAutoEmpty) { + expect(symbols, contains('my_other_func')); + expect(symbols, isNot(contains('my_func'))); + } else { + expect(symbols, contains('my_other_func')); + expect(symbols, contains('my_func')); + } + + final du = Process.runSync('du', ['-sb', filePath]).stdout as String; + final sizeInBytes = int.parse(du.split('\t')[0]); + sizes[clinker.name] = sizeInBytes; + }, + ); } - tearDownAll( - () { - expect( - sizes['manual'], - lessThan(sizes['autoEmpty']!), - reason: 'Tree-shaking reduces size', - ); - expect( - sizes['auto'], - lessThan(sizes['autoEmpty']!), - reason: 'Tree-shaking reduces size', - ); - }, - ); + tearDownAll(() { + expect( + sizes['manual'], + lessThan(sizes['autoEmpty']!), + reason: 'Tree-shaking reduces size', + ); + expect( + sizes['auto'], + lessThan(sizes['autoEmpty']!), + reason: 'Tree-shaking reduces size', + ); + }); } } diff --git a/pkgs/native_toolchain_c/test/clinker/treeshake_test.dart b/pkgs/native_toolchain_c/test/clinker/treeshake_test.dart index 9ac7a3957c..be651e4883 100644 --- a/pkgs/native_toolchain_c/test/clinker/treeshake_test.dart +++ b/pkgs/native_toolchain_c/test/clinker/treeshake_test.dart @@ -20,7 +20,5 @@ Future main() async { return; } - await runTests([ - Architecture.current, - ]); + await runTests([Architecture.current]); } diff --git a/pkgs/native_toolchain_c/test/helpers.dart b/pkgs/native_toolchain_c/test/helpers.dart index 3955741d59..36dcc4485c 100644 --- a/pkgs/native_toolchain_c/test/helpers.dart +++ b/pkgs/native_toolchain_c/test/helpers.dart @@ -36,9 +36,9 @@ export 'package:native_assets_cli/code_assets_builder.dart'; /// } /// ``` String testSuffix(List tags) => switch (tags) { - [] => '', - _ => ' (${tags.join(', ')})', - }; + [] => '', + _ => ' (${tags.join(', ')})', +}; const keepTempKey = 'KEEP_TEMPORARY_DIRECTORIES'; @@ -58,7 +58,8 @@ Future tempDirForTest({String? prefix, bool keepTemp = false}) async { } /// Logger that outputs the full trace when a test fails. -Logger get logger => _logger ??= () { +Logger get logger => + _logger ??= () { // A new logger is lazily created for each test so that the messages // captured by printOnFailure are scoped to the correct test. addTearDown(() => _logger = null); @@ -75,7 +76,8 @@ Logger _createTestLogger({List? capturedMessages}) => ..level = Level.ALL ..onRecord.listen((record) { printOnFailure( - '${record.level.name}: ${record.time}: ${record.message}'); + '${record.level.name}: ${record.time}: ${record.message}', + ); capturedMessages?.add(record.message); }); @@ -110,10 +112,12 @@ Uri findPackageRoot(String packageName) { return cwd; } } - throw StateError("Could not find package root for package '$packageName'. " - 'Tried finding the package root via Platform.script ' - "'${Platform.script.toFilePath()}' and Directory.current " - "'${Directory.current.uri.toFilePath()}'."); + throw StateError( + "Could not find package root for package '$packageName'. " + 'Tried finding the package root via Platform.script ' + "'${Platform.script.toFilePath()}' and Directory.current " + "'${Directory.current.uri.toFilePath()}'.", + ); } Uri packageUri = findPackageRoot('native_toolchain_c'); @@ -143,9 +147,9 @@ final Uri? _ld = /// Path to script that sets environment variables for [_cc], [_ld], and [_ar]. /// /// Provided on Dart CI. -final Uri? _envScript = Platform - .environment['DART_HOOK_TESTING_C_COMPILER__ENV_SCRIPT'] - ?.asFileUri(); +final Uri? _envScript = + Platform.environment['DART_HOOK_TESTING_C_COMPILER__ENV_SCRIPT'] + ?.asFileUri(); /// Arguments for [_envScript] provided by environment. /// @@ -157,21 +161,23 @@ final List? _envScriptArgs = Platform /// Configuration for the native toolchain. /// /// Provided on Dart CI. -final cCompiler = (_cc == null || _ar == null || _ld == null) - ? null - : CCompilerConfig( - compiler: _cc!, - archiver: _ar!, - linker: _ld!, - windows: WindowsCCompilerConfig( - developerCommandPrompt: _envScript == null - ? null - : DeveloperCommandPrompt( - script: _envScript!, - arguments: _envScriptArgs ?? [], - ), - ), - ); +final cCompiler = + (_cc == null || _ar == null || _ld == null) + ? null + : CCompilerConfig( + compiler: _cc!, + archiver: _ar!, + linker: _ld!, + windows: WindowsCCompilerConfig( + developerCommandPrompt: + _envScript == null + ? null + : DeveloperCommandPrompt( + script: _envScript!, + arguments: _envScriptArgs ?? [], + ), + ), + ); extension on String { Uri asFileUri() => Uri.file(this); @@ -191,11 +197,14 @@ Future runOtoolInstallName(Uri libraryUri, String libraryName) async { expect(otoolResult.exitCode, 0); // Leading space on purpose to differentiate from other types of names. const installNameName = ' name '; - final installName = otoolResult.stdout - .split('\n') - .firstWhere((e) => e.contains(installNameName) && e.contains(libraryName)) - .trim() - .split(' ')[1]; + final installName = + otoolResult.stdout + .split('\n') + .firstWhere( + (e) => e.contains(installNameName) && e.contains(libraryName), + ) + .trim() + .split(' ')[1]; return installName; } @@ -239,10 +248,7 @@ Future nmReadSymbols(CodeAsset asset) async { final assetUri = asset.file!; final result = await runProcess( executable: Uri(path: 'nm'), - arguments: [ - '-D', - assetUri.toFilePath(), - ], + arguments: ['-D', assetUri.toFilePath()], logger: logger, ); @@ -257,10 +263,7 @@ Future expectSymbols({ if (Platform.isLinux) { final nmOutput = await nmReadSymbols(asset); - expect( - nmOutput, - stringContainsInOrder(symbols), - ); + expect(nmOutput, stringContainsInOrder(symbols)); } else { throw UnimplementedError(); } @@ -276,8 +279,9 @@ Future textSectionAddress(Uri dylib) async { logger: logger, ); expect(result.exitCode, 0); - final textSection = - result.stdout.split('\n').firstWhere((e) => e.contains('.text')); + final textSection = result.stdout + .split('\n') + .firstWhere((e) => e.contains('.text')); final parsed = textSection.split(' ').where((e) => e.isNotEmpty).toList(); expect(parsed[1], '.text'); expect(parsed[4], 'TEXT'); @@ -288,8 +292,9 @@ Future textSectionAddress(Uri dylib) async { // Find the line in the readelf output that looks like: // [11] .text PROGBITS 00004328 000328 000064 00 AX 0 0 4 final result = await readelf(dylib.toFilePath(), 'S'); - final textSection = - result.split('\n').firstWhere((e) => e.contains('.text')); + final textSection = result + .split('\n') + .firstWhere((e) => e.contains('.text')); final parsed = textSection.split(' ').where((e) => e.isNotEmpty).toList(); expect(parsed[1], '.text'); expect(parsed[2], 'PROGBITS'); @@ -299,10 +304,7 @@ Future textSectionAddress(Uri dylib) async { throw UnimplementedError(); } -Future expectPageSize( - Uri dylib, - int pageSize, -) async { +Future expectPageSize(Uri dylib, int pageSize) async { if (Platform.isMacOS || Platform.isLinux) { // If page size is 16kb, the `.text` section address should be // above 0x4000. With smaller page sizes it's above 0x1000. diff --git a/pkgs/native_toolchain_c/test/native_toolchain/apple_clang_test.dart b/pkgs/native_toolchain_c/test/native_toolchain/apple_clang_test.dart index 14829cb82e..65aa0789a9 100644 --- a/pkgs/native_toolchain_c/test/native_toolchain/apple_clang_test.dart +++ b/pkgs/native_toolchain_c/test/native_toolchain/apple_clang_test.dart @@ -3,9 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('mac-os') -@OnPlatform({ - 'mac-os': Timeout.factor(2), -}) +@OnPlatform({'mac-os': Timeout.factor(2)}) library; import 'dart:io'; @@ -24,8 +22,10 @@ void main() { } test('smoke test', () async { - final requirement = ToolRequirement(appleClang, - minimumVersion: Version(12, 0, 0, pre: '0')); + final requirement = ToolRequirement( + appleClang, + minimumVersion: Version(12, 0, 0, pre: '0'), + ); final resolved = await appleClang.defaultResolver!.resolve(logger: logger); expect(resolved.isNotEmpty, true); final satisfied = requirement.satisfy(resolved); diff --git a/pkgs/native_toolchain_c/test/native_toolchain/clang_test.dart b/pkgs/native_toolchain_c/test/native_toolchain/clang_test.dart index cfe499cccb..9048eec571 100644 --- a/pkgs/native_toolchain_c/test/native_toolchain/clang_test.dart +++ b/pkgs/native_toolchain_c/test/native_toolchain/clang_test.dart @@ -18,16 +18,19 @@ import '../helpers.dart'; void main() { if (Platform.isMacOS || (Platform.isWindows && - Platform.environment['DART_HOOK_TESTING_C_COMPILER__CC'] - ?.endsWith('cl.exe') == + Platform.environment['DART_HOOK_TESTING_C_COMPILER__CC']?.endsWith( + 'cl.exe', + ) == true)) { // Avoid needing status files on Dart SDK CI. return; } test('clang smoke test', () async { - final requirement = - ToolRequirement(clang, minimumVersion: Version(14, 0, 0, pre: '0')); + final requirement = ToolRequirement( + clang, + minimumVersion: Version(14, 0, 0, pre: '0'), + ); final resolved = await clang.defaultResolver!.resolve(logger: logger); expect(resolved.isNotEmpty, true); final satisfied = requirement.satisfy(resolved); @@ -40,8 +43,10 @@ void main() { uri: Uri.file('some/path'), version: Version.parse('14.0.0-1'), ); - final requirement = - ToolRequirement(clang, minimumVersion: Version(14, 0, 0, pre: '0')); + final requirement = ToolRequirement( + clang, + minimumVersion: Version(14, 0, 0, pre: '0'), + ); final satisfied = requirement.satisfy([clangInstance]); expect(satisfied?.length, 1); }); diff --git a/pkgs/native_toolchain_c/test/native_toolchain/msvc_test.dart b/pkgs/native_toolchain_c/test/native_toolchain/msvc_test.dart index 60dbe3c104..751fb588c6 100644 --- a/pkgs/native_toolchain_c/test/native_toolchain/msvc_test.dart +++ b/pkgs/native_toolchain_c/test/native_toolchain/msvc_test.dart @@ -3,9 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('windows') -@OnPlatform({ - 'windows': Timeout.factor(10), -}) +@OnPlatform({'windows': Timeout.factor(10)}) library; import 'dart:io'; @@ -28,8 +26,9 @@ void main() { }); test('visualStudio', () async { - final instances = - await visualStudio.defaultResolver!.resolve(logger: logger); + final instances = await visualStudio.defaultResolver!.resolve( + logger: logger, + ); expect(instances.isNotEmpty, true); }); @@ -92,9 +91,9 @@ void main() { final clInstances = await clIA32.defaultResolver!.resolve(logger: logger); expect(clInstances.isNotEmpty, true); - final instances = await vcvars(clInstances.first) - .defaultResolver! - .resolve(logger: logger); + final instances = await vcvars( + clInstances.first, + ).defaultResolver!.resolve(logger: logger); expect(instances.isNotEmpty, true); final instance = instances.first; expect(instance.tool, vcvars32); @@ -107,9 +106,9 @@ void main() { final clInstances = await cl.defaultResolver!.resolve(logger: logger); expect(clInstances.isNotEmpty, true); - final instances = await vcvars(clInstances.first) - .defaultResolver! - .resolve(logger: logger); + final instances = await vcvars( + clInstances.first, + ).defaultResolver!.resolve(logger: logger); expect(instances.isNotEmpty, true); final instance = instances.first; expect(instance.tool, vcvars64); @@ -122,9 +121,9 @@ void main() { final clInstances = await clArm64.defaultResolver!.resolve(logger: logger); expect(clInstances.isNotEmpty, true); - final instances = await vcvars(clInstances.first) - .defaultResolver! - .resolve(logger: logger); + final instances = await vcvars( + clInstances.first, + ).defaultResolver!.resolve(logger: logger); expect(instances.isNotEmpty, true); final instance = instances.first; expect(instance.tool, vcvarsarm64); @@ -152,8 +151,9 @@ void main() { }); test('vcvarsarm64', () async { - final instances = - await vcvarsarm64.defaultResolver!.resolve(logger: logger); + final instances = await vcvarsarm64.defaultResolver!.resolve( + logger: logger, + ); expect(instances.isNotEmpty, true); final instance = instances.first; final env = await environmentFromBatchFile(instance.uri); @@ -167,11 +167,7 @@ void main() { final instance = instances.first; final env = await environmentFromBatchFile( instance.uri, - arguments: [ - 'x64', - 'uwp', - '10.0', - ], + arguments: ['x64', 'uwp', '10.0'], ); expect(env['INCLUDE'] != null, true); expect(env['WindowsSdkDir'] != null, true); // stdio.h diff --git a/pkgs/native_toolchain_c/test/native_toolchain/recognizer_test.dart b/pkgs/native_toolchain_c/test/native_toolchain/recognizer_test.dart index c8b96fa578..fc81267e75 100644 --- a/pkgs/native_toolchain_c/test/native_toolchain/recognizer_test.dart +++ b/pkgs/native_toolchain_c/test/native_toolchain/recognizer_test.dart @@ -85,11 +85,10 @@ class RecognizerTest { RecognizerTest(this.tool, this.recognizer); Future setUp() async { - toolInstance = (await tool.defaultResolver!.resolve( - logger: null /* no printOnFailure support in setup. */, - )) - .where((element) => element.tool == tool) - .firstOrNull; + toolInstance = + (await tool.defaultResolver!.resolve( + logger: null /* no printOnFailure support in setup. */, + )).where((element) => element.tool == tool).firstOrNull; } void addTest() { @@ -100,14 +99,11 @@ class RecognizerTest { return; } - test( - 'recognize ${tool.name}', - () async { - final recognizer_ = recognizer(toolInstance!.uri); - final toolInstanceAgain = - (await recognizer_.resolve(logger: logger)).first; - expect(toolInstanceAgain, toolInstance); - }, - ); + test('recognize ${tool.name}', () async { + final recognizer_ = recognizer(toolInstance!.uri); + final toolInstanceAgain = + (await recognizer_.resolve(logger: logger)).first; + expect(toolInstanceAgain, toolInstance); + }); } } diff --git a/pkgs/native_toolchain_c/test/native_toolchain/xcode_test.dart b/pkgs/native_toolchain_c/test/native_toolchain/xcode_test.dart index 208851bfbb..155784dfa9 100644 --- a/pkgs/native_toolchain_c/test/native_toolchain/xcode_test.dart +++ b/pkgs/native_toolchain_c/test/native_toolchain/xcode_test.dart @@ -3,9 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('mac-os') -@OnPlatform({ - 'mac-os': Timeout.factor(2), -}) +@OnPlatform({'mac-os': Timeout.factor(2)}) library; import 'dart:io'; @@ -24,28 +22,30 @@ void main() { } test('xcrun', () async { - final resolved = (await xcrun.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == xcrun); + final resolved = (await xcrun.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == xcrun); expect(resolved.isNotEmpty, true); }); test('macosxSdk', () async { - final resolved = (await macosxSdk.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == macosxSdk); + final resolved = (await macosxSdk.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == macosxSdk); expect(resolved.isNotEmpty, true); }); test('iPhoneOSSdk', () async { - final resolved = - (await iPhoneOSSdk.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == iPhoneOSSdk); + final resolved = (await iPhoneOSSdk.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == iPhoneOSSdk); expect(resolved.isNotEmpty, true); }); test('iPhoneSimulatorSdk', () async { - final resolved = - (await iPhoneSimulatorSdk.defaultResolver!.resolve(logger: logger)) - .where((i) => i.tool == iPhoneSimulatorSdk); + final resolved = (await iPhoneSimulatorSdk.defaultResolver!.resolve( + logger: logger, + )).where((i) => i.tool == iPhoneSimulatorSdk); expect(resolved.isNotEmpty, true); }); diff --git a/pkgs/native_toolchain_c/test/tool/tool_instance_test.dart b/pkgs/native_toolchain_c/test/tool/tool_instance_test.dart index b4a873b227..259e3edde6 100644 --- a/pkgs/native_toolchain_c/test/tool/tool_instance_test.dart +++ b/pkgs/native_toolchain_c/test/tool/tool_instance_test.dart @@ -10,10 +10,14 @@ import 'package:test/test.dart'; void main() { test('equals and hashCode', () { - final barToolInstance = - ToolInstance(tool: Tool(name: 'bar'), uri: Uri.file('path/to/bar')); - final fooToolInstance = - ToolInstance(tool: Tool(name: 'foo'), uri: Uri.file('path/to/foo')); + final barToolInstance = ToolInstance( + tool: Tool(name: 'bar'), + uri: Uri.file('path/to/bar'), + ); + final fooToolInstance = ToolInstance( + tool: Tool(name: 'foo'), + uri: Uri.file('path/to/foo'), + ); expect(barToolInstance, barToolInstance); expect(barToolInstance != fooToolInstance, true); @@ -22,15 +26,18 @@ void main() { expect(barToolInstance.hashCode != fooToolInstance.hashCode, true); expect( - ToolInstance( - tool: Tool(name: 'bar'), - version: Version(1, 0, 0), - uri: Uri.file('path/to/bar')) != - ToolInstance( - tool: Tool(name: 'bar'), - version: Version(1, 0, 1), - uri: Uri.file('path/to/bar')), - true); + ToolInstance( + tool: Tool(name: 'bar'), + version: Version(1, 0, 0), + uri: Uri.file('path/to/bar'), + ) != + ToolInstance( + tool: Tool(name: 'bar'), + version: Version(1, 0, 1), + uri: Uri.file('path/to/bar'), + ), + true, + ); }); test('compareTo', () { @@ -40,22 +47,17 @@ void main() { version: Version(2, 0, 0), uri: Uri.file('path/to/bar'), ), - ToolInstance( - tool: Tool(name: 'bar'), - version: Version(1, 0, 0), - uri: Uri.file('path/to/bar')), ToolInstance( tool: Tool(name: 'bar'), + version: Version(1, 0, 0), uri: Uri.file('path/to/bar'), ), + ToolInstance(tool: Tool(name: 'bar'), uri: Uri.file('path/to/bar')), ToolInstance( tool: Tool(name: 'bar'), uri: Uri.file('path/to/some/other/bar'), ), - ToolInstance( - tool: Tool(name: 'baz'), - uri: Uri.file('path/to/baz'), - ), + ToolInstance(tool: Tool(name: 'baz'), uri: Uri.file('path/to/baz')), ]; final toolInstancesSorted = [...toolInstances]..sort(); diff --git a/pkgs/native_toolchain_c/test/tool/tool_requirement_test.dart b/pkgs/native_toolchain_c/test/tool/tool_requirement_test.dart index 9f802db04f..64d09245be 100644 --- a/pkgs/native_toolchain_c/test/tool/tool_requirement_test.dart +++ b/pkgs/native_toolchain_c/test/tool/tool_requirement_test.dart @@ -10,8 +10,10 @@ import 'package:test/test.dart'; void main() { test('toString', () { - final requirement = - ToolRequirement(Tool(name: 'clang'), minimumVersion: Version(10, 0, 0)); + final requirement = ToolRequirement( + Tool(name: 'clang'), + minimumVersion: Version(10, 0, 0), + ); expect(requirement.toString(), contains('clang')); expect(requirement.toString(), contains('10.0.0')); }); @@ -34,15 +36,12 @@ void main() { ), ]; final result = requirement.satisfy(toolInstances); - expect( - result, - [ - ToolInstance( - tool: Tool(name: 'bar'), - version: Version(10, 0, 0), - uri: Uri.file('path/to/bar'), - ) - ], - ); + expect(result, [ + ToolInstance( + tool: Tool(name: 'bar'), + version: Version(10, 0, 0), + uri: Uri.file('path/to/bar'), + ), + ]); }); } diff --git a/pkgs/native_toolchain_c/test/tool/tool_resolver_test.dart b/pkgs/native_toolchain_c/test/tool/tool_resolver_test.dart index 1bf295aec7..ed3c172722 100644 --- a/pkgs/native_toolchain_c/test/tool/tool_resolver_test.dart +++ b/pkgs/native_toolchain_c/test/tool/tool_resolver_test.dart @@ -24,9 +24,7 @@ void main() { ]; expect(toolInstances.isNotEmpty, true); final toolInstance = toolInstances.first; - final versionArguments = [ - if (toolInstance.tool != cl) '--version', - ]; + final versionArguments = [if (toolInstance.tool != cl) '--version']; final version = await CliVersionResolver.executableVersion( toolInstance.uri, arguments: versionArguments, @@ -75,15 +73,13 @@ void main() { relativePath: Uri.file(bazExeName), ); final resolvedBarInstances = await barResolver.resolve(logger: logger); - expect( - resolvedBarInstances, - [ToolInstance(tool: Tool(name: 'bar'), uri: barExeUri)], - ); + expect(resolvedBarInstances, [ + ToolInstance(tool: Tool(name: 'bar'), uri: barExeUri), + ]); final resolvedBazInstances = await bazResolver.resolve(logger: logger); - expect( - resolvedBazInstances, - [ToolInstance(tool: Tool(name: 'baz'), uri: bazExeUri)], - ); + expect(resolvedBazInstances, [ + ToolInstance(tool: Tool(name: 'baz'), uri: bazExeUri), + ]); }); test('logger', () async { @@ -93,9 +89,13 @@ void main() { final bazExeUri = tempUri.resolve(bazExeName); await File.fromUri(barExeUri).writeAsString('dummy'); final barResolver = InstallLocationResolver( - toolName: 'bar', paths: [barExeUri.toFilePath().unescape()]); + toolName: 'bar', + paths: [barExeUri.toFilePath().unescape()], + ); final bazResolver = InstallLocationResolver( - toolName: 'baz', paths: [bazExeUri.toFilePath().unescape()]); + toolName: 'baz', + paths: [bazExeUri.toFilePath().unescape()], + ); final barLogs = []; final bazLogs = []; await barResolver.resolve(logger: createCapturingLogger(barLogs)); diff --git a/pkgs/native_toolchain_c/test/tool/tool_test.dart b/pkgs/native_toolchain_c/test/tool/tool_test.dart index c14aff9030..208831e174 100644 --- a/pkgs/native_toolchain_c/test/tool/tool_test.dart +++ b/pkgs/native_toolchain_c/test/tool/tool_test.dart @@ -19,8 +19,10 @@ void main() { expect(Tool(name: 'foo') != Tool(name: 'bar'), true); expect( Tool(name: 'foo').hashCode, - Tool(name: 'foo', defaultResolver: PathToolResolver(toolName: 'foo')) - .hashCode, + Tool( + name: 'foo', + defaultResolver: PathToolResolver(toolName: 'foo'), + ).hashCode, ); expect(Tool(name: 'foo').hashCode != Tool(name: 'bar').hashCode, true); });