2024-08-25 04:06:16 +00:00
|
|
|
# genbindings
|
|
|
|
|
2024-08-26 10:45:11 +00:00
|
|
|
The `genbindings` program regenerates the Qt bindings.
|
2024-08-25 04:06:16 +00:00
|
|
|
|
2024-08-26 10:45:11 +00:00
|
|
|
## Architecture design
|
2024-08-25 04:06:16 +00:00
|
|
|
|
2024-08-26 10:45:11 +00:00
|
|
|
Bindings are generated in two passes:
|
|
|
|
|
|
|
|
Pass 1
|
2024-08-25 04:06:16 +00:00
|
|
|
|
|
|
|
1. Scan input directory for header files.
|
|
|
|
2. For each header file:
|
|
|
|
3. Run `clang --ast-dump=json` to get a JSON ast.
|
|
|
|
- This is somewhat slow, the results will be cached in `./cachedir` after the first run.
|
2024-08-26 10:45:11 +00:00
|
|
|
- Strip all Clang AST nodes that were included from other files, to only consider the header's own definitions.
|
2024-08-25 04:06:16 +00:00
|
|
|
4. Convert Clang AST to our own intermediate representation.
|
2024-08-26 10:45:11 +00:00
|
|
|
5. Run some transformations on the intermediate representation.
|
|
|
|
6. Cache and collect the global state of all known class names, enum names, and typedefs.
|
|
|
|
|
|
|
|
Pass 2
|
|
|
|
|
|
|
|
1. For each intermediate-representation AST:
|
|
|
|
2. Emit "CABI" cpp/h pair.
|
2024-08-25 04:06:16 +00:00
|
|
|
- The CABI is a projection of Qt into plain C. The translation unit itself is C++, but the header can be used as extern c.
|
2024-08-26 10:45:11 +00:00
|
|
|
3. Emit Go binding file.
|
|
|
|
- The Go binding uses CGO to call into the CABI binding.
|
2024-08-25 04:06:16 +00:00
|
|
|
|
|
|
|
## Configuration
|
|
|
|
|
2024-10-22 05:45:29 +00:00
|
|
|
It's tested to work on with Debian 12 with system packages (Qt 5.15 / Qt 6.4 / Clang 14 / GCC 12).
|
2024-08-25 04:06:16 +00:00
|
|
|
|
|
|
|
You should check the following configuration:
|
|
|
|
|
2024-10-20 06:09:16 +00:00
|
|
|
- `config-libraries.go`: Input directories containing Qt headers
|
|
|
|
- `config-allowlist.go`: Check everything
|