diff --git a/pkgs/native_assets_builder/test/build_runner/build_runner_reusability_test.dart b/pkgs/native_assets_builder/test/build_runner/build_runner_reusability_test.dart index ac4c86cbd..1fbcab75f 100644 --- a/pkgs/native_assets_builder/test/build_runner/build_runner_reusability_test.dart +++ b/pkgs/native_assets_builder/test/build_runner/build_runner_reusability_test.dart @@ -37,7 +37,7 @@ void main() async { targetArchitecture: Architecture.current, targetOS: OS.current, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, linkModePreference: LinkModePreference.dynamic, ); diff --git a/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart b/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart index 791b104fa..9bc9762c3 100644 --- a/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart +++ b/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart @@ -31,10 +31,10 @@ void main(List args) async { targetArchitecture: target.architecture, targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, android: - targetOS == OS.android ? AndroidConfig(targetNdkApi: 30) : null, + targetOS == OS.android ? AndroidCodeConfig(targetNdkApi: 30) : null, linkModePreference: LinkModePreference.dynamic, ), diff --git a/pkgs/native_assets_builder/test/build_runner/concurrency_test_helper.dart b/pkgs/native_assets_builder/test/build_runner/concurrency_test_helper.dart index f250e9f51..663617b39 100644 --- a/pkgs/native_assets_builder/test/build_runner/concurrency_test_helper.dart +++ b/pkgs/native_assets_builder/test/build_runner/concurrency_test_helper.dart @@ -36,7 +36,7 @@ void main(List args) async { linkModePreference: LinkModePreference.dynamic, cCompiler: dartCICompilerConfig, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, ), workingDirectory: packageUri, diff --git a/pkgs/native_assets_builder/test/build_runner/helpers.dart b/pkgs/native_assets_builder/test/build_runner/helpers.dart index 644f3a6a5..ad044d4d5 100644 --- a/pkgs/native_assets_builder/test/build_runner/helpers.dart +++ b/pkgs/native_assets_builder/test/build_runner/helpers.dart @@ -86,17 +86,17 @@ Future build( linkModePreference: linkModePreference, cCompiler: cCompiler ?? dartCICompilerConfig, iOS: targetOS == OS.iOS - ? IOSConfig( + ? IOSCodeConfig( targetSdk: targetIOSSdk!, targetVersion: targetIOSVersion!, ) : null, macOS: targetOS == OS.macOS - ? MacOSConfig( + ? MacOSCodeConfig( targetVersion: targetMacOSVersion ?? defaultMacOSVersion) : null, android: targetOS == OS.android - ? AndroidConfig(targetNdkApi: targetAndroidNdkApi!) + ? AndroidCodeConfig(targetNdkApi: targetAndroidNdkApi!) : null, ); } @@ -163,17 +163,17 @@ Future link( linkModePreference: linkModePreference, cCompiler: cCompiler ?? dartCICompilerConfig, iOS: targetOS == OS.iOS - ? IOSConfig( + ? IOSCodeConfig( targetSdk: targetIOSSdk!, targetVersion: targetIOSVersion!, ) : null, macOS: targetOS == OS.macOS - ? MacOSConfig( + ? MacOSCodeConfig( targetVersion: targetMacOSVersion ?? defaultMacOSVersion) : null, android: targetOS == OS.android - ? AndroidConfig(targetNdkApi: targetAndroidNdkApi!) + ? AndroidCodeConfig(targetNdkApi: targetAndroidNdkApi!) : null, ); } @@ -239,17 +239,17 @@ Future<(BuildResult?, LinkResult?)> buildAndLink( linkModePreference: linkModePreference, cCompiler: cCompiler ?? dartCICompilerConfig, iOS: targetOS == OS.iOS - ? IOSConfig( + ? IOSCodeConfig( targetSdk: targetIOSSdk!, targetVersion: targetIOSVersion!, ) : null, macOS: targetOS == OS.macOS - ? MacOSConfig( + ? MacOSCodeConfig( targetVersion: targetMacOSVersion ?? defaultMacOSVersion) : null, android: targetOS == OS.android - ? AndroidConfig(targetNdkApi: targetAndroidNdkApi!) + ? AndroidCodeConfig(targetNdkApi: targetAndroidNdkApi!) : null, ); } @@ -285,17 +285,17 @@ Future<(BuildResult?, LinkResult?)> buildAndLink( linkModePreference: linkModePreference, cCompiler: cCompiler ?? dartCICompilerConfig, iOS: targetOS == OS.iOS - ? IOSConfig( + ? IOSCodeConfig( targetSdk: targetIOSSdk!, targetVersion: targetIOSVersion!, ) : null, macOS: targetOS == OS.macOS - ? MacOSConfig( + ? MacOSCodeConfig( targetVersion: targetMacOSVersion ?? defaultMacOSVersion) : null, android: targetOS == OS.android - ? AndroidConfig(targetNdkApi: targetAndroidNdkApi!) + ? AndroidCodeConfig(targetNdkApi: targetAndroidNdkApi!) : null, ); } @@ -374,15 +374,19 @@ final CCompilerConfig? dartCICompilerConfig = (() { .map((arg) => arg.trim()) .where((arg) => arg.isNotEmpty) .toList(); - final hasEnvScriptArgs = envScriptArgs != null && envScriptArgs.isNotEmpty; if (cc != null && ar != null && ld != null) { return CCompilerConfig( archiver: Uri.file(ar), compiler: Uri.file(cc), - envScript: envScript != null ? Uri.file(envScript) : null, - envScriptArgs: hasEnvScriptArgs ? envScriptArgs : null, linker: Uri.file(ld), + windows: WindowsCCompilerConfig( + developerCommandPrompt: envScript == null + ? null + : DeveloperCommandPrompt( + script: Uri.file(envScript), + arguments: envScriptArgs ?? [], + )), ); } return null; diff --git a/pkgs/native_assets_builder/test/helpers.dart b/pkgs/native_assets_builder/test/helpers.dart index 76f0056bc..8f782cb5c 100644 --- a/pkgs/native_assets_builder/test/helpers.dart +++ b/pkgs/native_assets_builder/test/helpers.dart @@ -190,8 +190,14 @@ final cCompiler = (_cc == null || _ar == null || _ld == null) compiler: _cc!, archiver: _ar!, linker: _ld!, - envScript: _envScript, - envScriptArgs: _envScriptArgs, + windows: _envScript == null + ? null + : WindowsCCompilerConfig( + developerCommandPrompt: DeveloperCommandPrompt( + script: _envScript!, + arguments: _envScriptArgs ?? [], + ), + ), ); extension on String { diff --git a/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart b/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart index 4a91440df..6af3d1763 100644 --- a/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart +++ b/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart @@ -46,7 +46,7 @@ void main() async { targetArchitecture: Architecture.current, targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, linkModePreference: LinkModePreference.dynamic, cCompiler: cCompiler, diff --git a/pkgs/native_assets_builder/test/test_data/transformer_test.dart b/pkgs/native_assets_builder/test/test_data/transformer_test.dart index 65c1d86bc..ebcefee29 100644 --- a/pkgs/native_assets_builder/test/test_data/transformer_test.dart +++ b/pkgs/native_assets_builder/test/test_data/transformer_test.dart @@ -64,7 +64,7 @@ void main() async { targetArchitecture: architecture, targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, linkModePreference: LinkModePreference.dynamic, ); diff --git a/pkgs/native_assets_builder/test_data/wrong_build_output_3/hook/build.dart b/pkgs/native_assets_builder/test_data/wrong_build_output_3/hook/build.dart index 43f55e604..08fa13480 100644 --- a/pkgs/native_assets_builder/test_data/wrong_build_output_3/hook/build.dart +++ b/pkgs/native_assets_builder/test_data/wrong_build_output_3/hook/build.dart @@ -21,5 +21,5 @@ const _rightContents = '''{ "encodedAssets": [], "dependencies": [], "metadata": {}, - "version": "1.8.0" + "version": "1.9.0" }'''; diff --git a/pkgs/native_assets_cli/example/build/download_asset/tool/build.dart b/pkgs/native_assets_cli/example/build/download_asset/tool/build.dart index 1278e968d..dafc0c06b 100644 --- a/pkgs/native_assets_cli/example/build/download_asset/tool/build.dart +++ b/pkgs/native_assets_cli/example/build/download_asset/tool/build.dart @@ -91,15 +91,15 @@ BuildInput createBuildInput( linkModePreference: LinkModePreference.dynamic, android: os != OS.android ? null - : AndroidConfig( + : AndroidCodeConfig( targetNdkApi: androidTargetNdkApi, ), iOS: os != OS.iOS ? null - : IOSConfig( + : IOSCodeConfig( targetSdk: IOSSdk.fromString(iOSSdk!), targetVersion: iOSTargetVersion, ), - macOS: MacOSConfig(targetVersion: macOSTargetVersion)); + macOS: MacOSCodeConfig(targetVersion: macOSTargetVersion)); return BuildInput(inputBuilder.json); } diff --git a/pkgs/native_assets_cli/lib/code_assets.dart b/pkgs/native_assets_cli/lib/code_assets.dart index c2558a2ad..d1d9c8ff8 100644 --- a/pkgs/native_assets_cli/lib/code_assets.dart +++ b/pkgs/native_assets_cli/lib/code_assets.dart @@ -11,11 +11,12 @@ export 'native_assets_cli.dart' EncodedAssetBuildOutputBuilder, EncodedAssetLinkOutputBuilder; export 'src/code_assets/architecture.dart' show Architecture; -export 'src/code_assets/c_compiler_config.dart' show CCompilerConfig; +export 'src/code_assets/c_compiler_config.dart' + show CCompilerConfig, DeveloperCommandPrompt, WindowsCCompilerConfig; export 'src/code_assets/code_asset.dart' show CodeAsset, OSLibraryNaming; export 'src/code_assets/config.dart' show - AndroidConfig, + AndroidCodeConfig, CodeAssetBuildOutputBuilder, CodeAssetBuildOutputBuilderAdd, CodeAssetHookConfig, @@ -23,8 +24,8 @@ export 'src/code_assets/config.dart' CodeAssetLinkOutputBuilder, CodeAssetLinkOutputBuilderAdd, CodeConfig, - IOSConfig, - MacOSConfig; + IOSCodeConfig, + MacOSCodeConfig; export 'src/code_assets/ios_sdk.dart' show IOSSdk; export 'src/code_assets/link_mode.dart' show diff --git a/pkgs/native_assets_cli/lib/src/code_assets/c_compiler_config.dart b/pkgs/native_assets_cli/lib/src/code_assets/c_compiler_config.dart index 32384f282..3d36e8d6e 100644 --- a/pkgs/native_assets_cli/lib/src/code_assets/c_compiler_config.dart +++ b/pkgs/native_assets_cli/lib/src/code_assets/c_compiler_config.dart @@ -4,59 +4,98 @@ import 'package:collection/collection.dart'; +import '../../code_assets.dart'; import '../json_utils.dart'; import '../utils/map.dart'; /// The configuration for a C toolchain. final class CCompilerConfig { /// Path to a C compiler. - late final Uri compiler; + final Uri compiler; /// Path to a native linker. - late final Uri linker; + final Uri linker; /// Path to a native archiver. - late final Uri archiver; + final Uri archiver; - /// Path to script that sets environment variables for [compiler], [linker], - /// and [archiver]. - late final Uri? envScript; + final WindowsCCompilerConfig? _windows; - /// Arguments for [envScript]. - late final List? envScriptArgs; + /// Configuration provided when [CodeConfig.targetOS] is [OS.windows]. + WindowsCCompilerConfig get windows => switch (_windows) { + null => throw StateError( + 'Cannot access windows if CodeConfig.targetOS is not Windows'), + final c => c, + }; /// Constructs a new [CCompilerConfig] based on the given toolchain tools. CCompilerConfig({ required this.archiver, required this.compiler, required this.linker, - this.envScript, - this.envScriptArgs, - }); + WindowsCCompilerConfig? windows, + }) : _windows = windows; /// Constructs a [CCompilerConfig] from the given [json]. /// /// The json is expected to be valid encoding obtained via /// [CCompilerConfig.toJson]. - factory CCompilerConfig.fromJson(Map json) => - CCompilerConfig( - archiver: json.path(_arConfigKey), - compiler: json.path(_ccConfigKey), - envScript: json.optionalPath(_envScriptConfigKey), - envScriptArgs: json.optionalStringList(_envScriptArgsConfigKey), - linker: json.path(_ldConfigKey), + factory CCompilerConfig.fromJson(Map json) { + WindowsCCompilerConfig? winConfig; + if (json[_windowsConfigKey] != null) { + final dcpJson = json + .map$(_windowsConfigKey) + .optionalMap(_developerCommandPromptConfigKey); + winConfig = WindowsCCompilerConfig( + developerCommandPrompt: dcpJson == null + ? null + : DeveloperCommandPrompt( + script: dcpJson.path(_scriptConfigKey), + arguments: dcpJson.stringList(_argumentsConfigKey), + ), + ); + } else if (json[_envScriptConfigKeyDeprecated] != null) { + winConfig = WindowsCCompilerConfig( + developerCommandPrompt: DeveloperCommandPrompt( + script: json.path(_envScriptConfigKeyDeprecated), + arguments: json.stringList(_envScriptArgsConfigKeyDeprecated), + ), ); + } + return CCompilerConfig( + archiver: json.path(_arConfigKey), + compiler: json.path(_ccConfigKey), + linker: json.path(_ldConfigKey), + windows: winConfig, + ); + } /// The json representation of this [CCompilerConfig]. /// /// The returned json can be used in [CCompilerConfig.fromJson] to /// obtain a [CCompilerConfig] again. - Map toJson() => { + /// + /// If [deprecatedTopLevel], does not nest developerCommandPrompt. + // TODO: Remove deprecatedTopLevel once protocol 1.8.0 is no longer supported. + Map toJson({bool deprecatedTopLevel = false}) => { _arConfigKey: archiver.toFilePath(), _ccConfigKey: compiler.toFilePath(), _ldConfigKey: linker.toFilePath(), - if (envScript != null) _envScriptConfigKey: envScript!.toFilePath(), - if (envScriptArgs != null) _envScriptArgsConfigKey: envScriptArgs!, + if (_windows?.developerCommandPrompt?.script != null) + _envScriptConfigKeyDeprecated: + _windows!.developerCommandPrompt!.script.toFilePath(), + if (_windows?.developerCommandPrompt?.arguments != null) + _envScriptArgsConfigKeyDeprecated: + _windows!.developerCommandPrompt!.arguments, + if (_windows != null && !deprecatedTopLevel) + _windowsConfigKey: { + if (_windows.developerCommandPrompt != null) + _developerCommandPromptConfigKey: { + _argumentsConfigKey: _windows.developerCommandPrompt!.arguments, + _scriptConfigKey: + _windows.developerCommandPrompt!.script.toFilePath(), + } + } }.sortOnKey(); @override @@ -67,9 +106,13 @@ final class CCompilerConfig { if (other.archiver != archiver) return false; if (other.compiler != compiler) return false; if (other.linker != linker) return false; - if (other.envScript != envScript) return false; - if (!const ListEquality() - .equals(other.envScriptArgs, envScriptArgs)) { + if (other._windows?.developerCommandPrompt?.script != + _windows?.developerCommandPrompt?.script) { + return false; + } + if (!const ListEquality().equals( + other._windows?.developerCommandPrompt?.arguments, + _windows?.developerCommandPrompt?.arguments)) { return false; } return true; @@ -80,13 +123,61 @@ final class CCompilerConfig { archiver, compiler, linker, - envScript, - const ListEquality().hash(envScriptArgs), + _windows?.developerCommandPrompt?.script, + const ListEquality() + .hash(_windows?.developerCommandPrompt?.arguments), ); } const _arConfigKey = 'ar'; const _ccConfigKey = 'cc'; const _ldConfigKey = 'ld'; -const _envScriptConfigKey = 'env_script'; -const _envScriptArgsConfigKey = 'env_script_arguments'; +const _envScriptConfigKeyDeprecated = 'env_script'; +const _envScriptArgsConfigKeyDeprecated = 'env_script_arguments'; +const _windowsConfigKey = 'windows'; +const _developerCommandPromptConfigKey = 'developer_command_prompt'; +const _scriptConfigKey = 'script'; +const _argumentsConfigKey = 'arguments'; + +/// Configuration provided when [CodeConfig.targetOS] is [OS.windows]. +final class WindowsCCompilerConfig { + final DeveloperCommandPrompt? developerCommandPrompt; + + WindowsCCompilerConfig({ + this.developerCommandPrompt, + }); +} + +/// The Windows Developer Command Prompt. +/// +/// Sets up the environment variables for [CCompilerConfig.compiler], +/// [CCompilerConfig.linker], and [CCompilerConfig.archiver] on Windows. +/// +/// Specific to [CodeConfig.targetArchitecture]. +final class DeveloperCommandPrompt { + /// The path to the batch script that sets up the environment variables. + /// + /// Must be invoked with [arguments]. + /// + /// This path is typically something such as: + /// - `C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat` + /// - `C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\vsdevcmd\ext\vcvars.bat` + /// - `C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat` + /// - `C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsamd64_x86.bat` + /// + /// Typically run with `%comspec% /k` on Windows to have a terminal with the + /// right environment variables for subsequent commands. + final Uri script; + + /// Arguments to invoke [script] with. + /// + /// This is empty if [script] already contains [CodeConfig.targetArchitecture] + /// in its name, and contains the [CodeConfig.targetArchitecture] if the + /// script name does not. + final List arguments; + + DeveloperCommandPrompt({ + required this.script, + required this.arguments, + }); +} diff --git a/pkgs/native_assets_cli/lib/src/code_assets/config.dart b/pkgs/native_assets_cli/lib/src/code_assets/config.dart index 998ddd132..832a9e982 100644 --- a/pkgs/native_assets_cli/lib/src/code_assets/config.dart +++ b/pkgs/native_assets_cli/lib/src/code_assets/config.dart @@ -48,9 +48,9 @@ class CodeConfig { /// The operating system being compiled for. final OS targetOS; - final IOSConfig? _iOSConfig; - final AndroidConfig? _androidConfig; - final MacOSConfig? _macOSConfig; + final IOSCodeConfig? _iOSConfig; + final AndroidCodeConfig? _androidConfig; + final MacOSCodeConfig? _macOSConfig; // Should not be made public, class will be replaced as a view on `json`. CodeConfig._({ @@ -58,9 +58,9 @@ class CodeConfig { required this.targetOS, required this.linkModePreference, CCompilerConfig? cCompilerConfig, - AndroidConfig? androidConfig, - IOSConfig? iOSConfig, - MacOSConfig? macOSConfig, + AndroidCodeConfig? androidConfig, + IOSCodeConfig? iOSConfig, + MacOSCodeConfig? macOSConfig, }) : _targetArchitecture = targetArchitecture, cCompiler = cCompilerConfig, _iOSConfig = iOSConfig, @@ -91,11 +91,12 @@ class CodeConfig { }; final iOSConfig = - dryRun || targetOS != OS.iOS ? null : IOSConfig.fromJson(json); - final androidConfig = - dryRun || targetOS != OS.android ? null : AndroidConfig.fromJson(json); + dryRun || targetOS != OS.iOS ? null : IOSCodeConfig.fromJson(json); + final androidConfig = dryRun || targetOS != OS.android + ? null + : AndroidCodeConfig.fromJson(json); final macOSConfig = - dryRun || targetOS != OS.macOS ? null : MacOSConfig.fromJson(json); + dryRun || targetOS != OS.macOS ? null : MacOSCodeConfig.fromJson(json); return CodeConfig._( targetArchitecture: targetArchitecture, @@ -125,7 +126,7 @@ class CodeConfig { } /// Configuration provided when [CodeConfig.targetOS] is [OS.macOS]. - IOSConfig get iOS => switch (_iOSConfig) { + IOSCodeConfig get iOS => switch (_iOSConfig) { null => throw StateError('Cannot access iOSConfig if targetOS is not iOS' ' or in dry runs.'), @@ -133,7 +134,7 @@ class CodeConfig { }; /// Configuration provided when [CodeConfig.targetOS] is [OS.android]. - AndroidConfig get android => switch (_androidConfig) { + AndroidCodeConfig get android => switch (_androidConfig) { null => throw StateError( 'Cannot access androidConfig if targetOS is not android' ' or in dry runs.'), @@ -141,7 +142,7 @@ class CodeConfig { }; /// Configuration provided when [CodeConfig.targetOS] is [OS.macOS]. - MacOSConfig get macOS => switch (_macOSConfig) { + MacOSCodeConfig get macOS => switch (_macOSConfig) { null => throw StateError('Cannot access macOSConfig if targetOS is not MacOS' ' or in dry runs.'), @@ -150,7 +151,7 @@ class CodeConfig { } /// Configuration provided when [CodeConfig.targetOS] is [OS.iOS]. -class IOSConfig { +class IOSCodeConfig { /// Whether to target device or simulator. IOSSdk get targetSdk => _targetSdk!; @@ -161,13 +162,13 @@ class IOSConfig { final int? _targetVersion; - IOSConfig({ + IOSCodeConfig({ required IOSSdk targetSdk, required int targetVersion, }) : _targetSdk = targetSdk, _targetVersion = targetVersion; - IOSConfig.fromJson(Map json) + IOSCodeConfig.fromJson(Map json) : _targetVersion = json.code?.optionalMap(_iosKey)?.optionalInt(_targetVersionKey) ?? json.optionalInt(_targetIOSVersionKeyDeprecated), @@ -179,52 +180,52 @@ class IOSConfig { }; } -extension IOSConfigSyntactic on IOSConfig { +extension IOSConfigSyntactic on IOSCodeConfig { IOSSdk? get targetSdkSyntactic => _targetSdk; int? get targetVersionSyntactic => _targetVersion; } /// Configuration provided when [CodeConfig.targetOS] is [OS.macOS]. -class AndroidConfig { +class AndroidCodeConfig { /// The minimum Android SDK API version to that the compiled code will be /// compatible with. int get targetNdkApi => _targetNdkApi!; final int? _targetNdkApi; - AndroidConfig({ + AndroidCodeConfig({ required int targetNdkApi, }) : _targetNdkApi = targetNdkApi; - AndroidConfig.fromJson(Map json) + AndroidCodeConfig.fromJson(Map json) : _targetNdkApi = json.code ?.optionalMap(_androidKey) ?.optionalInt(_targetNdkApiKey) ?? json.optionalInt(_targetAndroidNdkApiKeyDeprecated); } -extension AndroidConfigSyntactic on AndroidConfig { +extension AndroidConfigSyntactic on AndroidCodeConfig { int? get targetNdkApiSyntactic => _targetNdkApi; } //// Configuration provided when [CodeConfig.targetOS] is [OS.macOS]. -class MacOSConfig { +class MacOSCodeConfig { /// The lowest MacOS version that the compiled code will be compatible with. int get targetVersion => _targetVersion!; final int? _targetVersion; - MacOSConfig({ + MacOSCodeConfig({ required int targetVersion, }) : _targetVersion = targetVersion; - MacOSConfig.fromJson(Map json) + MacOSCodeConfig.fromJson(Map json) : _targetVersion = json.code?.optionalMap(_macosKey)?.optionalInt(_targetVersionKey) ?? json.optionalInt(_targetMacOSVersionKeyDeprecated); } -extension MacOSConfigSyntactic on MacOSConfig { +extension MacOSConfigSyntactic on MacOSCodeConfig { int? get targetVersionSyntactic => _targetVersion; } @@ -278,9 +279,9 @@ extension CodeAssetBuildInputBuilder on HookConfigBuilder { required OS targetOS, required LinkModePreference linkModePreference, CCompilerConfig? cCompiler, - AndroidConfig? android, - IOSConfig? iOS, - MacOSConfig? macOS, + AndroidCodeConfig? android, + IOSCodeConfig? iOS, + MacOSCodeConfig? macOS, }) { if (targetArchitecture != null) { json[_targetArchitectureKey] = targetArchitecture.toString(); @@ -294,7 +295,7 @@ extension CodeAssetBuildInputBuilder on HookConfigBuilder { json.setNested([_configKey, _codeKey, _linkModePreferenceKey], linkModePreference.toString()); if (cCompiler != null) { - json[_compilerKey] = cCompiler.toJson(); + json[_compilerKey] = cCompiler.toJson(deprecatedTopLevel: true); json.setNested([_configKey, _codeKey, _compilerKey], cCompiler.toJson()); } diff --git a/pkgs/native_assets_cli/lib/src/code_assets/testing.dart b/pkgs/native_assets_cli/lib/src/code_assets/testing.dart index af357e585..15abcacfa 100644 --- a/pkgs/native_assets_cli/lib/src/code_assets/testing.dart +++ b/pkgs/native_assets_cli/lib/src/code_assets/testing.dart @@ -44,16 +44,16 @@ Future testCodeBuildHook({ targetArchitecture: targetArchitecture ?? Architecture.current, targetOS: targetOS ?? OS.current, iOS: targetOS == OS.iOS - ? IOSConfig( + ? IOSCodeConfig( targetSdk: targetIOSSdk!, targetVersion: targetIOSVersion!, ) : null, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: targetMacOSVersion!) + ? MacOSCodeConfig(targetVersion: targetMacOSVersion!) : null, android: targetOS == OS.android - ? AndroidConfig(targetNdkApi: targetAndroidNdkApi!) + ? AndroidCodeConfig(targetNdkApi: targetAndroidNdkApi!) : null, ); }, diff --git a/pkgs/native_assets_cli/lib/src/code_assets/validation.dart b/pkgs/native_assets_cli/lib/src/code_assets/validation.dart index 7016e3799..3db8fb3f9 100644 --- a/pkgs/native_assets_cli/lib/src/code_assets/validation.dart +++ b/pkgs/native_assets_cli/lib/src/code_assets/validation.dart @@ -75,10 +75,15 @@ ValidationErrors _validateCodeConfig( errors.add('$inputName.config.code.archiver ($archiver) does' ' not exist.'); } - final envScript = compilerConfig.envScript?.toFilePath(); - if (envScript != null && !File(envScript).existsSync()) { - errors.add('$inputName.config.code.envScript ($envScript) does' - ' not exist.'); + if (codeConfig.targetOS == OS.windows && + compilerConfig.windows.developerCommandPrompt != null) { + final envScript = + compilerConfig.windows.developerCommandPrompt!.script.toFilePath(); + if (!File(envScript).existsSync()) { + errors + .add('$inputName.config.code.windows.developerCommandPrompt.script' + ' ($envScript) does not exist.'); + } } } return errors; diff --git a/pkgs/native_assets_cli/lib/src/config.dart b/pkgs/native_assets_cli/lib/src/config.dart index 250163b55..1c32e3298 100644 --- a/pkgs/native_assets_cli/lib/src/config.dart +++ b/pkgs/native_assets_cli/lib/src/config.dart @@ -594,7 +594,7 @@ extension type EncodedAssetLinkOutputBuilder._(LinkOutputBuilder _builder) { /// /// We'll never bump the major version. Removing old keys from the input and /// output is done via modifying [latestParsableVersion]. -final latestVersion = Version(1, 8, 0); +final latestVersion = Version(1, 9, 0); /// The parser can deal with inputs and outputs down to this version. /// diff --git a/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md b/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md index 2c7aa6efe..91fea0f1e 100644 --- a/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md +++ b/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.9.0 + +- `CCompilerConfig` now nests the Windows config under + `.windows.developerCommandPrompt`. + Compatibility with older hooks: Previous JSON structure is still emitted. + Compatibility with older SDKs: Still parse the old JSON. + ## 1.8.0 - Add `BuildInput.outputFile` to specify the outfile. This means the out file diff --git a/pkgs/native_assets_cli/test/build_output_test.dart b/pkgs/native_assets_cli/test/build_output_test.dart index aa9a5dad9..6641e1909 100644 --- a/pkgs/native_assets_cli/test/build_output_test.dart +++ b/pkgs/native_assets_cli/test/build_output_test.dart @@ -49,7 +49,7 @@ void main() { // The JSON format of the build output. { - 'version': '1.8.0', + 'version': '1.9.0', 'dependencies': ['path0', 'path1', 'path2'], 'metadata': { 'meta-a': 'meta-b', diff --git a/pkgs/native_assets_cli/test/checksum_test.dart b/pkgs/native_assets_cli/test/checksum_test.dart index 9d5b66ef9..6f4d90017 100644 --- a/pkgs/native_assets_cli/test/checksum_test.dart +++ b/pkgs/native_assets_cli/test/checksum_test.dart @@ -55,13 +55,13 @@ void main() { targetArchitecture: architecture, targetOS: os, android: os == OS.android - ? AndroidConfig(targetNdkApi: targetVersion) + ? AndroidCodeConfig(targetNdkApi: targetVersion) : null, macOS: os == OS.macOS - ? MacOSConfig(targetVersion: targetVersion) + ? MacOSCodeConfig(targetVersion: targetVersion) : null, iOS: os == OS.iOS - ? IOSConfig( + ? IOSCodeConfig( targetVersion: targetVersion, targetSdk: iOSSdk, ) diff --git a/pkgs/native_assets_cli/test/code_assets/config_test.dart b/pkgs/native_assets_cli/test/code_assets/config_test.dart index c75565d9a..26cd8ad13 100644 --- a/pkgs/native_assets_cli/test/code_assets/config_test.dart +++ b/pkgs/native_assets_cli/test/code_assets/config_test.dart @@ -93,8 +93,14 @@ void main() async { 'ar': fakeAr.toFilePath(), 'ld': fakeLd.toFilePath(), 'cc': fakeClang.toFilePath(), - 'env_script': fakeVcVars.toFilePath(), - 'env_script_arguments': ['arg0', 'arg1'], + if (includeDeprecated) 'env_script': fakeVcVars.toFilePath(), + if (includeDeprecated) 'env_script_arguments': ['arg0', 'arg1'], + 'windows': { + 'developer_command_prompt': { + 'arguments': ['arg0', 'arg1'], + 'script': fakeVcVars.toFilePath(), + }, + }, }, if (targetOS == OS.android) 'android': {'target_ndk_api': 30}, if (targetOS == OS.macOS) 'macos': {'target_version': 13}, @@ -126,7 +132,7 @@ void main() async { 'target_android_ndk_api': 30, if (includeDeprecated) 'target_architecture': 'arm64', if (includeDeprecated) 'target_os': targetOS.name, - 'version': '1.8.0', + 'version': '1.9.0', }; void expectCorrectCodeConfig( @@ -192,14 +198,18 @@ void main() async { ..config.setupCode( targetOS: OS.android, targetArchitecture: Architecture.arm64, - android: AndroidConfig(targetNdkApi: 30), + android: AndroidCodeConfig(targetNdkApi: 30), linkModePreference: LinkModePreference.preferStatic, cCompiler: CCompilerConfig( compiler: fakeClang, linker: fakeLd, archiver: fakeAr, - envScript: fakeVcVars, - envScriptArgs: ['arg0', 'arg1'], + windows: WindowsCCompilerConfig( + developerCommandPrompt: DeveloperCommandPrompt( + script: fakeVcVars, + arguments: ['arg0', 'arg1'], + ), + ), ), ); final input = BuildInput(inputBuilder.json); @@ -242,14 +252,18 @@ void main() async { ..config.setupCode( targetOS: OS.android, targetArchitecture: Architecture.arm64, - android: AndroidConfig(targetNdkApi: 30), + android: AndroidCodeConfig(targetNdkApi: 30), linkModePreference: LinkModePreference.preferStatic, cCompiler: CCompilerConfig( compiler: fakeClang, linker: fakeLd, archiver: fakeAr, - envScript: fakeVcVars, - envScriptArgs: ['arg0', 'arg1'], + windows: WindowsCCompilerConfig( + developerCommandPrompt: DeveloperCommandPrompt( + script: fakeVcVars, + arguments: ['arg0', 'arg1'], + ), + ), ), ); final input = LinkInput(inputBuilder.json); diff --git a/pkgs/native_assets_cli/test/code_assets/validation_test.dart b/pkgs/native_assets_cli/test/code_assets/validation_test.dart index f16c2b7c2..fcd72c747 100644 --- a/pkgs/native_assets_cli/test/code_assets/validation_test.dart +++ b/pkgs/native_assets_cli/test/code_assets/validation_test.dart @@ -266,14 +266,19 @@ void main() { final builder = makeBuildInputBuilder() ..config.setupShared(buildAssetTypes: [CodeAsset.type]) ..config.setupCode( - targetOS: OS.linux, - targetArchitecture: Architecture.arm64, + targetOS: OS.windows, + targetArchitecture: Architecture.x64, linkModePreference: LinkModePreference.dynamic, cCompiler: CCompilerConfig( compiler: nonExistent, linker: nonExistent, archiver: nonExistent, - envScript: nonExistent, + windows: WindowsCCompilerConfig( + developerCommandPrompt: DeveloperCommandPrompt( + script: nonExistent, + arguments: [], + ), + ), )); final errors = await validateCodeAssetBuildInput(BuildInput(builder.json)); @@ -286,7 +291,10 @@ void main() { expect(errors.any((e) => matches(e, 'compiler')), true); expect(errors.any((e) => matches(e, 'linker')), true); expect(errors.any((e) => matches(e, 'archiver')), true); - expect(errors.any((e) => matches(e, 'envScript')), true); + expect( + errors.any((e) => matches(e, 'windows.developerCommandPrompt.script')), + true, + ); }); }); } diff --git a/pkgs/native_assets_cli/test/example/local_asset_test.dart b/pkgs/native_assets_cli/test/example/local_asset_test.dart index 95be6b2e0..709fbf62a 100644 --- a/pkgs/native_assets_cli/test/example/local_asset_test.dart +++ b/pkgs/native_assets_cli/test/example/local_asset_test.dart @@ -55,7 +55,7 @@ void main() async { ..config.setupCode( targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, targetArchitecture: dryRun ? null : Architecture.current, linkModePreference: LinkModePreference.dynamic, diff --git a/pkgs/native_assets_cli/test/example/native_add_library_test.dart b/pkgs/native_assets_cli/test/example/native_add_library_test.dart index 5e61761d2..2edcc99df 100644 --- a/pkgs/native_assets_cli/test/example/native_add_library_test.dart +++ b/pkgs/native_assets_cli/test/example/native_add_library_test.dart @@ -55,7 +55,7 @@ void main() async { ..config.setupCode( targetOS: OS.current, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, targetArchitecture: dryRun ? null : Architecture.current, linkModePreference: LinkModePreference.dynamic, diff --git a/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart b/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart index 0165a113b..18b828610 100644 --- a/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart +++ b/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart @@ -59,7 +59,7 @@ void main() async { ..config.setupCode( targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, targetArchitecture: dryRun ? null : Architecture.current, linkModePreference: LinkModePreference.dynamic, diff --git a/pkgs/native_assets_cli/test/helpers.dart b/pkgs/native_assets_cli/test/helpers.dart index 371038af7..b9b7f64f5 100644 --- a/pkgs/native_assets_cli/test/helpers.dart +++ b/pkgs/native_assets_cli/test/helpers.dart @@ -121,8 +121,14 @@ final cCompiler = (_cc == null || _ar == null || _ld == null) compiler: _cc!, archiver: _ar!, linker: _ld!, - envScript: _envScript, - envScriptArgs: _envScriptArgs, + windows: WindowsCCompilerConfig( + developerCommandPrompt: _envScript == null + ? null + : DeveloperCommandPrompt( + script: _envScript!, + arguments: _envScriptArgs ?? [], + ), + ), ); extension on String { diff --git a/pkgs/native_assets_cli/test/link_output_test.dart b/pkgs/native_assets_cli/test/link_output_test.dart index de17f7b99..cbc74a377 100644 --- a/pkgs/native_assets_cli/test/link_output_test.dart +++ b/pkgs/native_assets_cli/test/link_output_test.dart @@ -35,7 +35,7 @@ void main() { // The JSON format of the link output. { - 'version': '1.8.0', + 'version': '1.9.0', 'dependencies': ['path0', 'path1', 'path2'], 'assets': [ {'a-0': 'v-0', 'type': 'my-asset-type'}, 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 d5ac54bca..f3e7c7f12 100644 --- a/pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart +++ b/pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart @@ -198,25 +198,27 @@ class CompilerResolver { } Future> resolveEnvironment(ToolInstance compiler) async { - final envScriptFromConfig = codeConfig.cCompiler?.envScript; - if (envScriptFromConfig != null) { + if (codeConfig.targetOS != OS.windows) { + return {}; + } + + final cCompilerConfig = codeConfig.cCompiler; + if (cCompilerConfig != null && + cCompilerConfig.windows.developerCommandPrompt != null) { + final envScriptFromConfig = + cCompilerConfig.windows.developerCommandPrompt!.script; + final vcvarsArgs = + cCompilerConfig.windows.developerCommandPrompt!.arguments; logger?.fine('Using envScript from input: $envScriptFromConfig'); - final vcvarsArgs = codeConfig.cCompiler?.envScriptArgs; - if (vcvarsArgs != null) { + if (vcvarsArgs.isNotEmpty) { logger?.fine('Using envScriptArgs from input: $vcvarsArgs'); } return await environmentFromBatchFile( envScriptFromConfig, - arguments: vcvarsArgs ?? [], + arguments: vcvarsArgs, ); } - if (codeConfig.cCompiler?.compiler != null) { - logger?.fine('Compiler provided without envScript,' - ' assuming environment is already set up.'); - return {}; - } - final compilerTool = compiler.tool; if (compilerTool != cl) { // If Clang is used on Windows, and we could discover the MSVC 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 0d2eda455..c49ae3ec0 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 @@ -46,7 +46,7 @@ void main() { ..config.setupCode( targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, targetArchitecture: Architecture.current, linkModePreference: LinkModePreference.dynamic, 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 df127d433..32649f42d 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 @@ -161,7 +161,7 @@ Future buildLib( targetOS: OS.android, targetArchitecture: targetArchitecture, cCompiler: cCompiler, - android: AndroidConfig(targetNdkApi: androidNdkApi), + android: AndroidCodeConfig(targetNdkApi: androidNdkApi), linkModePreference: linkMode == DynamicLoadingBundled() ? LinkModePreference.dynamic : LinkModePreference.static, 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 ffe717f93..2c95c0009 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 @@ -92,7 +92,7 @@ void main() { linkModePreference: linkMode == DynamicLoadingBundled() ? LinkModePreference.dynamic : LinkModePreference.static, - iOS: IOSConfig( + iOS: IOSCodeConfig( targetSdk: targetIOSSdk, targetVersion: flutteriOSHighestBestEffort, ), @@ -248,7 +248,7 @@ Future buildLib( linkModePreference: linkMode == DynamicLoadingBundled() ? LinkModePreference.dynamic : LinkModePreference.static, - iOS: IOSConfig( + iOS: IOSCodeConfig( targetSdk: IOSSdk.iPhoneOS, targetVersion: targetIOSVersion, ), 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 c4aa0426e..cd61c3bc2 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 @@ -77,7 +77,7 @@ void main() { ? LinkModePreference.dynamic : LinkModePreference.static, cCompiler: cCompiler, - macOS: MacOSConfig(targetVersion: defaultMacOSVersion), + macOS: MacOSCodeConfig(targetVersion: defaultMacOSVersion), ); final buildInput = BuildInput(buildInputBuilder.json); final buildOutput = BuildOutputBuilder(); @@ -177,7 +177,7 @@ Future buildLib( linkModePreference: linkMode == DynamicLoadingBundled() ? LinkModePreference.dynamic : LinkModePreference.static, - macOS: MacOSConfig(targetVersion: targetMacOSVersion), + macOS: MacOSCodeConfig(targetVersion: targetMacOSVersion), cCompiler: cCompiler, ); 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 01aeb6203..fd3bb1ef9 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 @@ -35,6 +35,7 @@ void main() async { (await clang.defaultResolver!.resolve(logger: logger)).first.uri, linker: (await lld.defaultResolver!.resolve(logger: logger)).first.uri, + windows: WindowsCCompilerConfig(), ) }; diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart index 410d4d993..65b1eb275 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart @@ -25,7 +25,7 @@ void main() { final targetOS = OS.current; final macOSConfig = targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null; for (final pic in [null, true, false]) { final picTag = @@ -712,7 +712,7 @@ Future testDefines({ ..config.setupCode( targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, targetArchitecture: Architecture.current, // Ignored by executables. 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 0de8fa018..899e7c0c4 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart @@ -42,47 +42,52 @@ void main() { ].firstOrNull?.uri; final targetOS = OS.current; - for (final passInEnvScript in [if (targetOS == OS.windows) true, false]) { - 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 - ? MacOSConfig(targetVersion: defaultMacOSVersion) + 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, - targetArchitecture: Architecture.current, - linkModePreference: LinkModePreference.dynamic, - cCompiler: CCompilerConfig( - archiver: ar, - compiler: cc, - linker: ld, - envScript: passInEnvScript ? envScript : null, - ), - ); - final buildInput = BuildInput(buildInputBuilder.json); - 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); - expect(archiver.uri, buildInput.config.code.cCompiler?.archiver); - final environment = await resolver.resolveEnvironment(compiler); - if (passInEnvScript) { - expect(environment, isNot(equals({}))); - } else { - expect(environment, equals({})); - } + ), + ); + final buildInput = BuildInput(buildInputBuilder.json); + 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); + expect(archiver.uri, buildInput.config.code.cCompiler?.archiver); + final environment = await resolver.resolveEnvironment(compiler); + if (targetOS == OS.windows) { + expect(environment, isNot(equals({}))); + } else { + expect(environment, equals({})); } }); 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 704bbc6d2..9b35af6d6 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart @@ -52,7 +52,7 @@ void main() { ..config.setupCode( targetOS: targetOS, macOS: targetOS == OS.macOS - ? MacOSConfig(targetVersion: defaultMacOSVersion) + ? MacOSCodeConfig(targetVersion: defaultMacOSVersion) : null, targetArchitecture: Architecture.current, linkModePreference: LinkModePreference.dynamic, diff --git a/pkgs/native_toolchain_c/test/helpers.dart b/pkgs/native_toolchain_c/test/helpers.dart index 5a04e4923..7599dbc06 100644 --- a/pkgs/native_toolchain_c/test/helpers.dart +++ b/pkgs/native_toolchain_c/test/helpers.dart @@ -161,8 +161,14 @@ final cCompiler = (_cc == null || _ar == null || _ld == null) compiler: _cc!, archiver: _ar!, linker: _ld!, - envScript: _envScript, - envScriptArgs: _envScriptArgs, + windows: WindowsCCompilerConfig( + developerCommandPrompt: _envScript == null + ? null + : DeveloperCommandPrompt( + script: _envScript!, + arguments: _envScriptArgs ?? [], + ), + ), ); extension on String {