From 105b0ba52ce64e85eb2d6f09f5fe3ad508adeafb Mon Sep 17 00:00:00 2001 From: Gregor Date: Wed, 21 Aug 2019 20:59:37 +0200 Subject: [PATCH] Add build instruction to rust binding README (#432) Fixes #431 --- lib/binding_rust/README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/binding_rust/README.md b/lib/binding_rust/README.md index 1ee51e2d..6a7bfc70 100644 --- a/lib/binding_rust/README.md +++ b/lib/binding_rust/README.md @@ -19,7 +19,24 @@ use tree_sitter::{Parser, Language}; let mut parser = Parser::new(); ``` -Then assign a language to the parser. Tree-sitter languages consist of generated C code. To use them from rust, you must declare them as `extern "C"` functions and invoke them with `unsafe`: +Tree-sitter languages consist of generated C code. To make sure they're properly compiled and linked, you can create a [build script](https://doc.rust-lang.org/cargo/reference/build-scripts.html) like the following (assuming `tree-sitter-javascript` is in your root directory): +```rust +extern crate cc; + +use std::path::PathBuf; + +fn main() { + let dir: PathBuf = ["tree-sitter-javascript", "src"].iter().collect(); + + cc::Build::new() + .include(&dir) + .file(dir.join("parser.c")) + .file(dir.join("scanner.c")) + .compile("tree-sitter-javascript"); +} +``` + +To then use languages from rust, you must declare them as `extern "C"` functions and invoke them with `unsafe`. Then you can assign them to the parser. ```rust extern "C" { fn tree_sitter_c() -> Language; }