blob: 7531bbed7fd63fe3d4adbcd571e5ad788d271210 [file] [edit]
// 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.
// This script generates all FFIGEN-based bindings we require to use JNI, which
// includes some C wrappers over `JNIEnv` type and some Dart extension methods.
import 'dart:io';
import 'package:args/args.dart';
import 'package:ffigen/ffigen.dart' as ffigen;
import 'package:ffigen/src/context.dart' as ffigen;
import 'package:ffigen/src/header_parser.dart' as ffigen;
import 'package:logging/logging.dart';
import 'wrapper_generators/generate_c_extensions.dart';
import 'wrapper_generators/generate_dart_extensions.dart';
import 'wrapper_generators/logging.dart';
void main(List<String> args) {
final levels = Map.fromEntries(
Level.LEVELS.map((l) => MapEntry(l.name.toLowerCase(), l)),
);
final argParser = ArgParser()
..addOption(
'verbose',
defaultsTo: 'severe',
help: 'set ffigen log verbosity',
allowed: levels.keys,
)
..addFlag(
'help',
negatable: false,
abbr: 'h',
defaultsTo: false,
help: 'display this help message',
);
final argResults = argParser.parse(args);
if (argResults['help'] as bool) {
stderr.writeln('Generates FFI bindings required for package:jni');
stderr.writeln(argParser.usage);
exitCode = 1;
return;
}
hierarchicalLoggingEnabled = true;
Logger.root.level = levels[argResults['verbose']]!;
logger.level = Level.INFO;
Logger.root.onRecord.listen((record) {
stderr.writeln('${record.level.name}: ${record.message}');
});
logger.info('Generating C wrappers');
final minimalConfig =
ffigen.YamlConfig.fromFile(File('ffigen_exts.yaml'), logger)
.configAdapter();
final minimalLibrary = ffigen.parse(ffigen.Context(logger, minimalConfig));
generateCWrappers(minimalLibrary);
logger.info('Generating FFI bindings for package:jni');
final config =
ffigen.YamlConfig.fromFile(File('ffigen.yaml'), logger).configAdapter();
final library = ffigen.parse(ffigen.Context(logger, config));
final outputFile = File(config.output.dartFile.toFilePath());
library.generateFile(outputFile);
logger.info('Generating Dart extensions');
generateDartExtensions(library);
}