mirror of
https://github.com/mappu/miqt.git
synced 2025-01-21 06:00:38 +00:00
5cbbec5619
Blocked methods are the source of many gaps in the binding - in particular, they block qt_metacall/activate/etc that is necessary for implementing meta-object support. This change makes them visible in logs and also removes log timestamps so that logs from two runs easily can be diffed.
genbindings
The genbindings
program regenerates the Qt bindings.
Architecture design
Bindings are generated in two passes:
Pass 1
- Scan input directory for header files.
- For each header file:
- 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. - Strip all Clang AST nodes that were included from other files, to only consider the header's own definitions.
- This is somewhat slow, the results will be cached in
- Convert Clang AST to our own intermediate representation.
- Run some transformations on the intermediate representation.
- Cache and collect the global state of all known class names, enum names, and typedefs.
Pass 2
- For each intermediate-representation AST:
- Emit "CABI" cpp/h pair.
- 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.
- Emit Go binding file.
- The Go binding uses CGO to call into the CABI binding.
Configuration
It's tested to work on with Debian 12 with system packages (Qt 5.15 / Qt 6.4 / Clang 14 / GCC 12).
You should check the following configuration:
config-libraries.go
: Input directories containing Qt headersconfig-allowlist.go
: Check everything
Steps to add extra libraries to MIQT
- Git clone this repository
- In
docker/genbindings.Dockerfile
, add your library's headers and pkg-config file.- If your library does not include a pkg-config file, you must create one.
- Patch
cmd/genbindings/config-libraries.go
to add a newgenerate
block for your target library - Run
genbindings
to regenerate all bindings- The first run must populate clang ASTs into a cache directory and may be slower, but it is fast afterwards
- Add a
cflags.go
file to the generated binding directory- It should have a
#cgo pkg-config: LibraryName
stanza and any extra flags (e.g.--std=c++17
) that are required but not system-specific
- It should have a
- Try to use the new binding within the repo, by adding an example in the
examples/libraries
directory - Commit the generated bindings
- You can then use your forked MIQT repo with
replace
insidego.mod
- Or, open a Pull Request to add the library to MIQT
- You can then use your forked MIQT repo with