Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/suirad/zig-header-gen

Automatically generate headers/bindings for other languages from Zig code
https://github.com/suirad/zig-header-gen

binding-generator build c comptime cpp golang header-generator nim python rust zig zig-library

Last synced: 3 months ago
JSON representation

Automatically generate headers/bindings for other languages from Zig code

Awesome Lists containing this project

README

        

# HeaderGen

`HeaderGen` automatically generates headers/bindings for other languages given
Zig code with exported functions/types

Here are the following supported language binding outputs:

- [x] C Bindings
- [x] Python Bindings
- [ ] Rust Bindings
- [ ] Go Bindings
- [ ] Nim Bindings

Here are the following supported Zig language features:

- [x] Extern Functions
- [x] Extern Structs
- [x] Extern Unions
- [x] Extern Enums

## Getting started

Given the following Zig code as the file `src/fancylib.zig` and using the C generator:

```zig
const std = @import("std");

export fn print_msg(msg_ptr: ?[*]const u8, len: usize) bool {
if (msg_ptr) |raw_msg| {
const msg = raw_msg[0 .. len - 1];
std.debug.print("Msg is: {}", .{msg});
return true;
}
return false;
}

const Internal = struct {
a: u64,
};

const External = extern struct {
b: u64,
c: [100]u8,
};

export fn use_internal_and_external(i: ?*Internal, e: ?*External) void {
// do things...
}
```

You will receive the following C header in `headers/fancylib.h`:

```c
#ifndef _fancylib_H

#define _fancylib_H
#include
#include
#include

typedef struct External {
uint64_t b;
uint8_t c[100];
} External_t;

bool print_msg(uint8_t* arg0, size_t arg1);

void use_internal_and_external(void* arg0, External_t* arg1);

#endif
```

## Usage Notes

- Copy from this repo `header_gen.zig` and the folder `generators`;
drop them next to your `build.zig`
- See the `build.zig` in this repo for an example of integration