blob: e9dd89d1b120c8f3f089d6dca0658144ae061083 [file] [edit]
// Copyright (c) 2025, 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:io';
import 'package:ffigen/ffigen.dart' as fg;
import 'package:logging/logging.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:swift2objc/swift2objc.dart' as swift2objc;
import 'package:swiftgen/swiftgen.dart';
Future<void> main() async {
final packageRoot = Platform.script.resolve('../');
final logger = Logger('swiftgen');
logger.onRecord.listen((record) {
stderr.writeln('${record.level.name}: ${record.message}');
});
await SwiftGenerator(
target: Target(
triple: 'x86_64-apple-macosx14.0',
sdk: Uri.directory(
'/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk',
),
),
inputs: const [SwiftModuleInput(module: 'AVFAudio')],
include: (swift2objc.Declaration d) => d.name == 'AVAudioPlayer',
output: Output(
swiftWrapperFile: SwiftWrapperFile(
path: packageRoot.resolve('avf_audio_wrapper.swift'),
),
module: 'AVFAudioWrapper',
dartFile: packageRoot.resolve('avf_audio_bindings.dart'),
objectiveCFile: packageRoot.resolve('avf_audio_wrapper.m'),
preamble: '''
// Copyright (c) 2025, 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.
// coverage:ignore-file
''',
),
ffigen: FfiGeneratorOptions(
objectiveC: fg.ObjectiveC(
externalVersions: fg.ExternalVersions(
ios: fg.Versions(min: Version(12, 0, 0)),
macos: fg.Versions(min: Version(10, 14, 0)),
),
),
visitors: [
fg.Visitor(
objCInterface: (node) {
if (node.name == 'AVAudioPlayerWrapper') {
node.isIncluded = true;
}
},
),
],
),
).generate(logger: logger, tempDirectory: packageRoot.resolve('temp/'));
final result = Process.runSync('swiftc', [
'-emit-library',
'-o',
packageRoot.resolve('avf_audio_wrapper.dylib').toFilePath(),
'-module-name',
'AVFAudioWrapper',
packageRoot.resolve('avf_audio_wrapper.swift').toFilePath(),
'-framework',
'AVFAudio',
'-framework',
'Foundation',
], workingDirectory: packageRoot.toFilePath());
if (result.exitCode != 0) {
print('Failed to build the swift wrapper library');
print(result.stdout);
print(result.stderr);
}
}