Rust: Generieren eines C-Headers zulassen, der die exportierten Symbole einer Bibliothek darstellt

Erstellt am 17. Nov. 2013  ·  11Kommentare  ·  Quelle: rust-lang/rust

Beispielsweise,

#[crate_type="lib"];

pub struct Foo { x: i16 }

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

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

entsprechen würde

#ifndef FILENAME_H
#define FILENAME_H

#include<stdint.h>

struct Foo {
    int16_t x;
}

struct Foo bar(uint64_t);

#endif

damit man von C aus leichter in Rust anrufen kann.

(Dies ist die umgekehrte Operation der vorgeschlagenen #[header="stdio.h"] mod stdio; -Funktionalität für die Verwendung von libclang zum Einlesen von C-Headern in eine Form, die rustc versteht: https://github.com/mozilla/rust/issues/2124)

A-ffi C-enhancement

Hilfreichster Kommentar

Ich bin mir sicher, dass es jeder hier bereits weiß, aber der Stand der Technik hier scheint rusty-cheddar zu sein: https://github.com/Sean1708/rusty-cheddar

Alle 11 Kommentare

In diesem Sinne habe ich gehört, dass es schön wäre, ein rust.h für Dinge zu haben wie:

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

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

Und andere nützliche Compiler-Definitionen.

Ein schwieriger Teil dabei wäre die C-Darstellung von FFI-Typen, es wäre wirklich nett, mit ihnen von C aus interagieren zu können, aber unsere Optimierungen werden Nullable-Zeiger und diskriminierende Größe können sie erschweren.

:+1:

Ich habe eine Version davon unter https://gist.github.com/alexcrichton/4ea33d9a8b19ed15a65a gestartet, aber es ist nur die grundlegende Infrastruktur, um so etwas zum Laufen zu bringen.

@alexcrichton Das ist ziemlich cool. Möglicherweise möchten Sie sich an die Verwendung der stdint.h -Typedefs zum Drucken der Integer-Typen halten, da die Breite variieren kann und die Signiertheit von char implementierungsdefiniert ist.

/cc mich

bindgen macht einiges davon, aber rust.h wäre sicher schön für FFIing in Rust

BEARBEITEN: Hoppla, ich dachte, bindgen hätte beides getan, aber das tut es nicht, danke @huonw

(Offtopic, irgendwie: Bindgen war nicht einmal eine richtige Rust-Kiste, als ich das letzte Mal nachgesehen habe, und es auf Debian zu bauen, war so mühsam, dass ich einen anderen Weg für meine FFI-Bedürfnisse wählen musste. Der Wunsch, Bindgen-ähnlich zu haben Die Funktionalität in Rust ist meiner Meinung nach in erster Linie der Wunsch, es überall verfügbar zu haben, und es könnte damit zufrieden sein, dass bindgen als richtiges Cargo- dev-dependencies -Paket funktioniert, das die Rust-Stubs aus einem C-Header vollständig aus build.rs generieren kann

Ich habe einige WIP-Sachen hier. https://github.com/tomjakubowski/custard/tree/dev Ich denke, als ich es zuletzt verlassen habe, war es möglicherweise mitten in einer Umgestaltung.

Es folgt der gleichen Idee wie rustdoc: Gehen Sie den typisierten AST durch, filtern Sie Dinge heraus, die das Tool interessiert, bereinigen Sie die Typen ein wenig und geben Sie etwas aus (eine Header-Datei). Ganz ehrlich, es könnte sinnvoll sein, dies zu einem Rustdoc-'Backend' oder so zu machen (wenn Sie die Augen zusammenkneifen, eine Header-Datei ist nur eine andere Art von Dokumentation).

Ich bin mir sicher, dass es jeder hier bereits weiß, aber der Stand der Technik hier scheint rusty-cheddar zu sein: https://github.com/Sean1708/rusty-cheddar

Rusty-Cheddar und Rusty-Binder sind heutzutage nicht sehr aktiv. Sollte dies ein Feature sein, das für Rust wichtig genug ist, um von rust-lang-nursery oder so gepflegt zu werden? @alexcrichton

Schließen; Dies sollte durch ein externes Tool angegangen werden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen