blob: 35b9db2b330816dc25fc5cdede18008f3de40e3b [file] [log] [blame]
// 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:logging/logging.dart';
import 'package:args/args.dart';
import 'wrapper_generators/logging.dart';
import 'wrapper_generators/generate_c_extensions.dart';
import 'wrapper_generators/generate_dart_extensions.dart';
import 'package:ffigen/ffigen.dart' as ffigen;
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']) {
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.Config.fromFile(File('ffigen_exts.yaml'));
final minimalLibrary = ffigen.parse(minimalConfig);
generateCWrappers(minimalLibrary);
logger.info("Generating FFI bindings for package:jni");
final config = ffigen.Config.fromFile(File('ffigen.yaml'));
final library = ffigen.parse(config);
final outputFile = File(config.output);
library.generateFile(outputFile);
logger.info("Generating Dart extensions");
generateDartExtensions(library);
}