miqt/cmd/genbindings/README.md

36 lines
1.2 KiB
Markdown
Raw Normal View History

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
It's tested to work on with Debian 12 / Qt 5.15 / Clang 14 / GCC 12.
You should check the following configuration:
- `config-libraries.go`: Input directories containing Qt headers
- `config-allowlist.go`: Check everything