Rust: Izinkan menghasilkan header C yang mewakili simbol yang diekspor dari lib

Dibuat pada 17 Nov 2013  ·  11Komentar  ·  Sumber: rust-lang/rust

Sebagai contoh,

#[crate_type="lib"];

pub struct Foo { x: i16 }

#[no_mangle]
pub extern "C" fn bar(x: u64) -> Foo { ... }

pub fn ignored() { ... } // wrong ABI

akan sesuai dengan

#ifndef FILENAME_H
#define FILENAME_H

#include<stdint.h>

struct Foo {
    int16_t x;
}

struct Foo bar(uint64_t);

#endif

sehingga seseorang dapat memanggil Rust dari C dengan lebih mudah.

(Ini adalah operasi kebalikan dari fungsionalitas #[header="stdio.h"] mod stdio; diusulkan untuk menggunakan libclang untuk membaca header C ke dalam bentuk yang dipahami rustc: https://github.com/mozilla/rust/issues/2124)

A-ffi C-enhancement

Komentar yang paling membantu

Saya yakin semua orang di sini sudah sadar, tetapi keadaan seni di sini tampaknya berkarat-cheddar: https://github.com/Sean1708/rusty-cheddar

Semua 11 komentar

Sejalan dengan ini, saya pernah mendengar bahwa memiliki rust.h akan menyenangkan untuk dimiliki untuk hal-hal seperti:

typedef struct {
  void *data;
  uintptr_t len;
} RustSlice;

typedef struct {
  uintptr_t len;
  uintptr_t alloc;
  uint8_t data[0];
} RustString;

Dan definisi kompiler berguna lainnya.

Satu bagian yang sulit tentang ini adalah representasi C dari tipe FFI, akan sangat menyenangkan untuk dapat berinteraksi dengan mereka dari C, tetapi optimasi kami akan nullable pointer dan ukuran diskriminan dapat membuat mereka sulit.

:+1:

Saya memulai versi ini di https://Gist.github.com/alexcrichton/4ea33d9a8b19ed15a65a , tetapi ini hanya infrastruktur tulang telanjang untuk menjalankan dan menjalankan sesuatu seperti ini.

@alexcrichton Itu cukup keren. Anda mungkin ingin tetap menggunakan stdint.h typedefs untuk mencetak tipe integer, karena lebarnya dapat bervariasi dan penandatanganan char adalah implementasi yang ditentukan.

/cc saya

bindgen melakukan beberapa dari ini, tetapi rust.h pasti menyenangkan untuk FFI ke Rust

EDIT: ups, saya pikir bindgen melakukan keduanya, tetapi tidak, terima kasih @huonw

(Offtopic, jenis: Bindgen bahkan bukan peti Rust yang tepat, terakhir kali saya memeriksa, dan membangunnya di Debian cukup merepotkan sehingga saya harus memilih rute lain untuk kebutuhan FFI saya. Keinginan untuk memiliki bindgen-like fungsionalitas di Rust, saya pikir, terutama adalah keinginan untuk tersedia di mana-mana. Itu bisa dipenuhi dengan bindgen yang berfungsi sebagai paket Cargo dev-dependencies yang tepat yang dapat menghasilkan rintisan Rust dari header C sepenuhnya dari build.rs ). UPS. Itu adalah kata-kata kasar. : }

Saya punya beberapa barang WIP di sini. https://github.com/tomjakubowski/custard/tree/dev Saya pikir terakhir saya meninggalkannya, mungkin di tengah-tengah refactor.

Ini mengikuti ide yang sama seperti rustdoc: jalankan AST yang diketik, saring hal-hal yang dipedulikan alat, bersihkan jenisnya sedikit, dan pancarkan sesuatu (file header). Sejujurnya, mungkin masuk akal untuk menjadikan ini sebagai 'backend' rustdoc atau sesuatu (jika Anda menyipitkan mata, file header hanyalah jenis dokumentasi lain).

Saya yakin semua orang di sini sudah sadar, tetapi keadaan seni di sini tampaknya berkarat-cheddar: https://github.com/Sean1708/rusty-cheddar

rusty-cheddar dan rusty-binder tidak terlalu aktif saat itu. Haruskah ini menjadi fitur yang cukup penting bagi Rust untuk dipertahankan oleh rust-lang-nursery atau semacamnya? @alexcrichton

Penutupan; ini harus ditangani oleh alat eksternal.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat