| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // 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. |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| |
| import 'package:args/args.dart'; |
| import 'package:ffigen/ffigen.dart'; |
| import 'package:logging/logging.dart'; |
| import 'package:yaml/yaml.dart'; |
| |
| const usage = r'''Regenerates the Dart FFI bindings used in tests and examples. |
| |
| Use this command when developing features that change the generated bindings |
| e.g. with this command: |
| |
| $ dart run test/setup.dart && dart run test/regen.dart && dart test |
| '''; |
| |
| Future<void> _regenConfig(File yamlConfig, File bindingOutput, |
| {bool chDir = false}) async { |
| yamlConfig = yamlConfig.absolute; |
| bindingOutput = bindingOutput.absolute; |
| |
| Directory? oldDir; |
| var yaml = loadYaml(await yamlConfig.readAsString()) as YamlMap; |
| |
| if (chDir) { |
| oldDir = Directory.current; |
| Directory.current = yamlConfig.parent; |
| } |
| try { |
| if (yaml.containsKey("ffigen")) { |
| yaml = yaml["ffigen"] as YamlMap; |
| } |
| |
| final config = Config.fromYaml(yaml); |
| final library = parse(config); |
| library.generateFile(bindingOutput); |
| } finally { |
| if (oldDir != null) { |
| Directory.current = oldDir; |
| } |
| } |
| } |
| |
| Future<void> main(List<String> args) async { |
| final parser = ArgParser(); |
| parser.addSeparator(usage); |
| parser.addFlag( |
| 'help', |
| abbr: 'h', |
| help: 'Prints this usage', |
| negatable: false, |
| ); |
| |
| final parseArgs = parser.parse(args); |
| if (parseArgs.wasParsed('help')) { |
| print(parser.usage); |
| exit(0); |
| } else if (parseArgs.rest.isNotEmpty) { |
| print(parser.usage); |
| exit(1); |
| } |
| |
| Logger.root.level = Level.WARNING; |
| Logger.root.onRecord.listen((record) { |
| print('${record.level.name}: ${record.time}: ${record.message}'); |
| }); |
| |
| await _regenConfig(File('test/native_test/config.yaml'), |
| File('test/native_test/native_test_bindings.dart')); |
| |
| await _regenConfig(File('example/libclang-example/pubspec.yaml'), |
| File('example/libclang-example/generated_bindings.dart'), |
| chDir: true); |
| |
| await _regenConfig(File('example/simple/pubspec.yaml'), |
| File('example/simple/generated_bindings.dart'), |
| chDir: true); |
| |
| await _regenConfig(File('example/c_json/pubspec.yaml'), |
| File('example/c_json/cjson_generated_bindings.dart'), |
| chDir: true); |
| } |