[ffigen] Use tmpDir over working directory (#464)
diff --git a/pkgs/ffigen/README.md b/pkgs/ffigen/README.md index 96a88d0..c72249b 100644 --- a/pkgs/ffigen/README.md +++ b/pkgs/ffigen/README.md
@@ -733,6 +733,12 @@ - They refer to a struct/union having the same name as itself. - They refer to a boolean, enum, inline array, Handle or any unsupported type. +### How are macros handled? + +`ffigen` uses `clang`'s own compiler frontend to parse and traverse the `C` header files. `ffigen` expands the macros using `clang`'s macro expansion and then traverses the expanded code. To do this, `ffigen` generates temporary files in a system tmp directory. + +A custom temporary directory can be specified by setting the `TEST_TMPDIR` environment variable. + ### What are these logs generated by ffigen and how to fix them? Ffigen can sometimes generate a lot of logs, especially when it's parsing a lot of code.
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart index cb5fbdb..7478ea8 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
@@ -66,7 +66,13 @@ final index = clang.clang_createIndex(0, 0); Pointer<Pointer<Utf8>> clangCmdArgs = nullptr; var cmdLen = 0; - clangCmdArgs = createDynamicStringArray(config.compilerOpts); + + final compilerOpts = config.compilerOpts; + config.headers.entryPoints.followedBy([file.path]).forEach((entryFile) { + compilerOpts.add("-imacros$entryFile"); + }); + clangCmdArgs = createDynamicStringArray(compilerOpts); + cmdLen = config.compilerOpts.length; final tu = clang.clang_parseTranslationUnit( index, @@ -179,7 +185,7 @@ /// Creates a temporary file for parsing macros in current directory. File createFileForMacros() { - final fileNameBase = 'temp_for_macros'; + final fileNameBase = p.join(strings.tmpDir, 'temp_for_macros'); final fileExt = 'hpp'; // Find a filename which doesn't already exist. @@ -187,12 +193,13 @@ var i = 0; while (file.existsSync()) { i++; - file = File('${fileNameBase.split('.')[0]}_$i.$fileExt'); + file = File('${fileNameBase}_$i.$fileExt'); } // Create file. file.createSync(); - // Save generted name. + + // Save generated name. _generatedFileBaseName = p.basename(file.path); // Write file contents.
diff --git a/pkgs/ffigen/lib/src/strings.dart b/pkgs/ffigen/lib/src/strings.dart index 755ca74..99d10c2 100644 --- a/pkgs/ffigen/lib/src/strings.dart +++ b/pkgs/ffigen/lib/src/strings.dart
@@ -230,3 +230,16 @@ const ffiNative = 'ffi-native'; const ffiNativeAsset = 'asset'; + +Directory? _tmpDir; + +/// A path to a unique temporary directory that should be used for files meant +/// to be discarded after the current execution is finished. +String get tmpDir { + if (Platform.environment.containsKey('TEST_TMPDIR')) { + return Platform.environment['TEST_TMPDIR']!; + } + + _tmpDir ??= Directory.systemTemp.createTempSync(); + return _tmpDir!.path; +}
diff --git a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart index 046ee8f..35fa0a9 100644 --- a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart +++ b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart
@@ -459,11 +459,7 @@ /// Utility to match expected bindings to the generated bindings. void _matchLib(Library lib, String testName) { - matchLibraryWithExpected(lib, [ - 'test', - 'debug_generated', - 'code_generator_test_${testName}_output.dart' - ], [ + matchLibraryWithExpected(lib, 'code_generator_test_${testName}_output.dart', [ 'test', 'code_generator_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart index 1d2744b..0280732 100644 --- a/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart +++ b/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart
@@ -35,11 +35,8 @@ ); }); test('declaration and symbol address conflict', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'collision_test_decl_symbol_address_collision_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'collision_test_decl_symbol_address_collision_output.dart', [ 'test', 'collision_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart index 5bb8f82..40d9f88 100644 --- a/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart +++ b/pkgs/ffigen/test/collision_tests/decl_type_name_collision_test.dart
@@ -32,11 +32,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'decl_type_name_collision_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'decl_type_name_collision_test_output.dart', [ 'test', 'collision_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/example_tests/cjson_example_test.dart b/pkgs/ffigen/test/example_tests/cjson_example_test.dart index 15d0c54..4424615 100644 --- a/pkgs/ffigen/test/example_tests/cjson_example_test.dart +++ b/pkgs/ffigen/test/example_tests/cjson_example_test.dart
@@ -54,7 +54,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'example_c_json.dart'], + 'example_c_json.dart', ['example', 'c_json', config.output], ); });
diff --git a/pkgs/ffigen/test/example_tests/ffinative_example_test.dart b/pkgs/ffigen/test/example_tests/ffinative_example_test.dart index 67962a0..6895a8e 100644 --- a/pkgs/ffigen/test/example_tests/ffinative_example_test.dart +++ b/pkgs/ffigen/test/example_tests/ffinative_example_test.dart
@@ -31,7 +31,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'example_ffinative.dart'], + 'example_ffinative.dart', ['example', 'ffinative', config.output], ); });
diff --git a/pkgs/ffigen/test/example_tests/libclang_example_test.dart b/pkgs/ffigen/test/example_tests/libclang_example_test.dart index d0218c7..c226c4c 100644 --- a/pkgs/ffigen/test/example_tests/libclang_example_test.dart +++ b/pkgs/ffigen/test/example_tests/libclang_example_test.dart
@@ -74,7 +74,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'example_libclang.dart'], + 'example_libclang.dart', ['example', 'libclang-example', config.output], ); });
diff --git a/pkgs/ffigen/test/example_tests/simple_example_test.dart b/pkgs/ffigen/test/example_tests/simple_example_test.dart index 190e65e..b79b576 100644 --- a/pkgs/ffigen/test/example_tests/simple_example_test.dart +++ b/pkgs/ffigen/test/example_tests/simple_example_test.dart
@@ -30,7 +30,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'example_simple.dart'], + 'example_simple.dart', ['example', 'simple', config.output], ); });
diff --git a/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart b/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart index 3fadaea..b7e5cfa 100644 --- a/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/comment_markup_test.dart
@@ -33,11 +33,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_comment_markup_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_comment_markup_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart b/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart index 9089302..dec4dec 100644 --- a/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/dart_handle_test.dart
@@ -35,11 +35,8 @@ ); }); test('Expected Bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_dart_handle_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_dart_handle_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart b/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart index ca16de4..f8f5894 100644 --- a/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/forward_decl_test.dart
@@ -30,11 +30,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_forward_decl_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_forward_decl_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/functions_test.dart b/pkgs/ffigen/test/header_parser_tests/functions_test.dart index 7b07562..b2718aa 100644 --- a/pkgs/ffigen/test/header_parser_tests/functions_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/functions_test.dart
@@ -44,11 +44,8 @@ ); }); test('Expected Bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_functions_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_functions_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart b/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart index a018af2..2d26c1f 100644 --- a/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/imported_types_test.dart
@@ -35,11 +35,8 @@ ); }); test('Expected Bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_imported_types_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_imported_types_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart b/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart index 4f9187c..e576080 100644 --- a/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/native_func_typedef_test.dart
@@ -35,11 +35,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_native_func_typedef_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_native_func_typedef_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart b/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart index 782f761..c2572d5 100644 --- a/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/opaque_dependencies_test.dart
@@ -37,11 +37,8 @@ ); }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_opaque_dependencies_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_opaque_dependencies_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart b/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart index 357412e..bbd1ea7 100644 --- a/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/packed_structs_test.dart
@@ -30,11 +30,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_packed_structs_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_packed_structs_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart b/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart index 950d985..054474c 100644 --- a/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/regress_384_test.dart
@@ -31,11 +31,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_regress_384_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_regress_384_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/typedef_test.dart b/pkgs/ffigen/test/header_parser_tests/typedef_test.dart index abac0e0..0c75f30 100644 --- a/pkgs/ffigen/test/header_parser_tests/typedef_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/typedef_test.dart
@@ -45,11 +45,8 @@ }); test('Expected Bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_typedef_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_typedef_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/header_parser_tests/unions_test.dart b/pkgs/ffigen/test/header_parser_tests/unions_test.dart index ce2b0ea..8e8949e 100644 --- a/pkgs/ffigen/test/header_parser_tests/unions_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/unions_test.dart
@@ -30,11 +30,8 @@ }); test('Expected bindings', () { - matchLibraryWithExpected(actual, [ - 'test', - 'debug_generated', - 'header_parser_unions_test_output.dart' - ], [ + matchLibraryWithExpected( + actual, 'header_parser_unions_test_output.dart', [ 'test', 'header_parser_tests', 'expected_bindings',
diff --git a/pkgs/ffigen/test/large_integration_tests/large_test.dart b/pkgs/ffigen/test/large_integration_tests/large_test.dart index d789b81..77fe1ec 100644 --- a/pkgs/ffigen/test/large_integration_tests/large_test.dart +++ b/pkgs/ffigen/test/large_integration_tests/large_test.dart
@@ -50,7 +50,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'large_test_libclang.dart'], + 'large_test_libclang.dart', ['test', 'large_integration_tests', '_expected_libclang_bindings.dart'], // Remove comments containing @ to hack around a mismatch in the // documentation generated by different clang versions. @@ -78,7 +78,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'large_test_cjson.dart'], + 'large_test_cjson.dart', ['test', 'large_integration_tests', '_expected_cjson_bindings.dart'], ); }); @@ -110,7 +110,7 @@ matchLibraryWithExpected( library, - ['test', 'debug_generated', 'large_test_sqlite.dart'], + 'large_test_sqlite.dart', ['test', 'large_integration_tests', '_expected_sqlite_bindings.dart'], ); });
diff --git a/pkgs/ffigen/test/test_utils.dart b/pkgs/ffigen/test/test_utils.dart index bc12c64..8aa8b44 100644 --- a/pkgs/ffigen/test/test_utils.dart +++ b/pkgs/ffigen/test/test_utils.dart
@@ -5,6 +5,7 @@ import 'dart:io'; import 'package:ffigen/src/code_generator.dart'; +import 'package:ffigen/src/strings.dart' as strings; import 'package:logging/logging.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; @@ -52,10 +53,10 @@ /// /// This will not delete the actual debug file incase [expect] throws an error. void matchLibraryWithExpected( - Library library, List<String> pathForActual, List<String> pathToExpected, + Library library, String pathForActual, List<String> pathToExpected, {String Function(String)? codeNormalizer}) { final file = File( - path.joinAll(pathForActual), + path.join(strings.tmpDir, pathForActual), ); library.generateFile(file);