Use tmpDir over working directory (#464)

diff --git a/README.md b/README.md
index 96a88d0..c72249b 100644
--- a/README.md
+++ b/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/lib/src/header_parser/sub_parsers/macro_parser.dart b/lib/src/header_parser/sub_parsers/macro_parser.dart
index cb5fbdb..7478ea8 100644
--- a/lib/src/header_parser/sub_parsers/macro_parser.dart
+++ b/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/lib/src/strings.dart b/lib/src/strings.dart
index 755ca74..99d10c2 100644
--- a/lib/src/strings.dart
+++ b/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/test/code_generator_tests/code_generator_test.dart b/test/code_generator_tests/code_generator_test.dart
index 046ee8f..35fa0a9 100644
--- a/test/code_generator_tests/code_generator_test.dart
+++ b/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/test/collision_tests/decl_symbol_address_collision_test.dart b/test/collision_tests/decl_symbol_address_collision_test.dart
index 1d2744b..0280732 100644
--- a/test/collision_tests/decl_symbol_address_collision_test.dart
+++ b/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/test/collision_tests/decl_type_name_collision_test.dart b/test/collision_tests/decl_type_name_collision_test.dart
index 5bb8f82..40d9f88 100644
--- a/test/collision_tests/decl_type_name_collision_test.dart
+++ b/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/test/example_tests/cjson_example_test.dart b/test/example_tests/cjson_example_test.dart
index 15d0c54..4424615 100644
--- a/test/example_tests/cjson_example_test.dart
+++ b/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/test/example_tests/ffinative_example_test.dart b/test/example_tests/ffinative_example_test.dart
index 67962a0..6895a8e 100644
--- a/test/example_tests/ffinative_example_test.dart
+++ b/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/test/example_tests/libclang_example_test.dart b/test/example_tests/libclang_example_test.dart
index d0218c7..c226c4c 100644
--- a/test/example_tests/libclang_example_test.dart
+++ b/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/test/example_tests/simple_example_test.dart b/test/example_tests/simple_example_test.dart
index 190e65e..b79b576 100644
--- a/test/example_tests/simple_example_test.dart
+++ b/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/test/header_parser_tests/comment_markup_test.dart b/test/header_parser_tests/comment_markup_test.dart
index 3fadaea..b7e5cfa 100644
--- a/test/header_parser_tests/comment_markup_test.dart
+++ b/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/test/header_parser_tests/dart_handle_test.dart b/test/header_parser_tests/dart_handle_test.dart
index 9089302..dec4dec 100644
--- a/test/header_parser_tests/dart_handle_test.dart
+++ b/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/test/header_parser_tests/forward_decl_test.dart b/test/header_parser_tests/forward_decl_test.dart
index ca16de4..f8f5894 100644
--- a/test/header_parser_tests/forward_decl_test.dart
+++ b/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/test/header_parser_tests/functions_test.dart b/test/header_parser_tests/functions_test.dart
index 7b07562..b2718aa 100644
--- a/test/header_parser_tests/functions_test.dart
+++ b/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/test/header_parser_tests/imported_types_test.dart b/test/header_parser_tests/imported_types_test.dart
index a018af2..2d26c1f 100644
--- a/test/header_parser_tests/imported_types_test.dart
+++ b/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/test/header_parser_tests/native_func_typedef_test.dart b/test/header_parser_tests/native_func_typedef_test.dart
index 4f9187c..e576080 100644
--- a/test/header_parser_tests/native_func_typedef_test.dart
+++ b/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/test/header_parser_tests/opaque_dependencies_test.dart b/test/header_parser_tests/opaque_dependencies_test.dart
index 782f761..c2572d5 100644
--- a/test/header_parser_tests/opaque_dependencies_test.dart
+++ b/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/test/header_parser_tests/packed_structs_test.dart b/test/header_parser_tests/packed_structs_test.dart
index 357412e..bbd1ea7 100644
--- a/test/header_parser_tests/packed_structs_test.dart
+++ b/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/test/header_parser_tests/regress_384_test.dart b/test/header_parser_tests/regress_384_test.dart
index 950d985..054474c 100644
--- a/test/header_parser_tests/regress_384_test.dart
+++ b/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/test/header_parser_tests/typedef_test.dart b/test/header_parser_tests/typedef_test.dart
index abac0e0..0c75f30 100644
--- a/test/header_parser_tests/typedef_test.dart
+++ b/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/test/header_parser_tests/unions_test.dart b/test/header_parser_tests/unions_test.dart
index ce2b0ea..8e8949e 100644
--- a/test/header_parser_tests/unions_test.dart
+++ b/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/test/large_integration_tests/large_test.dart b/test/large_integration_tests/large_test.dart
index d789b81..77fe1ec 100644
--- a/test/large_integration_tests/large_test.dart
+++ b/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/test/test_utils.dart b/test/test_utils.dart
index bc12c64..8aa8b44 100644
--- a/test/test_utils.dart
+++ b/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);