From 7f84b8a67e7271a5071f1f6ad87fe625f2967ce5 Mon Sep 17 00:00:00 2001 From: Aleksei Bavshin Date: Thu, 24 Feb 2022 20:47:08 -0800 Subject: [PATCH] Initial import (#2028895) --- .gitignore | 3 + LICENSE.upstream | 21 ++++ ...ust-regenerate-bindings-during-build.patch | 109 ++++++++++++++++++ rust-tree-sitter.spec | 96 +++++++++++++++ sources | 1 + 5 files changed, 230 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.upstream create mode 100644 binding_rust-regenerate-bindings-during-build.patch create mode 100644 rust-tree-sitter.spec create mode 100644 sources diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e13678 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.crate +*.src.rpm +results_*/ diff --git a/LICENSE.upstream b/LICENSE.upstream new file mode 100644 index 0000000..4c22002 --- /dev/null +++ b/LICENSE.upstream @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018-2021 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/binding_rust-regenerate-bindings-during-build.patch b/binding_rust-regenerate-bindings-during-build.patch new file mode 100644 index 0000000..e9e8129 --- /dev/null +++ b/binding_rust-regenerate-bindings-during-build.patch @@ -0,0 +1,109 @@ +From 545f8b98b8f614869e5e836c5a05091dfd5472c6 Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Sun, 5 Dec 2021 16:08:59 -0800 +Subject: [PATCH] binding_rust: generate bindings during build + +Bindgen output is platform- and architecture-dependent. Pre-generated +bindings may cause issues on the machines different from the one used +for generating the code. + +The recommended way[1] to use bindgen is to invoke it from `build.rs`. + +[1]: https://rust-lang.github.io/rust-bindgen/library-usage.html +--- + Cargo.lock | 155 +++++++++++++++++++++++++++++++++++++- + lib/Cargo.toml | 1 + + lib/binding_rust/build.rs | 24 ++++++ + lib/binding_rust/ffi.rs | 2 +- + lib/binding_rust/lib.rs | 5 +- + 5 files changed, 183 insertions(+), 4 deletions(-) + +diff --git a/Cargo.toml b/Cargo.toml +index ed173fdf7..3ab8f52b7 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -31,5 +31,7 @@ + + [dependencies.regex] + version = "1" ++[build-dependencies.bindgen] ++version = "0.59.1" + [build-dependencies.cc] + version = "^1.0.58" +diff --git a/binding_rust/build.rs b/binding_rust/build.rs +index 5798cde3..34736b53 100644 +--- a/binding_rust/build.rs ++++ b/binding_rust/build.rs +@@ -1,6 +1,28 @@ + use std::path::{Path, PathBuf}; + use std::{env, fs}; + ++fn generate_bindings() { ++ const HEADER_FILE: &'static str = "include/tree_sitter/api.h"; ++ ++ println!("cargo:rerun-if-changed={}", HEADER_FILE); ++ let bindings = bindgen::Builder::default() ++ .header(HEADER_FILE) ++ .layout_tests(false) ++ .allowlist_type("^TS.*") ++ .allowlist_function("^ts_.*") ++ .allowlist_var("^TREE_SITTER.*") ++ .blocklist_function("ts_tree_print_dot_graph") ++ .opaque_type("FILE") ++ .size_t_is_usize(true) ++ .generate() ++ .expect("Unable to generate bindings"); ++ ++ let output = PathBuf::from(env::var("OUT_DIR").unwrap()); ++ bindings ++ .write_to_file(output.join("bindings.rs")) ++ .expect("Unable to write bindings"); ++} ++ + fn main() { + println!("cargo:rerun-if-env-changed=TREE_SITTER_STATIC_ANALYSIS"); + if env::var("TREE_SITTER_STATIC_ANALYSIS").is_ok() { +@@ -17,6 +39,8 @@ fn main() { + } + } + ++ generate_bindings(); ++ + let src_path = Path::new("src"); + for entry in fs::read_dir(&src_path).unwrap() { + let entry = entry.unwrap(); +diff --git a/binding_rust/ffi.rs b/binding_rust/ffi.rs +index 685ed765..5cf93180 100644 +--- a/binding_rust/ffi.rs ++++ b/binding_rust/ffi.rs +@@ -2,7 +2,7 @@ + #![allow(non_upper_case_globals)] + #![allow(non_camel_case_types)] + +-include!("./bindings.rs"); ++include!(concat!(env!("OUT_DIR"),"/bindings.rs")); + + extern "C" { + pub(crate) fn dup(fd: std::os::raw::c_int) -> std::os::raw::c_int; +diff --git a/binding_rust/lib.rs b/binding_rust/lib.rs +index cf8437b8..35205cee 100644 +--- a/binding_rust/lib.rs ++++ b/binding_rust/lib.rs +@@ -25,11 +25,12 @@ use std::{ + /// assigned an ABI version number that corresponds to the current CLI version. + /// The Tree-sitter library is generally backwards-compatible with languages + /// generated using older CLI versions, but is not forwards-compatible. +-pub const LANGUAGE_VERSION: usize = ffi::TREE_SITTER_LANGUAGE_VERSION; ++pub const LANGUAGE_VERSION: usize = ffi::TREE_SITTER_LANGUAGE_VERSION as usize; + + /// The earliest ABI version that is supported by the current version of the + /// library. +-pub const MIN_COMPATIBLE_LANGUAGE_VERSION: usize = ffi::TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION; ++pub const MIN_COMPATIBLE_LANGUAGE_VERSION: usize = ++ ffi::TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION as usize; + + pub const PARSER_HEADER: &'static str = include_str!("../include/tree_sitter/parser.h"); + +-- +2.33.1 + diff --git a/rust-tree-sitter.spec b/rust-tree-sitter.spec new file mode 100644 index 0000000..8de80bd --- /dev/null +++ b/rust-tree-sitter.spec @@ -0,0 +1,96 @@ +# Generated by rust2rpm 21 +%bcond_without check +%global debug_package %{nil} + +%global crate tree-sitter + +Name: rust-%{crate} +Version: 0.20.2 +Release: %autorelease +Summary: Rust bindings to the Tree-sitter parsing library + +# Upstream license specification: MIT +# Bundled ICU sources: Unicode +License: MIT and Unicode +URL: https://crates.io/crates/tree-sitter +Source: %{crates_source} +# Upstream license file - tree-sitter/tree-sitter#1520 +Source1: https://github.com/tree-sitter/tree-sitter/raw/v%{version}/LICENSE#/LICENSE.upstream +# tree-sitter/tree-sitter#1524 modified to apply to the crate source +Patch0: binding_rust-regenerate-bindings-during-build.patch + +ExclusiveArch: %{rust_arches} + +BuildRequires: rust-packaging >= 21 + +%global _description %{expand: +Rust bindings to the Tree-sitter parsing library.} + +%description %{_description} + +%package devel +Summary: %{summary} +BuildArch: noarch +# The create contains a bundled copy of the tree-sitter C library. +Provides: bundled(tree-sitter) = %{version} +# The tree-sitter C library contains a small subset of files from the ICU library +Provides: bundled(icu) = 65.1 + +%description devel %{_description} + +This package contains library source intended for building other packages which +use the "%{crate}" crate. + +%files devel +%license %{crate_instdir}/LICENSE +%license %{crate_instdir}/src/unicode/LICENSE +%{crate_instdir}/ + +%package -n %{name}+default-devel +Summary: %{summary} +BuildArch: noarch + +%description -n %{name}+default-devel %{_description} + +This package contains library source intended for building other packages which +use the "default" feature of the "%{crate}" crate. + +%files -n %{name}+default-devel +%ghost %{crate_instdir}/Cargo.toml + +%package -n %{name}+lazy_static-devel +Summary: %{summary} +BuildArch: noarch + +%description -n %{name}+lazy_static-devel %{_description} + +This package contains library source intended for building other packages which +use the "lazy_static" feature of the "%{crate}" crate. + +%files -n %{name}+lazy_static-devel +%ghost %{crate_instdir}/Cargo.toml + +%prep +%autosetup -n %{crate}-%{version_no_tilde} -p1 +%cargo_prep +# drop pre-generated bindings; we don't want to accidentally use these +rm -f binding_rust/bindings.rs + +%generate_buildrequires +%cargo_generate_buildrequires + +%build +%cargo_build + +%install +%cargo_install +# prepare upstream license file for %%license +install -D -m 0644 -pv %{SOURCE1} %{buildroot}%{crate_instdir}/LICENSE + +%if %{with check} +%check +%cargo_test +%endif + +%changelog +%autochangelog diff --git a/sources b/sources new file mode 100644 index 0000000..1496289 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (tree-sitter-0.20.2.crate) = 498a6a8add5c79d81add11af76b679322150ab87fb55171aeeaf279b44841ac9afb0ddfe3edb10f67979dacb7c37a1039a32ac4e516270e57e28fb1c020bd284