Prepare for pub release (#36)

- Updated version, changelog, readme, tests
- Dynamic library is now created at `.dart_tool/ffigen` in user's project.
- Added `bin/setup.dart` to load dynamic library (custom header/lib includes can be specified using `-I` / `-L` respectively.
- Generated classes for enums are now abstract.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8fcd296..40872de 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # 0.1.0
-- Initial release supporing binding generation for Functions, Structs, Enums.
+- Support for Functions, Structs and Enums.
 - Glob support for specifying headers.
-- HeaderFilter - Include/Exclude declarations from specific header files.
+- HeaderFilter - Include/Exclude declarations from specific header files using name matching.
 - Filters - Include/Exclude function, structs and enum declarations using Regexp or Name matching.
+- Prefixing - function, structs and enums can have a global prefix. Individual prefix Replacement support using Regexp.
+- Comment extraction: full/brief/none
+- Support for fixed size arrays in struct. `array-workaround` (if enabled) will generate helpers for accessing fixed size arrays in structs.
+- Size for ints can be specified using `size-map` in config.
+- Options to disable using supported typedefs (e.g `uint8_t => Uint8`), sort bindings.
+- Option to add a raw `preamble` which is included as is in the generated file.
diff --git a/README.md b/README.md
index 31dd16b..14053ce 100644
--- a/README.md
+++ b/README.md
@@ -33,27 +33,24 @@
 typedef _dart_sum = int Function(int a,int b);
 ```
 ## Using this package
-- clone/download this repository.
-- Build it (see [building](#building)).
 - Add this package as dev_dependency in your `pubspec.yaml`.
+- Setup for use (see [Setup](#Setup)).
 - Configurations must be provided in `pubspec.yaml` or in a custom YAML file (see [configurations](#configurations)).
 - Run the tool- `pub run ffigen`.
 
-## Building
-A dynamic library for a wrapper to libclang needs to be generated as it is used by the parser submodule.
+## Setup
+`package:ffigen` uses LLVM. Install LLVM in the following way.
 
 #### ubuntu/linux
 1. Install libclangdev - `sudo apt-get install libclang-dev`.
-2. `cd tool/wrapped_libclang`, then run `dart build.dart`.
 
 #### Windows
 1. Install Visual Studio with C++ development support.
-2. Install LLVM.
-3. `cd tool\wrapped_libclang`, then run `dart build.dart`.
+2. Install [LLVM](https://releases.llvm.org/download.html).
 
 #### MacOS
-1. Install LLVM.
-2. `cd tool/wrapped_libclang`, then run `dart build.dart`.
+1. Install Xcode.
+2. Install LLVM - `brew install llvm`.
 
 ## Configurations
 Configurations can be provided in 2 ways-
@@ -154,16 +151,6 @@
     <td><pre lang='yaml'>comments: 'full'</pre></td>
   </tr>
   <tr>
-    <td>libclang-dylib-folder</td>
-    <td>no</td>
-    <td>Path to the folder containing dynamic library for libclang wrapper.<br>
-    Note: This is meant for programatic use of this package, and isn't required
-    when using it via the <code>pub run ffigen</code> command.<br>
-      <b>Default: tool/wrapped_libclang</b>
-    </td>
-    <td><pre lang='yaml'>libclang-dylib-folder: 'tool/wrapped_libclang'</pre></td>
-  </tr>
-  <tr>
     <td>sort</td>
     <td>no</td>
     <td>Sort the bindings according to name.<br>
@@ -299,8 +286,9 @@
 2. Run `pub run ffigen`.
 
 ## Running Tests
-Dynamic library for some tests need to be built before running the examples.
-1. `cd test/native_test`.
-2. Run `dart build_test_dylib.dart`.
+1. Run setup to build the LLVM wrapper - `pub run ffigen:setup`.
+2. Dynamic library for some tests also need to be built before running the examples.
+  1. `cd test/native_test`.
+  2. Run `dart build_test_dylib.dart`.
 
 Run tests from the root of the package with `pub run test`.
diff --git a/bin/ffigen.dart b/bin/ffigen.dart
index 4a321ee..2f0a07f 100644
--- a/bin/ffigen.dart
+++ b/bin/ffigen.dart
@@ -11,9 +11,20 @@
 import 'package:logging/logging.dart';
 import 'package:yaml/yaml.dart' as yaml;
 
+import 'setup.dart';
+
 var _logger = Logger('ffigen.ffigen');
 
 void main(List<String> args) {
+  /// Prompt user if dylib doesn't exist and cannot be auto created to run
+  /// `pub run ffigen:setup -Ipath/to/llvm/include -Lpath/to/llvm/lib`.
+  if (!checkDylibExist() && !autoCreateDylib()) {
+    print('Unable to create dynamic library automatically.');
+    print('If LLVM is installed, try running:');
+    print('  pub run ffigen:setup -Ipath/to/llvm/include -Lpath/to/llvm/lib');
+    exit(1);
+  }
+
   // Parses the cmd args.
   final result = getArgResults(args);
 
diff --git a/bin/setup.dart b/bin/setup.dart
new file mode 100644
index 0000000..ee52412
--- /dev/null
+++ b/bin/setup.dart
@@ -0,0 +1,288 @@
+// Copyright (c) 2020, 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.
+
+/// =======================================================================
+/// =============== Build script to generate dyamic library ===============
+/// =======================================================================
+/// This Script effectively calls the following (but user can provide
+/// command line args which will replace the defaults shown below)-
+///
+/// Linux:
+/// ```
+/// clang -I/usr/lib/llvm-9/include/ -I/usr/lib/llvm-10/include/ -lclang -shared -fpic path/to/wrapper.c -o path/to/libwrapped_clang.so
+/// ```
+/// MacOS:
+/// ```
+/// clang -I/usr/local/opt/llvm/include/ -L/usr/local/opt/llvm/lib/ -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ -v -lclang -shared -fpic path/to/wrapper.c -o path/to/libwrapped_clang.dylib
+/// ```
+/// Windows:
+/// ```
+/// clang -IC:\Progra~1\LLVM\include -LC:\Progra~1\LLVM\lib -llibclang -shared path/to/wrapper.c -o path/to/wrapped_clang.dll -Wl,/DEF:path/to/wrapper.def
+/// ```
+/// =======================================================================
+/// =======================================================================
+/// =======================================================================
+
+import 'dart:io';
+import 'package:args/args.dart';
+import 'package:meta/meta.dart';
+import 'package:ffigen/src/find_dot_dart_tool.dart';
+import 'package:ffigen/src/strings.dart' as strings;
+import 'package:path/path.dart' as path;
+
+const _macOS = 'macos';
+const _windows = 'windows';
+const _linux = 'linux';
+
+/// Default platform options.
+Map<String, _Options> _platformOptions = {
+  _linux: _Options(
+    sharedFlag: '-shared',
+    inputHeader: _getWrapperPath('wrapper.c'),
+    fPIC: '-fpic',
+    ldLibFlag: '-lclang',
+    headerIncludes: [
+      '-I/usr/lib/llvm-9/include/',
+      '-I/usr/lib/llvm-10/include/',
+    ],
+  ),
+  _windows: _Options(
+    sharedFlag: '-shared',
+    inputHeader: _getWrapperPath('wrapper.c'),
+    moduleDefPath: '-Wl,/DEF:${_getWrapperPath("wrapper.def")}',
+    ldLibFlag: '-llibclang',
+    headerIncludes: [
+      r'-IC:\Progra~1\LLVM\include',
+    ],
+    libIncludes: [
+      r'-LC:\Progra~1\LLVM\lib',
+    ],
+  ),
+  _macOS: _Options(
+    sharedFlag: '-shared',
+    inputHeader: _getWrapperPath('wrapper.c'),
+    fPIC: '-fpic',
+    ldLibFlag: '-lclang',
+    headerIncludes: [
+      '-I/usr/local/opt/llvm/include/',
+      '-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/',
+    ],
+    libIncludes: [
+      '-L/usr/local/opt/llvm/lib/',
+    ],
+  ),
+};
+
+/// If main is called directly we always re-create the dynamic library.
+void main(List<String> arguments) {
+  print('Building Dynamic Library for libclang wrapper...');
+  final options = _getPlatformOptions();
+  _deleteOldDylib();
+
+  // Updates header/lib includes in platform options.
+  _changeIncludesUsingCmdArgs(arguments, options);
+
+  // Run clang compiler to generate the dynamic library.
+  final ProcessResult result = _runClangProcess(options);
+  _printDetails(result, options);
+}
+
+/// Returns true if auto creating dylib was successful.
+///
+/// This will fail if llvm is not in default directories or if .dart_tool
+/// doesn't exist.
+bool autoCreateDylib() {
+  _deleteOldDylib();
+  final options = _getPlatformOptions();
+  final ProcessResult result = _runClangProcess(options);
+  if ((result.stderr as String).isNotEmpty) {
+    print(stderr);
+  }
+  return checkDylibExist();
+}
+
+bool checkDylibExist() {
+  return File(path.join(
+    _getDotDartToolPath(),
+    strings.ffigenFolderName,
+    strings.dylibFileName,
+  )).existsSync();
+}
+
+/// Removes old dynamic libraries(if any) by deleting .dart_tool/ffigen.
+///
+/// Throws error if '.dart_tool' is not found.
+void _deleteOldDylib() {
+  // Find .dart_tool.
+  final dtpath = _getDotDartToolPath();
+  // Find .dart_tool/ffigen and delete recursively if it exists.
+  final ffigenDir = Directory(path.join(dtpath, strings.ffigenFolderName));
+  if (ffigenDir.existsSync()) ffigenDir.deleteSync(recursive: true);
+}
+
+/// Creates necesarry parent folders and return full path to dylib.
+String _dylibPath() {
+  // Find .dart_tool.
+  final dtpath = _getDotDartToolPath();
+  // Create .dart_tool/ffigen if it doesn't exists.
+  final ffigenDir = Directory(path.join(dtpath, strings.ffigenFolderName));
+  if (!ffigenDir.existsSync()) ffigenDir.createSync();
+
+  // Return dylib path
+  return path.join(ffigenDir.absolute.path, strings.dylibFileName);
+}
+
+/// Returns full path of the wrapper files.
+///
+/// Throws error if not found.
+String _getWrapperPath(String wrapperName) {
+  final file = File(path.join(
+    Platform.script
+        .resolve(path.posix.join('..', 'lib', 'src', 'clang_library'))
+        // This needs to be in posix style or illegal character exception is
+        // thrown on windows.
+        .toFilePath(),
+    wrapperName,
+  ));
+  if (file.existsSync()) {
+    return file.absolute.path;
+  } else {
+    throw Exception('Unable to find $wrapperName file.');
+  }
+}
+
+/// Gets full path to .dart_tool.
+///
+/// Throws Exception if not found.
+String _getDotDartToolPath() {
+  final dtpath = findDotDartTool()?.toFilePath();
+  if (dtpath == null) {
+    throw Exception('.dart_tool not found.');
+  }
+  return dtpath;
+}
+
+/// Calls the clang compiler.
+ProcessResult _runClangProcess(_Options options) {
+  final result = Process.runSync(
+    'clang',
+    [
+      ...options.headerIncludes,
+      ...options.libIncludes,
+      options.ldLibFlag,
+      options.sharedFlag,
+      options.fPIC,
+      options.inputHeader,
+      '-o',
+      _dylibPath(),
+      options.moduleDefPath,
+      '-Wno-nullability-completeness',
+    ],
+  );
+  return result;
+}
+
+/// Prints success message (or process error if any).
+void _printDetails(ProcessResult result, _Options options) {
+  print(result.stdout);
+  if ((result.stderr as String).isNotEmpty) {
+    print(result.stderr);
+  } else {
+    print('Created dynamic library.');
+  }
+}
+
+ArgResults _getArgResults(List<String> args) {
+  final parser = ArgParser(allowTrailingOptions: true);
+  parser.addSeparator(
+      'Build Script to generate dynamic library used by this package:');
+  parser.addMultiOption('include-header',
+      abbr: 'I', help: 'Path to header include directories');
+  parser.addMultiOption('include-lib',
+      abbr: 'L', help: 'Path to library include directories');
+  parser.addFlag(
+    'help',
+    abbr: 'h',
+    help: 'prints this usage',
+    negatable: false,
+  );
+
+  ArgResults results;
+  try {
+    results = parser.parse(args);
+
+    if (results.wasParsed('help')) {
+      print(parser.usage);
+      exit(0);
+    }
+  } catch (e) {
+    print(e);
+    print(parser.usage);
+    exit(1);
+  }
+
+  return results;
+}
+
+/// Use cmd args(if any) to change header/lib include paths.
+void _changeIncludesUsingCmdArgs(List<String> arguments, _Options options) {
+  final argResult = _getArgResults(arguments);
+  if (argResult.wasParsed('include-header')) {
+    options.headerIncludes = (argResult['include-header'] as List<String>)
+        .map((header) => '-I$header')
+        .toList();
+  }
+  if (argResult.wasParsed('include-lib')) {
+    options.libIncludes = (argResult['include-lib'] as List<String>)
+        .map((lib) => '-L$lib')
+        .toList();
+  }
+}
+
+/// Get options based on current platform.
+_Options _getPlatformOptions() {
+  if (Platform.isMacOS) {
+    return _platformOptions[_macOS];
+  } else if (Platform.isWindows) {
+    return _platformOptions[_windows];
+  } else if (Platform.isLinux) {
+    return _platformOptions[_linux];
+  } else {
+    throw Exception('Unknown Platform.');
+  }
+}
+
+/// Hold options which would be passed to clang.
+class _Options {
+  /// Tells compiler to generate a shared library.
+  final String sharedFlag;
+
+  /// Flag for generating Position Independant Code (Not used on windows).
+  final String fPIC;
+
+  /// Input file.
+  final String inputHeader;
+
+  /// Path to `.def` file containing symbols to export, windows use only.
+  final String moduleDefPath;
+
+  /// Path to header files.
+  List<String> headerIncludes;
+
+  /// Path to dynamic/static libraries
+  List<String> libIncludes;
+
+  /// Linker flag for linking to libclang.
+  final String ldLibFlag;
+
+  _Options({
+    @required this.sharedFlag,
+    @required this.inputHeader,
+    @required this.ldLibFlag,
+    this.headerIncludes = const [],
+    this.libIncludes = const [],
+    this.fPIC = '',
+    this.moduleDefPath = '',
+  });
+}
diff --git a/example/libclang-example/generated_bindings.dart b/example/libclang-example/generated_bindings.dart
index 924da2a..b58ac84 100644
--- a/example/libclang-example/generated_bindings.dart
+++ b/example/libclang-example/generated_bindings.dart
@@ -2531,7 +2531,7 @@
   int Subminor;
 }
 
-class CXGlobalOptFlags {
+abstract class CXGlobalOptFlags {
   /// Used to indicate that no special CXIndex options are needed.
   static const int CXGlobalOpt_None = 0;
 
@@ -2852,7 +2852,7 @@
 class CXCursorSetImpl extends ffi.Struct {}
 
 /// Describes the kind of type
-class CXTypeKind {
+abstract class CXTypeKind {
   /// Represents an invalid type (e.g., where no type is available).
   static const int CXType_Invalid = 0;
 
diff --git a/example/libclang-example/readme.md b/example/libclang-example/readme.md
index 33a01ef..0b8da39 100644
--- a/example/libclang-example/readme.md
+++ b/example/libclang-example/readme.md
@@ -1,7 +1,7 @@
 # Libclang example
 
 Demonstrates generating bindings for [Libclang](https://clang.llvm.org/doxygen/group__CINDEX.html).
-This example actually uses a C file used in this package itself, ([wrapper.c](../../tool/wrapped_libclang/wrapper.c)), which adds a few more wrapper functions atop Libclang.
+The C header source files for libclang are in [third_party/libclang](/third_party/libclang).
 
 ## Generating bindings
 At the root of this example (`example/libclang-example`), run -
diff --git a/tool/wrapped_libclang/wrapper.c b/lib/src/clang_library/wrapper.c
similarity index 100%
rename from tool/wrapped_libclang/wrapper.c
rename to lib/src/clang_library/wrapper.c
diff --git a/tool/wrapped_libclang/wrapper.def b/lib/src/clang_library/wrapper.def
similarity index 100%
rename from tool/wrapped_libclang/wrapper.def
rename to lib/src/clang_library/wrapper.def
diff --git a/lib/src/code_generator/enum_class.dart b/lib/src/code_generator/enum_class.dart
index 8232ccb..5a96c39 100644
--- a/lib/src/code_generator/enum_class.dart
+++ b/lib/src/code_generator/enum_class.dart
@@ -49,7 +49,7 @@
     final localUniqueNamer = UniqueNamer({enclosingClassName});
 
     // Print enclosing class.
-    s.write('class $enclosingClassName {\n');
+    s.write('abstract class $enclosingClassName {\n');
     const depth = '  ';
     for (final ec in enumConstants) {
       final enum_value_name = localUniqueNamer.makeUnique(ec.name);
diff --git a/lib/src/config_provider/config.dart b/lib/src/config_provider/config.dart
index b0abcc0..054087b 100644
--- a/lib/src/config_provider/config.dart
+++ b/lib/src/config_provider/config.dart
@@ -2,8 +2,6 @@
 // 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';
-
 /// Validates the yaml input by the user, prints useful info for the user
 
 import 'package:ffigen/src/code_generator.dart';
@@ -11,7 +9,6 @@
 
 import 'package:logging/logging.dart';
 import 'package:meta/meta.dart';
-import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart';
 
 import '../strings.dart' as strings;
@@ -27,12 +24,6 @@
   /// output file name.
   String output;
 
-  /// libclang path (in accordance with the platform).
-  ///
-  /// File may have the following extensions - `.so` / `.dll` / `.dylib`
-  /// as extracted by configspec.
-  String libclang_dylib_path;
-
   /// Path to headers.
   ///
   /// This contains all the headers, after extraction from Globs.
@@ -145,20 +136,6 @@
         extractor: outputExtractor,
         extractedResult: (dynamic result) => output = result as String,
       ),
-      strings.libclang_dylib_folder: Specification<String>(
-        description:
-            'Path to folder containing libclang dynamic library, used to parse C headers',
-        requirement: Requirement.no,
-        defaultValue: () => getDylibPath(Platform.script
-            .resolve(path.posix.join('..', 'tool', 'wrapped_libclang'))
-            // Path needs to be in posix style here or an illegal character
-            // error is thrown on windows.
-            .toFilePath()),
-        validator: libclangDylibValidator,
-        extractor: libclangDylibExtractor,
-        extractedResult: (dynamic result) =>
-            libclang_dylib_path = result as String,
-      ),
       strings.headers: Specification<List<String>>(
         description: 'List of C headers to generate bindings of',
         requirement: Requirement.yes,
diff --git a/lib/src/find_dot_dart_tool.dart b/lib/src/find_dot_dart_tool.dart
new file mode 100644
index 0000000..07c4a98
--- /dev/null
+++ b/lib/src/find_dot_dart_tool.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2020, 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.
+
+library finddotdarttool;
+
+export 'find_dot_dart_tool/finddotdarttool_fallback.dart'
+    if (dart.library.cli) 'find_dot_dart_tool/finddotdarttool_cli.dart';
diff --git a/lib/src/find_dot_dart_tool/finddotdarttool_cli.dart b/lib/src/find_dot_dart_tool/finddotdarttool_cli.dart
new file mode 100644
index 0000000..0773410
--- /dev/null
+++ b/lib/src/find_dot_dart_tool/finddotdarttool_cli.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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:cli' as cli;
+import 'dart:io' show File;
+import 'dart:isolate' show Isolate;
+import 'finddotdarttool_fallback.dart' as fallback;
+
+/// Find the `.dart_tool/` folder, returns `null` if unable to find it.
+Uri findDotDartTool() {
+  // Find [Isolate.packageConfig] and check if contains:
+  //  * `package_config.json`, or,
+  //  * `.dart_tool/package_config.json`.
+  // If either is the case we know the path to `.dart_tool/`.
+  final packageConfig = cli.waitFor(Isolate.packageConfig);
+  if (packageConfig != null &&
+      File.fromUri(packageConfig.resolve('package_config.json')).existsSync()) {
+    return packageConfig.resolve('./');
+  }
+  if (packageConfig != null &&
+      File.fromUri(packageConfig.resolve('.dart_tool/package_config.json'))
+          .existsSync()) {
+    return packageConfig.resolve('.dart_tool/');
+  }
+  // If [Isolate.packageConfig] isn't helpful we fallback to looking at the
+  // current script location and traverse up from there.
+  return fallback.findDotDartTool();
+}
diff --git a/lib/src/find_dot_dart_tool/finddotdarttool_fallback.dart b/lib/src/find_dot_dart_tool/finddotdarttool_fallback.dart
new file mode 100644
index 0000000..50e2c4c
--- /dev/null
+++ b/lib/src/find_dot_dart_tool/finddotdarttool_fallback.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2020, 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' show Platform, File;
+
+/// Find the `.dart_tool/` folder, returns `null` if unable to find it.
+Uri findDotDartTool() {
+  // HACK: Because 'dart:isolate' is unavailable in Flutter we have no means
+  //       by which we can find the location of the package_config.json file.
+  //       Which we need, because the binary library created by:
+  //         flutter pub run ffigen:setup
+  //       is located relative to this path. As a workaround we use
+  //       `Platform.script` and traverse level-up until we find a
+  //       `.dart_tool/package_config.json` file.
+  // Find script directory
+  var root = Platform.script.resolve('./');
+  // Traverse up until we see a `.dart_tool/package_config.json` file.
+  do {
+    if (File.fromUri(root.resolve('.dart_tool/package_config.json'))
+        .existsSync()) {
+      return root.resolve('.dart_tool/');
+    }
+  } while (root != (root = root.resolve('..')));
+  return null;
+}
diff --git a/lib/src/header_parser/clang_bindings/clang_bindings.dart b/lib/src/header_parser/clang_bindings/clang_bindings.dart
index 7040fb5..975c9ad 100644
--- a/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -704,7 +704,7 @@
 }
 
 /// Options to control the display of diagnostics.
-class CXDiagnosticDisplayOptions {
+abstract class CXDiagnosticDisplayOptions {
   /// Display the source-location information where the diagnostic was located.
   static const int CXDiagnostic_DisplaySourceLocation = 1;
 
@@ -727,7 +727,7 @@
 }
 
 /// Flags that control the creation of translation units.
-class CXTranslationUnit_Flags {
+abstract class CXTranslationUnit_Flags {
   /// Used to indicate that no special translation-unit options are needed.
   static const int CXTranslationUnit_None = 0;
 
@@ -791,7 +791,7 @@
 }
 
 /// Describes the kind of entity that a cursor refers to.
-class CXCursorKind {
+abstract class CXCursorKind {
   /// A declaration whose specific kind is not exposed via this interface.
   static const int CXCursor_UnexposedDecl = 1;
 
@@ -1509,7 +1509,7 @@
 }
 
 /// Describes the kind of type
-class CXTypeKind {
+abstract class CXTypeKind {
   /// Represents an invalid type (e.g., where no type is available).
   static const int CXType_Invalid = 0;
 
@@ -1693,7 +1693,7 @@
 
 /// Describes how the traversal of the children of a particular cursor should
 /// proceed after visiting a particular child cursor.
-class CXChildVisitResult {
+abstract class CXChildVisitResult {
   /// Terminates the cursor traversal.
   static const int CXChildVisit_Break = 0;
 
diff --git a/lib/src/header_parser/parser.dart b/lib/src/header_parser/parser.dart
index bc3c7f8..a2b1593 100644
--- a/lib/src/header_parser/parser.dart
+++ b/lib/src/header_parser/parser.dart
@@ -3,13 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:ffi';
-import 'dart:io';
 
 import 'package:ffi/ffi.dart';
 import 'package:ffigen/src/code_generator.dart';
 import 'package:ffigen/src/config_provider.dart';
+import 'package:ffigen/src/find_dot_dart_tool.dart';
 import 'package:ffigen/src/header_parser/translation_unit_parser.dart';
+import 'package:ffigen/src/strings.dart' as strings;
 import 'package:logging/logging.dart';
+import 'package:path/path.dart' as path;
 
 import 'clang_bindings/clang_bindings.dart' as clang_types;
 import 'data.dart';
@@ -42,11 +44,20 @@
 
 /// Initialises parser, clears any previous values.
 void initParser(Config c) {
+  // Set global configurations.
   config = c;
 
-  clang = clang_types.Clang(DynamicLibrary.open(
-      File(config.libclang_dylib_path).absolute?.path ??
-          config.libclang_dylib_path));
+  // Find full path of dynamic library and initialise bindings.
+  if (findDotDartTool() == null) {
+    throw Exception('Unable to find .dart_tool.');
+  } else {
+    final fullDylibPath = path.join(
+      findDotDartTool().toFilePath(),
+      strings.ffigenFolderName,
+      strings.dylibFileName,
+    );
+    clang = clang_types.Clang(DynamicLibrary.open(fullDylibPath));
+  }
 }
 
 /// Parses source files and adds generated bindings to [bindings].
diff --git a/lib/src/strings.dart b/lib/src/strings.dart
index 5951ef5..6bc47cd 100644
--- a/lib/src/strings.dart
+++ b/lib/src/strings.dart
@@ -1,11 +1,32 @@
 // Copyright (c) 2020, 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/src/header_parser/clang_bindings/clang_bindings.dart'
     as clang;
 
+// This version must be updated whenever we update the libclang wrapper.
+const dylibVersion = 'v1';
+
+/// Name of the dynamic library file according to current platform.
+String get dylibFileName {
+  String name;
+  if (Platform.isLinux) {
+    name = libclang_dylib_linux;
+  } else if (Platform.isMacOS) {
+    name = libclang_dylib_macos;
+  } else if (Platform.isWindows) {
+    name = libclang_dylib_windows;
+  } else {
+    throw Exception('Unsupported Platform.');
+  }
+  return '_${dylibVersion}_$name';
+}
+
+const ffigenFolderName = 'ffigen';
+
 const output = 'output';
-const libclang_dylib_folder = 'libclang-dylib-folder';
 const headers = 'headers';
 const headerFilter = 'header-filter';
 const compilerOpts = 'compiler-opts';
diff --git a/pubspec.yaml b/pubspec.yaml
index 64ecfbd..c412a92 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 0.0.1
+version: 0.1.0
 homepage: https://github.com/dart-lang/ffigen
 description: Experimental generator for FFI bindings.
 
diff --git a/test/code_generator_test.dart b/test/code_generator_test.dart
index 4fd5aea..a67f41e 100644
--- a/test/code_generator_test.dart
+++ b/test/code_generator_test.dart
@@ -545,7 +545,7 @@
 
 /// test line 1
 /// test line 2
-class Constants {
+abstract class Constants {
   static const int a = 10;
   /// negative
   static const int b = -1;
@@ -715,10 +715,10 @@
 class ArrayHelperPrefixCollisionTest extends ffi.Struct{
 }
 
-class _c_Test {
+abstract class _c_Test {
 }
 
-class init_dylib {
+abstract class init_dylib {
 }
 
 typedef _c_test1 = ffi.Void Function(
diff --git a/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart
index f3c7fe1..872bf1b 100644
--- a/test/header_parser_tests/function_n_struct_test.dart
+++ b/test/header_parser_tests/function_n_struct_test.dart
@@ -24,7 +24,7 @@
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Function And Struct Test'
 ${strings.output}: 'unused'
-${strings.libclang_dylib_folder}: 'tool/wrapped_libclang'
+
 ${strings.headers}:
   - 'test/header_parser_tests/function_n_struct.h'
         ''') as yaml.YamlMap),
diff --git a/test/header_parser_tests/functions_test.dart b/test/header_parser_tests/functions_test.dart
index 67a147a..c88fd55 100644
--- a/test/header_parser_tests/functions_test.dart
+++ b/test/header_parser_tests/functions_test.dart
@@ -23,7 +23,7 @@
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Functions Test'
 ${strings.output}: 'unused'
-${strings.libclang_dylib_folder}: 'tool/wrapped_libclang'
+
 ${strings.headers}:
   - 'test/header_parser_tests/functions.h'
 ${strings.headerFilter}:
diff --git a/test/header_parser_tests/nested_parsing_test.dart b/test/header_parser_tests/nested_parsing_test.dart
index 8783f46..0736231 100644
--- a/test/header_parser_tests/nested_parsing_test.dart
+++ b/test/header_parser_tests/nested_parsing_test.dart
@@ -23,7 +23,7 @@
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Nested Parsing Test'
 ${strings.output}: 'unused'
-${strings.libclang_dylib_folder}: 'tool/wrapped_libclang'
+
 ${strings.headers}:
   - 'test/header_parser_tests/nested_parsing.h'
 structs:
diff --git a/test/large_integration_tests/_expected_libclang_bindings.dart b/test/large_integration_tests/_expected_libclang_bindings.dart
index 1aa4cb5..7cb48a1 100644
--- a/test/large_integration_tests/_expected_libclang_bindings.dart
+++ b/test/large_integration_tests/_expected_libclang_bindings.dart
@@ -2149,7 +2149,7 @@
 }
 
 /// Error codes returned by libclang routines.
-class CXErrorCode {
+abstract class CXErrorCode {
   /// No error.
   static const int CXError_Success = 0;
 
@@ -2205,7 +2205,7 @@
 /// Describes the availability of a particular entity, which indicates whether
 /// the use of this entity will result in a warning or error due to it being
 /// deprecated or unavailable.
-class CXAvailabilityKind {
+abstract class CXAvailabilityKind {
   /// The entity is available.
   static const int CXAvailability_Available = 0;
 
@@ -2241,7 +2241,7 @@
 }
 
 /// Describes the exception specification of a cursor.
-class CXCursor_ExceptionSpecificationKind {
+abstract class CXCursor_ExceptionSpecificationKind {
   /// The cursor has no exception specification.
   static const int CXCursor_ExceptionSpecificationKind_None = 0;
 
@@ -2273,7 +2273,7 @@
   static const int CXCursor_ExceptionSpecificationKind_NoThrow = 9;
 }
 
-class CXGlobalOptFlags {
+abstract class CXGlobalOptFlags {
   /// Used to indicate that no special CXIndex options are needed.
   static const int CXGlobalOpt_None = 0;
 
@@ -2477,7 +2477,7 @@
 }
 
 /// Describes the severity of a particular diagnostic.
-class CXDiagnosticSeverity {
+abstract class CXDiagnosticSeverity {
   /// A diagnostic that has been suppressed, e.g., by a command-line option.
   static const int CXDiagnostic_Ignored = 0;
 
@@ -2498,7 +2498,7 @@
 
 /// Describes the kind of error that occurred (if any) in a call to
 /// clang_loadDiagnostics.
-class CXLoadDiag_Error {
+abstract class CXLoadDiag_Error {
   /// Indicates that no error occurred.
   static const int CXLoadDiag_None = 0;
 
@@ -2515,7 +2515,7 @@
 }
 
 /// Options to control the display of diagnostics.
-class CXDiagnosticDisplayOptions {
+abstract class CXDiagnosticDisplayOptions {
   /// Display the source-location information where the diagnostic was located.
   static const int CXDiagnostic_DisplaySourceLocation = 1;
 
@@ -2538,7 +2538,7 @@
 }
 
 /// Flags that control the creation of translation units.
-class CXTranslationUnit_Flags {
+abstract class CXTranslationUnit_Flags {
   /// Used to indicate that no special translation-unit options are needed.
   static const int CXTranslationUnit_None = 0;
 
@@ -2602,14 +2602,14 @@
 }
 
 /// Flags that control how translation units are saved.
-class CXSaveTranslationUnit_Flags {
+abstract class CXSaveTranslationUnit_Flags {
   /// Used to indicate that no special saving options are needed.
   static const int CXSaveTranslationUnit_None = 0;
 }
 
 /// Describes the kind of error that occurred (if any) in a call to
 /// clang_saveTranslationUnit().
-class CXSaveError {
+abstract class CXSaveError {
   /// Indicates that no error occurred while saving a translation unit.
   static const int CXSaveError_None = 0;
 
@@ -2627,13 +2627,13 @@
 }
 
 /// Flags that control the reparsing of translation units.
-class CXReparse_Flags {
+abstract class CXReparse_Flags {
   /// Used to indicate that no special reparsing options are needed.
   static const int CXReparse_None = 0;
 }
 
 /// Categorizes how memory is being used by a translation unit.
-class CXTUResourceUsageKind {
+abstract class CXTUResourceUsageKind {
   static const int CXTUResourceUsage_AST = 1;
   static const int CXTUResourceUsage_Identifiers = 2;
   static const int CXTUResourceUsage_Selectors = 3;
@@ -2673,7 +2673,7 @@
 }
 
 /// Describes the kind of entity that a cursor refers to.
-class CXCursorKind {
+abstract class CXCursorKind {
   /// A declaration whose specific kind is not exposed via this interface.
   static const int CXCursor_UnexposedDecl = 1;
 
@@ -3391,7 +3391,7 @@
 }
 
 /// Describe the linkage of the entity referred to by a cursor.
-class CXLinkageKind {
+abstract class CXLinkageKind {
   /// This value indicates that no linkage information is available for a
   /// provided CXCursor.
   static const int CXLinkage_Invalid = 0;
@@ -3411,7 +3411,7 @@
   static const int CXLinkage_External = 4;
 }
 
-class CXVisibilityKind {
+abstract class CXVisibilityKind {
   /// This value indicates that no visibility information is available for a
   /// provided CXCursor.
   static const int CXVisibility_Invalid = 0;
@@ -3431,7 +3431,7 @@
 class CXPlatformAvailability extends ffi.Struct {}
 
 /// Describe the "language" of the entity referred to by a cursor.
-class CXLanguageKind {
+abstract class CXLanguageKind {
   static const int CXLanguage_Invalid = 0;
   static const int CXLanguage_C = 1;
   static const int CXLanguage_ObjC = 2;
@@ -3440,7 +3440,7 @@
 
 /// Describe the "thread-local storage (TLS) kind" of the declaration referred
 /// to by a cursor.
-class CXTLSKind {
+abstract class CXTLSKind {
   static const int CXTLS_None = 0;
   static const int CXTLS_Dynamic = 1;
   static const int CXTLS_Static = 2;
@@ -3449,7 +3449,7 @@
 class CXCursorSetImpl extends ffi.Struct {}
 
 /// Describes the kind of type
-class CXTypeKind {
+abstract class CXTypeKind {
   /// Represents an invalid type (e.g., where no type is available).
   static const int CXType_Invalid = 0;
 
@@ -3576,7 +3576,7 @@
 }
 
 /// Describes the calling convention of a function type
-class CXCallingConv {
+abstract class CXCallingConv {
   static const int CXCallingConv_Default = 0;
   static const int CXCallingConv_C = 1;
   static const int CXCallingConv_X86StdCall = 2;
@@ -3656,7 +3656,7 @@
 }
 
 /// Describes the kind of a template argument.
-class CXTemplateArgumentKind {
+abstract class CXTemplateArgumentKind {
   static const int CXTemplateArgumentKind_Null = 0;
   static const int CXTemplateArgumentKind_Type = 1;
   static const int CXTemplateArgumentKind_Declaration = 2;
@@ -3669,7 +3669,7 @@
   static const int CXTemplateArgumentKind_Invalid = 9;
 }
 
-class CXTypeNullabilityKind {
+abstract class CXTypeNullabilityKind {
   /// Values of this type can never be null.
   static const int CXTypeNullability_NonNull = 0;
 
@@ -3687,7 +3687,7 @@
 
 /// List the possible error codes for clang_Type_getSizeOf,
 /// clang_Type_getAlignOf, clang_Type_getOffsetOf and clang_Cursor_getOffsetOf.
-class CXTypeLayoutError {
+abstract class CXTypeLayoutError {
   /// Type is of kind CXType_Invalid.
   static const int CXTypeLayoutError_Invalid = -1;
 
@@ -3707,7 +3707,7 @@
   static const int CXTypeLayoutError_Undeduced = -6;
 }
 
-class CXRefQualifierKind {
+abstract class CXRefQualifierKind {
   /// No ref-qualifier was provided.
   static const int CXRefQualifier_None = 0;
 
@@ -3720,7 +3720,7 @@
 
 /// Represents the C++ access control level to a base class for a cursor with
 /// kind CX_CXXBaseSpecifier.
-class CX_CXXAccessSpecifier {
+abstract class CX_CXXAccessSpecifier {
   static const int CX_CXXInvalidAccessSpecifier = 0;
   static const int CX_CXXPublic = 1;
   static const int CX_CXXProtected = 2;
@@ -3729,7 +3729,7 @@
 
 /// Represents the storage classes as declared in the source. CX_SC_Invalid was
 /// added for the case that the passed cursor in not a declaration.
-class CX_StorageClass {
+abstract class CX_StorageClass {
   static const int CX_SC_Invalid = 0;
   static const int CX_SC_None = 1;
   static const int CX_SC_Extern = 2;
@@ -3742,7 +3742,7 @@
 
 /// Describes how the traversal of the children of a particular cursor should
 /// proceed after visiting a particular child cursor.
-class CXChildVisitResult {
+abstract class CXChildVisitResult {
   /// Terminates the cursor traversal.
   static const int CXChildVisit_Break = 0;
 
@@ -3756,7 +3756,7 @@
 }
 
 /// Properties for the printing policy.
-class CXPrintingPolicyProperty {
+abstract class CXPrintingPolicyProperty {
   static const int CXPrintingPolicy_Indentation = 0;
   static const int CXPrintingPolicy_SuppressSpecifiers = 1;
   static const int CXPrintingPolicy_SuppressTagKeyword = 2;
@@ -3787,7 +3787,7 @@
 }
 
 /// Property attributes for a CXCursor_ObjCPropertyDecl.
-class CXObjCPropertyAttrKind {
+abstract class CXObjCPropertyAttrKind {
   static const int CXObjCPropertyAttr_noattr = 0;
   static const int CXObjCPropertyAttr_readonly = 1;
   static const int CXObjCPropertyAttr_getter = 2;
@@ -3806,7 +3806,7 @@
 
 /// 'Qualifiers' written next to the return and parameter types in Objective-C
 /// method declarations.
-class CXObjCDeclQualifierKind {
+abstract class CXObjCDeclQualifierKind {
   static const int CXObjCDeclQualifier_None = 0;
   static const int CXObjCDeclQualifier_In = 1;
   static const int CXObjCDeclQualifier_Inout = 2;
@@ -3816,7 +3816,7 @@
   static const int CXObjCDeclQualifier_Oneway = 32;
 }
 
-class CXNameRefFlags {
+abstract class CXNameRefFlags {
   /// Include the nested-name-specifier, e.g. Foo:: in x.Foo::y, in the range.
   static const int CXNameRange_WantQualifier = 1;
 
@@ -3829,7 +3829,7 @@
 }
 
 /// Describes a kind of token.
-class CXTokenKind {
+abstract class CXTokenKind {
   /// A token that contains some kind of punctuation.
   static const int CXToken_Punctuation = 0;
 
@@ -3928,7 +3928,7 @@
 }
 
 /// Describes a single piece of text within a code-completion string.
-class CXCompletionChunkKind {
+abstract class CXCompletionChunkKind {
   /// A code-completion string that describes "optional" text that could be a
   /// part of the template (but is not required).
   static const int CXCompletionChunk_Optional = 0;
@@ -4011,7 +4011,7 @@
 }
 
 /// Flags that can be passed to clang_codeCompleteAt() to modify its behavior.
-class CXCodeComplete_Flags {
+abstract class CXCodeComplete_Flags {
   /// Whether to include macros within the set of code completions returned.
   static const int CXCodeComplete_IncludeMacros = 1;
 
@@ -4035,7 +4035,7 @@
 }
 
 /// Bits that represent the context under which completion is occurring.
-class CXCompletionContext {
+abstract class CXCompletionContext {
   /// The context for completions is unexposed, as only Clang results should be
   /// included. (This is equivalent to having no context bits set.)
   static const int CXCompletionContext_Unexposed = 0;
@@ -4127,7 +4127,7 @@
   static const int CXCompletionContext_Unknown = 8388607;
 }
 
-class CXEvalResultKind {
+abstract class CXEvalResultKind {
   static const int CXEval_Int = 1;
   static const int CXEval_Float = 2;
   static const int CXEval_ObjCStrLiteral = 3;
@@ -4138,14 +4138,14 @@
 }
 
 /// @{
-class CXVisitorResult {
+abstract class CXVisitorResult {
   static const int CXVisit_Break = 0;
   static const int CXVisit_Continue = 1;
 }
 
 class CXCursorAndRangeVisitor extends ffi.Struct {}
 
-class CXResult {
+abstract class CXResult {
   /// Function returned successfully.
   static const int CXResult_Success = 0;
 
@@ -4217,7 +4217,7 @@
 /// Data for IndexerCallbacks#importedASTFile.
 class CXIdxImportedASTFileInfo extends ffi.Struct {}
 
-class CXIdxEntityKind {
+abstract class CXIdxEntityKind {
   static const int CXIdxEntity_Unexposed = 0;
   static const int CXIdxEntity_Typedef = 1;
   static const int CXIdxEntity_Function = 2;
@@ -4247,7 +4247,7 @@
   static const int CXIdxEntity_CXXInterface = 26;
 }
 
-class CXIdxEntityLanguage {
+abstract class CXIdxEntityLanguage {
   static const int CXIdxEntityLang_None = 0;
   static const int CXIdxEntityLang_C = 1;
   static const int CXIdxEntityLang_ObjC = 2;
@@ -4259,14 +4259,14 @@
 /// CXIdxEntity_Function CXIdxEntity_CXXClass CXIdxEntity_CXXStaticMethod
 /// CXIdxEntity_CXXInstanceMethod CXIdxEntity_CXXConstructor
 /// CXIdxEntity_CXXConversionFunction CXIdxEntity_CXXTypeAlias
-class CXIdxEntityCXXTemplateKind {
+abstract class CXIdxEntityCXXTemplateKind {
   static const int CXIdxEntity_NonTemplate = 0;
   static const int CXIdxEntity_Template = 1;
   static const int CXIdxEntity_TemplatePartialSpecialization = 2;
   static const int CXIdxEntity_TemplateSpecialization = 3;
 }
 
-class CXIdxAttrKind {
+abstract class CXIdxAttrKind {
   static const int CXIdxAttr_Unexposed = 0;
   static const int CXIdxAttr_IBAction = 1;
   static const int CXIdxAttr_IBOutlet = 2;
@@ -4281,13 +4281,13 @@
 
 class CXIdxIBOutletCollectionAttrInfo extends ffi.Struct {}
 
-class CXIdxDeclInfoFlags {
+abstract class CXIdxDeclInfoFlags {
   static const int CXIdxDeclFlag_Skipped = 1;
 }
 
 class CXIdxDeclInfo extends ffi.Struct {}
 
-class CXIdxObjCContainerKind {
+abstract class CXIdxObjCContainerKind {
   static const int CXIdxObjCContainer_ForwardRef = 0;
   static const int CXIdxObjCContainer_Interface = 1;
   static const int CXIdxObjCContainer_Implementation = 2;
@@ -4339,7 +4339,7 @@
 }
 
 /// Data for IndexerCallbacks#indexEntityReference.
-class CXIdxEntityRefKind {
+abstract class CXIdxEntityRefKind {
   /// The entity is referenced directly in user's code.
   static const int CXIdxEntityRef_Direct = 1;
 
@@ -4349,7 +4349,7 @@
 }
 
 /// Roles that are attributed to symbol occurrences.
-class CXSymbolRole {
+abstract class CXSymbolRole {
   static const int CXSymbolRole_None = 0;
   static const int CXSymbolRole_Declaration = 1;
   static const int CXSymbolRole_Definition = 2;
@@ -4392,7 +4392,7 @@
   ffi.Pointer<ffi.NativeFunction<_typedefC_10>> indexEntityReference;
 }
 
-class CXIndexOptFlags {
+abstract class CXIndexOptFlags {
   /// Used to indicate that no special indexing options are needed.
   static const int CXIndexOpt_None = 0;
 
diff --git a/test/large_integration_tests/large_test.dart b/test/large_integration_tests/large_test.dart
index a78d903..79d4a88 100644
--- a/test/large_integration_tests/large_test.dart
+++ b/test/large_integration_tests/large_test.dart
@@ -24,7 +24,6 @@
 ${strings.name}: LibClang
 ${strings.description}: Bindings to LibClang.
 ${strings.output}: unused
-${strings.libclang_dylib_folder}: tool/wrapped_libclang
 ${strings.compilerOpts}: -I${path.join('third_party', 'libclang', 'include')}
 ${strings.arrayWorkaround}: true
 ${strings.headers}:
@@ -66,7 +65,6 @@
 ${strings.description}: Bindings to Cjson.
 ${strings.output}: unused
 ${strings.comments}: full
-${strings.libclang_dylib_folder}: tool/wrapped_libclang
 ${strings.arrayWorkaround}: true
 ${strings.headers}:
   - third_party/cjson_library/cJSON.h
@@ -102,7 +100,6 @@
 ${strings.name}: SQLite
 ${strings.description}: Bindings to SQLite.
 ${strings.output}: unused
-${strings.libclang_dylib_folder}: tool/wrapped_libclang
 ${strings.arrayWorkaround}: true
 ${strings.comments}: full
 ${strings.headers}:
diff --git a/test/native_test/.gitignore b/test/native_test/.gitignore
new file mode 100644
index 0000000..d97e2fc
--- /dev/null
+++ b/test/native_test/.gitignore
@@ -0,0 +1,3 @@
+# Ignore files generated by clang on windows.
+native_test.exp
+native_test.lib
diff --git a/test/native_test/config.yaml b/test/native_test/config.yaml
index a25821a..479988d 100644
--- a/test/native_test/config.yaml
+++ b/test/native_test/config.yaml
@@ -7,7 +7,6 @@
 # ===============================================================
 
 output: 'native_test_bindings.dart'
-libclang-dylib-folder: '../../tool/wrapped_libclang'
 sort: true
 headers:
   - 'native_test.c'
diff --git a/test/prefix_tests/prefix_test.dart b/test/prefix_tests/prefix_test.dart
index dea22fc..abbe2b4 100644
--- a/test/prefix_tests/prefix_test.dart
+++ b/test/prefix_tests/prefix_test.dart
@@ -29,7 +29,7 @@
 ${strings.name}: 'NativeLibrary'
 ${strings.description}: 'Prefix Test'
 ${strings.output}: 'unused'
-${strings.libclang_dylib_folder}: 'tool/wrapped_libclang'
+
 ${strings.headers}:
   - 'test/prefix_tests/prefix.h'
 ${strings.headerFilter}:
diff --git a/tool/libclang_config.yaml b/tool/libclang_config.yaml
index fe10d98..aec3071 100644
--- a/tool/libclang_config.yaml
+++ b/tool/libclang_config.yaml
@@ -5,18 +5,17 @@
 # Config file for generating the libclang bindings used by this package.
 
 # ===================== GENERATING BINDINGS =====================
-#    cd to `tool`, and run -
-#    dart ../bin/ffigen.dart --config libclang_config.yaml
+#    cd to project's root, and run -
+#    pub run ffigen --config libclang_config.yaml
 # ===============================================================
 
 name: Clang
 description: Holds bindings to LibClang.
-output: '../lib/src/header_parser/clang_bindings/clang_bindings.dart'
-libclang-dylib-folder: 'wrapped_libclang'
+output: 'lib/src/header_parser/clang_bindings/clang_bindings.dart'
 sort: true
 compiler-opts: '-I/usr/lib/llvm-9/include/ -I/usr/lib/llvm-10/include/ -I/usr/local/opt/llvm/include/ -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ -Wno-nullability-completeness'
 headers:
-  - 'wrapped_libclang/wrapper.c'
+  - 'lib/src/clang_library/wrapper.c'
 header-filter:
   include:
     - wrapper.c
diff --git a/tool/wrapped_libclang/.gitignore b/tool/wrapped_libclang/.gitignore
deleted file mode 100644
index 2b64ac7..0000000
--- a/tool/wrapped_libclang/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-# general gitignore for CMake.
-CMakeLists.txt.user
-CMakeCache.txt
-CMakeFiles
-CMakeScripts
-Testing
-Makefile
-cmake_install.cmake
-install_manifest.txt
-compile_commands.json
-CTestTestfile.cmake
-_deps
diff --git a/tool/wrapped_libclang/build.dart b/tool/wrapped_libclang/build.dart
deleted file mode 100644
index 3e1eff4..0000000
--- a/tool/wrapped_libclang/build.dart
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (c) 2020, 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.
-
-/// =======================================================================
-/// =============== Build script to generate dyamic library ===============
-/// =======================================================================
-/// This Script effectively calls the following (but user can provide
-/// command line args which will replace the defaults shown below)-
-///
-/// Linux:
-/// ```
-/// clang -I/usr/lib/llvm-9/include/ -I/usr/lib/llvm-10/include/ -lclang -shared -fpic wrapper.c -o libwrapped_clang.so
-/// ```
-/// MacOS:
-/// ```
-/// clang -I/usr/local/opt/llvm/include/ -L/usr/local/opt/llvm/lib/ -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ -v -lclang -shared -fpic wrapper.c -o libwrapped_clang.dylib
-/// ```
-/// Windows:
-/// ```
-/// clang -IC:\Progra~1\LLVM\include -LC:\Progra~1\LLVM\lib -llibclang -shared wrapper.c -o wrapped_clang.dll -Wl,/DEF:wrapper.def
-/// del wrapped_clang.exp
-/// del wrapped_clang.lib
-/// ```
-/// =======================================================================
-/// =======================================================================
-/// =======================================================================
-
-import 'dart:io';
-import 'package:args/args.dart';
-import 'package:meta/meta.dart';
-
-const macOS = 'macos';
-const windows = 'windows';
-const linux = 'linux';
-
-/// Default platform options.
-Map<String, Options> platformOptions = {
-  linux: Options(
-    outputfilename: 'libwrapped_clang.so',
-    sharedFlag: '-shared',
-    inputHeader: 'wrapper.c',
-    fPIC: '-fpic',
-    ldLibFlag: '-lclang',
-    headerIncludes: [
-      '-I/usr/lib/llvm-9/include/',
-      '-I/usr/lib/llvm-10/include/',
-    ],
-  ),
-  windows: Options(
-    outputfilename: 'wrapped_clang.dll',
-    sharedFlag: '-shared',
-    inputHeader: 'wrapper.c',
-    moduleDefPath: '-Wl,/DEF:wrapper.def',
-    ldLibFlag: '-llibclang',
-    headerIncludes: [
-      r'-IC:\Progra~1\LLVM\include',
-    ],
-    libIncludes: [
-      r'-LC:\Progra~1\LLVM\lib',
-    ],
-  ),
-  macOS: Options(
-    outputfilename: 'libwrapped_clang.dylib',
-    sharedFlag: '-shared',
-    inputHeader: 'wrapper.c',
-    fPIC: '-fpic',
-    ldLibFlag: '-lclang',
-    headerIncludes: [
-      '-I/usr/local/opt/llvm/include/',
-      '-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/',
-    ],
-    libIncludes: [
-      '-L/usr/local/opt/llvm/lib/',
-    ],
-  ),
-};
-
-void main(List<String> arguments) {
-  print('Building Dynamic Library for libclang wrapper... ');
-  final options = getPlatformOptions();
-
-  // Updates header/lib includes in platform options.
-  changeIncludesUsingCmdArgs(arguments, options);
-
-  // Run clang compiler to generate the dynamic library.
-  final ProcessResult result = runClangProcess(options);
-  printSuccess(result, options);
-}
-
-/// Calls the clang compiler.
-ProcessResult runClangProcess(Options options) {
-  final result = Process.runSync(
-    'clang',
-    [
-      ...options.headerIncludes,
-      ...options.libIncludes,
-      options.ldLibFlag,
-      options.sharedFlag,
-      options.fPIC,
-      options.inputHeader,
-      '-o',
-      options.outputfilename,
-      options.moduleDefPath,
-      '-Wno-nullability-completeness',
-    ],
-  );
-  return result;
-}
-
-/// Prints success message (or process error if any).
-void printSuccess(ProcessResult result, Options options) {
-  print(result.stdout);
-  if ((result.stderr as String).isEmpty) {
-    print('Generated file: ${options.outputfilename}');
-  } else {
-    print(result.stderr);
-  }
-}
-
-ArgResults getArgResults(List<String> args) {
-  final parser = ArgParser(allowTrailingOptions: true);
-  parser.addSeparator(
-      'Build Script to generate dynamic library used by this package:');
-  parser.addMultiOption('include-header',
-      abbr: 'I', help: 'Path to header include directories');
-  parser.addMultiOption('include-lib',
-      abbr: 'L', help: 'Path to library include directories');
-  parser.addFlag(
-    'help',
-    abbr: 'h',
-    help: 'prints this usage',
-    negatable: false,
-  );
-
-  ArgResults results;
-  try {
-    results = parser.parse(args);
-
-    if (results.wasParsed('help')) {
-      print(parser.usage);
-      exit(0);
-    }
-  } catch (e) {
-    print(e);
-    print(parser.usage);
-    exit(1);
-  }
-
-  return results;
-}
-
-/// Use cmd args(if any) to change header/lib include paths.
-void changeIncludesUsingCmdArgs(List<String> arguments, Options options) {
-  final argResult = getArgResults(arguments);
-  if (argResult.wasParsed('include-header')) {
-    options.headerIncludes = (argResult['include-header'] as List<String>)
-        .map((header) => '-I$header')
-        .toList();
-  }
-  if (argResult.wasParsed('include-lib')) {
-    options.libIncludes = (argResult['include-lib'] as List<String>)
-        .map((lib) => '-L$lib')
-        .toList();
-  }
-}
-
-/// Get options based on current platform.
-Options getPlatformOptions() {
-  if (Platform.isMacOS) {
-    return platformOptions[macOS];
-  } else if (Platform.isWindows) {
-    return platformOptions[windows];
-  } else if (Platform.isLinux) {
-    return platformOptions[linux];
-  } else {
-    throw Exception('Unknown Platform.');
-  }
-}
-
-/// Hold options which would be passed to clang.
-class Options {
-  /// Name of dynamic library to generate.
-  final String outputfilename;
-
-  /// Tells compiler to generate a shared library.
-  final String sharedFlag;
-
-  /// Flag for generating Position Independant Code (Not used on windows).
-  final String fPIC;
-
-  /// Input file.
-  final String inputHeader;
-
-  /// Path to `.def` file containing symbols to export, windows use only.
-  final String moduleDefPath;
-
-  /// Path to header files.
-  List<String> headerIncludes;
-
-  /// Path to dynamic/static libraries
-  List<String> libIncludes;
-
-  /// Linker flag for linking to libclang.
-  final String ldLibFlag;
-
-  Options({
-    @required this.outputfilename,
-    @required this.sharedFlag,
-    @required this.inputHeader,
-    @required this.ldLibFlag,
-    this.headerIncludes = const [],
-    this.libIncludes = const [],
-    this.fPIC = '',
-    this.moduleDefPath = '',
-  });
-}