You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Jan 28, 2024. It is now read-only.
Copy file name to clipboardExpand all lines: lib/src/README.md
+3-28Lines changed: 3 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,34 +2,17 @@
2
2
## Table of Contents -
3
3
1.[Overview](#overview)
4
4
2.[LibClang](#LibClang)
5
-
1.[The Wrapper library](#The-Wrapper-library)
6
-
2.[Generation and Usage](#Generation-and-Usage)
7
-
3.[Bindings](#Bindings)
5
+
1.[Bindings](#Bindings)
8
6
3.[Scripts](#scripts)
9
7
1.[ffigen.dart](#ffigen.dart)
10
-
2.[setup.dart](#setup.dart)
11
8
4.[Components](#components)
12
9
1.[Config Provider](#Config-Provider)
13
10
2.[Header Parser](#Header-Parser)
14
11
3.[Code Generator](#Code-Generator)
15
12
# Overview
16
13
`package:ffigen` simplifies the process of generating `dart:ffi` bindings from C header files. It is simple to use, with the input being a small YAML config file. It requires LLVM (9+) to work. This document tries to give a complete overview of every component without going into too many details about every single class/file.
17
14
# LibClang
18
-
`package:ffigen` binds to LibClang using `dart:ffi` for parsing C header files. A wrapper library must be generated to use it, as `dart:ffi` currently [doesn't support structs by value](https://github.com/dart-lang/ffigen/issues/3).
19
-
## The Wrapper library
20
-
> Note: The wrapper is only needed because `dart:ffi` currently doesn't support Structs by value.
21
-
22
-
The `wrapper.c` file consists of functions that wrap LibClang functions. Most of them simply convert structs by value to pointers. Except -
23
-
-`clang_visitChildren_wrap` - The bindings for this function internally uses a **list** of **stack** for maintaining the supplied visitor functions. This is required because this function takes a function pointer which itself passes a struct by value. All this effort makes `clang_visitChildren_wrap` behave exactly like `clang_visitChildren`.
24
-
## Generation and Usage
25
-
The files needed for generating the wrapper are in `lib/src/clang_library`.
26
-
> The `wrapper.def` file is only needed on windows because the symbols are otherwise hidden.
27
-
28
-
The libclang wrapper can be _manually_ generated using `pub run ffigen:setup`. See [setup.dart](#setup.dart) for details.
29
-
30
-
The generated file is placed in the project's `.dart_tool/ffigen` folder, the file name also specifies the ffigen version (E.g - `_v0_2_4_libclang_wrapper.dylib`), this helps ensure the correct wrapper is being used for its corresponding version.
31
-
32
-
This dynamic library is then used by [Header Parser](#header-parser) for parsing C files.
15
+
`package:ffigen` binds to LibClang using `dart:ffi` for parsing C header files.
33
16
## Bindings
34
17
The config file for generating bindings is `tool/libclang_config.yaml`. The bindings are generated to `lib/src/header_parser/clang_bindings/clang_bindings.dart`. These are used by [Header Parser](#header-parser) for calling libclang functions.
35
18
# Scripts
@@ -38,19 +21,11 @@ This is the main entry point for the user- `pub run ffigen`.
38
21
- Command-line options:
39
22
-`--verbose`: Sets log level.
40
23
-`--config`: Specifies a config file.
41
-
-`ffigen.dart` will first check if a dynamic library already exists and is up to date. If not, it tries to auto-create it. If that fails, user must excplicitly call [setup.dart](#setup.dart).
42
24
- The internal modules are called by `ffigen.dart` in the following way:
25
+
-`ffigen.dart` will try to find dynamic library in default locations. If that fails, the user must excplicitly specify location in ffigen's config under the key `llvm-lib`.
43
26
- It first creates a `Config` object from an input Yaml file. This is used by other modules.
44
27
- The `parse` method is then invoked to generate a `Library` object.
45
28
- Finally, the code is generated from the `Library` object to the specified file.
46
-
## setup.dart
47
-
Used to generate the wrapper dynamic library. Users will need to explicitly call this if `pub run ffigen` is unable to auto-create the dynamic library.
48
-
> `clang` must be on user's path for `setup.dart` to work.
49
-
50
-
- Command-line options:
51
-
-`-I`: Specifies header includes.
52
-
-`-L`: Specifies library includes.
53
-
-`setup.dart` generates the dynamic library to the project's `.dart_tool/ffigen` folder using `clang`.
54
29
# Components
55
30
## Config Provider
56
31
The Config Provider holds all the configurations required by other modules.
0 commit comments