Accepting request 1161444 from editors
OBS-URL: https://build.opensuse.org/request/show/1161444 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/tree-sitter?expand=0&rev=10
This commit is contained in:
commit
c7748fe0d2
23
_service
23
_service
@ -1,25 +1,8 @@
|
||||
<services>
|
||||
<!--service mode="disabled" name="obs_scm">
|
||||
<param name="url">https://github.com/tree-sitter/tree-sitter</param>
|
||||
<param name="versionformat">@PARENT_TAG@</param>
|
||||
<param name="scm">git</param>
|
||||
<param name="revision">b268e41</param>
|
||||
<param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param>
|
||||
<param name="versionrewrite-replacement">\1</param>
|
||||
<param name="changesgenerate">enable</param>
|
||||
<param name="changesauthor">socvirnyl.estela@gmail.com</param>
|
||||
</service>
|
||||
<service mode="disabled" name="tar" />
|
||||
<service mode="disabled" name="recompress">
|
||||
<param name="file">*.tar</param>
|
||||
<param name="compression">xz</param>
|
||||
</service>
|
||||
<service mode="disabled" name="set_version"/-->
|
||||
<service name="cargo_vendor" mode="disabled">
|
||||
<service name="download_files" mode="manual" />
|
||||
<service name="cargo_vendor" mode="manual">
|
||||
<param name="srctar">tree-sitter-*.tar.xz</param>
|
||||
<param name="compression">xz</param>
|
||||
<param name="update">true</param>
|
||||
</service>
|
||||
<service name="cargo_audit" mode="disabled">
|
||||
</service>
|
||||
<service name="cargo_audit" mode="manual" />
|
||||
</services>
|
||||
|
@ -1,5 +0,0 @@
|
||||
[source.crates-io]
|
||||
replace-with = "vendored-sources"
|
||||
|
||||
[source.vendored-sources]
|
||||
directory = "vendor"
|
64
compile-macros.sh
Normal file
64
compile-macros.sh
Normal file
@ -0,0 +1,64 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# SPDX-FileCopyrightText: 2024 Björn Bidar
|
||||
# based of compile-macros.sh from python-rpm-macros
|
||||
mkdir -p macros
|
||||
|
||||
### Lua: generate automagic from macros.in and macros.lua
|
||||
(
|
||||
# copy macros.in up to LUA-MACROS
|
||||
sed -n -e '1,/^### LUA-MACROS ###$/p' macros.in
|
||||
|
||||
# include "functions.lua", without empty lines, as %_treesitter_definitions
|
||||
echo "%_treesitter_definitions %{lua:"
|
||||
sed -n -r \
|
||||
-e 's/\\/\\\\/g' \
|
||||
-e '/^.+$/p' \
|
||||
functions.lua
|
||||
echo "}"
|
||||
|
||||
INFUNC=0
|
||||
INMULTILINE_MACRO=0
|
||||
# brute line-by-line read of macros.lua
|
||||
IFS=""
|
||||
while read -r line; do
|
||||
if [ $INFUNC = 0 ] ; then
|
||||
if [ $INMULTILINE_MACRO = 1 ] ;then
|
||||
if echo "$line" | grep -qE '^.*\]\]' ; then
|
||||
INMULTILINE_MACRO=0
|
||||
fi
|
||||
echo "# $line"
|
||||
elif echo "$line" | grep -qE -- '--\[\[' ; then
|
||||
INMULTILINE_MACRO=1
|
||||
echo "# $line"
|
||||
elif echo "$line" | grep -qE -- '^--' ; then
|
||||
echo "# $line"
|
||||
elif echo "$line" | grep -q '^function '; then
|
||||
# entering top-level Lua function
|
||||
INFUNC=1;
|
||||
echo "$line" | sed -r -e 's/^function (.*)\((.*)\)$/%\1(\2) %{lua: \\/'
|
||||
else
|
||||
# outside function, copy
|
||||
# (usually this is newline)
|
||||
echo "$line"
|
||||
fi
|
||||
else
|
||||
if [ "$line" = "end" ]; then
|
||||
# leaving top-level Lua function
|
||||
INFUNC=0;
|
||||
echo '}'
|
||||
elif [ $INFUNC = 1 ]; then
|
||||
# inside function
|
||||
# double backslashes and add backslash to end of line
|
||||
echo "$line" | sed -e 's/\\/\\\\/g' -e 's/$/\\/'
|
||||
fi
|
||||
fi
|
||||
done < macros.lua
|
||||
|
||||
# copy rest of macros.in
|
||||
sed -n -e '/^### LUA-MACROS ###$/,$p' macros.in
|
||||
) > macros/050-automagic
|
||||
|
||||
|
||||
### final step: cat macros/*, but with files separated by additional newlines
|
||||
sed -e '$s/$/\n/' -s macros/* > macros.treesitter
|
45
functions.lua
Normal file
45
functions.lua
Normal file
@ -0,0 +1,45 @@
|
||||
--[[
|
||||
SPDX-License-Identifier: GPL-2.0
|
||||
SPDX-FileCopyrightText: 2024 Björn Bidar
|
||||
|
||||
partly based of functions.lua from python-rpm-macros
|
||||
--]]
|
||||
|
||||
-- declare common functions
|
||||
function string.startswith(str, prefix)
|
||||
return str:sub(1, prefix:len()) == prefix
|
||||
end
|
||||
|
||||
function string.endswith(str, suffix)
|
||||
return str:sub(-suffix:len()) == suffix
|
||||
end
|
||||
|
||||
function string.dirname(str)
|
||||
if str:match("(.*)/") == "" then
|
||||
return nil
|
||||
else
|
||||
return str:match("(.*)/")
|
||||
end
|
||||
end
|
||||
|
||||
function string.basename(str)
|
||||
while true do
|
||||
local idx = str:find("/")
|
||||
if not idx then return str end
|
||||
str = str:sub(idx + 1)
|
||||
end
|
||||
end
|
||||
|
||||
function string.split(str, sep)
|
||||
if sep == nil then
|
||||
sep = '%s'
|
||||
end
|
||||
|
||||
local res = {}
|
||||
local func = function(w)
|
||||
table.insert(res, w)
|
||||
end
|
||||
|
||||
string.gsub(str, '[^'..sep..']+', func)
|
||||
return res
|
||||
end
|
26
macros.in
Normal file
26
macros.in
Normal file
@ -0,0 +1,26 @@
|
||||
# -*- rpm-spec -*-
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# SPDX-FileCopyrightText: 2024 Björn Bidar
|
||||
%_treesitter_base_name tree-sitter
|
||||
%_treesitter_grammardir %{_libdir}
|
||||
%_treesitter_grammar_develdir %{_includedir}/%{_treesitter_base_name}/grammars
|
||||
%_treesitter_grammar_base_libname lib%{_treesitter_base_name}
|
||||
%treesitter_target() %{_rpmconfigdir}/tree-sitter-target.py
|
||||
%treesitter_set_flags export NODE_PATH=$NODE_PATH:%{_treesitter_grammar_develdir}:$PWD
|
||||
|
||||
%__treesitter_devel_package_name() %name-devel
|
||||
%treesitter_devel_package \
|
||||
%package -n %{__treesitter_devel_package_name} \
|
||||
Summary: Devel package for %{name} containing it's grammar source \
|
||||
BuildArch: noarch \
|
||||
%{_treesitter_devel_provides} \
|
||||
%description -n %{__treesitter_devel_package_name} \
|
||||
This package contains grammar sources for use in other grammars. \
|
||||
%files -n %{__treesitter_devel_package_name} \
|
||||
%{treesitter_devel_files}
|
||||
|
||||
### LUA-MACROS ###
|
||||
|
||||
|
||||
|
||||
%_treesitter_macro_init %{_treesitter_definitions}%{lua: rpm.define("_treesitter_macro_init %{nil}")}
|
211
macros.lua
Normal file
211
macros.lua
Normal file
@ -0,0 +1,211 @@
|
||||
--[[
|
||||
SPDX-License-Identifier: GPL-2.0
|
||||
SPDX-FileCopyrightText: 2024 Björn Bidar
|
||||
partly based of functions.lua from python-rpm-macros
|
||||
--]]
|
||||
|
||||
|
||||
--[[
|
||||
Main Package should look like this:
|
||||
%%treesitter_grammars foo bar
|
||||
|
||||
%%build
|
||||
%%treesitter_configure
|
||||
%%treesitter_build
|
||||
|
||||
%%install
|
||||
%%treesitter_install
|
||||
|
||||
%%files
|
||||
%%treesitter_files
|
||||
--]]
|
||||
|
||||
|
||||
function treesitter_grammars()
|
||||
--[[
|
||||
Define any grammars to be included inside the package
|
||||
--]]
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
local base_name = rpm.expand("%_treesitter_base_name")
|
||||
local base_libname = rpm.expand("%_treesitter_grammar_base_libname")
|
||||
|
||||
local treesitter_grammar_names = ""
|
||||
local treesitter_grammar_libnames = ""
|
||||
|
||||
for arg_num = 1,#arg do
|
||||
treesitter_grammar_libnames=treesitter_grammar_libnames .. base_libname .. "-" .. arg[arg_num] .. ".so "
|
||||
end
|
||||
rpm.define("treesitter_grammar_libnames " .. treesitter_grammar_libnames)
|
||||
|
||||
for arg_num = 1,#arg do
|
||||
treesitter_grammar_names=treesitter_grammar_names .. " " .. arg[arg_num]
|
||||
print("Provides: treesitter_grammar(" .. base_name .. "-" .. arg[arg_num] .. ")\n")
|
||||
end
|
||||
rpm.define("treesitter_grammar_names " .. treesitter_grammar_names)
|
||||
|
||||
end
|
||||
|
||||
|
||||
function treesitter_configure()
|
||||
--[[
|
||||
Generate grammar sources for all the grammars provided earlier akin
|
||||
to %configure.
|
||||
--]]
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
local grammars = string.split(rpm.expand("%{treesitter_grammar_names}"))
|
||||
|
||||
print(rpm.expand("%treesitter_set_flags"))
|
||||
print("\n")
|
||||
|
||||
if #grammars > 1 then
|
||||
for k,grammar in pairs(grammars) do
|
||||
print("(cd " .. grammar .. ";tree-sitter generate)")
|
||||
print("\n")
|
||||
end
|
||||
else
|
||||
print("tree-sitter generate")
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function treesitter_build()
|
||||
--[[
|
||||
Similar to %make_build build all grammars if possible read from
|
||||
an alternative file instead of binding.gyp
|
||||
--]]
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
local basename = rpm.expand("%{_treesitter_grammar_base_libname}")
|
||||
local grammar_names = rpm.expand("%treesitter_grammar_names")
|
||||
local left_over_args = arg[1]
|
||||
local grammar_arg_binding = ""
|
||||
|
||||
|
||||
if left_over_args then
|
||||
grammar_arg_binding=" -b "..arg[1]
|
||||
end
|
||||
|
||||
local treesitter_target = rpm.expand("%{treesitter_target}")
|
||||
local grammar_names_tbl = string.split(grammar_names, " ")
|
||||
|
||||
if #grammar_names_tbl > 1 then
|
||||
for k,target in pairs(grammar_names_tbl) do
|
||||
print("eval $(" .. treesitter_target .. grammar_arg_binding .. " -g " .. target ..") " .. " -o " .. basename .. "-" .. target .. ".so ${RPM_OPT_FLAGS}")
|
||||
print("\n")
|
||||
end
|
||||
else
|
||||
print("eval $(" .. treesitter_target .. grammar_arg_binding .. ") " .. " -o " .. basename.. "-" .. grammar_names .. ".so ${RPM_OPT_FLAGS}")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function treesitter_install()
|
||||
--[[
|
||||
Install all previously build grammars
|
||||
--]]
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
local grammars = string.split(rpm.expand("%{treesitter_grammar_libnames}"))
|
||||
local install_path = rpm.expand("%{buildroot}%{_treesitter_grammardir}")
|
||||
for k,grammar in pairs(grammars) do
|
||||
print("install -Dm755 " .. grammar .. " " .. install_path .. "/" .. grammar)
|
||||
print("\n")
|
||||
end
|
||||
end
|
||||
|
||||
function treesitter_files()
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
local grammars = string.split(rpm.expand("%{treesitter_grammar_libnames}"))
|
||||
local grammardir = rpm.expand("%{_treesitter_grammardir}")
|
||||
local _libdir = rpm.expand("%{_libdir}")
|
||||
|
||||
if not grammardir == libdir then
|
||||
print(rpm.expand("%dir " .. grammardir.."\n"))
|
||||
end
|
||||
|
||||
for k,grammar in pairs(grammars) do
|
||||
print(rpm.expand(grammardir .. "/"..grammar.."\n"))
|
||||
end
|
||||
end
|
||||
|
||||
--[[
|
||||
Optional -devel package for grammars that are needed for other grammars to be built.
|
||||
|
||||
If the -devel package is needed it should look like this:
|
||||
%%install
|
||||
[...] # Main page here
|
||||
|
||||
%%treesitter_devel_install
|
||||
|
||||
# Or if the package has shared files between grammars:
|
||||
%%treesitter_devel_install foobar.js
|
||||
|
||||
%%treesitter_devel_package
|
||||
--]]
|
||||
|
||||
function treesitter_devel_install()
|
||||
--[[
|
||||
Install all grammars sources defined earlier.
|
||||
If passed these can also include additional files such as shared fragments
|
||||
that are used between multiple grammars in the same package.
|
||||
--]]
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
--local grammar_names = rpm.expand("%{treesitter_grammar_names}")
|
||||
local grammars = string.split(rpm.expand("%{treesitter_grammar_names}"))
|
||||
local treesitter = rpm.expand("%_treesitter_base_name")
|
||||
|
||||
local install_cmd_base = "install -Dm644 "
|
||||
local install_path = rpm.expand("%{buildroot}%{_treesitter_grammar_develdir}/")
|
||||
|
||||
local rpm_provides_macro = ""
|
||||
--print(grammar_names)
|
||||
for k,grammar in pairs(grammars) do
|
||||
if grammar then
|
||||
rpm_provides_macro=rpm_provides_macro.. "Provides: treesitter_grammar_src(" ..treesitter .. "-" .. grammar ..")\n"
|
||||
end
|
||||
end
|
||||
rpm.define("_treesitter_devel_provides "..rpm_provides_macro)
|
||||
|
||||
if #grammars == 1 then
|
||||
print(install_cmd_base .. "grammar.js " .. install_path .. treesitter .. "-" .. grammars[1].. "/grammar.js")
|
||||
return
|
||||
end
|
||||
|
||||
if #arg > 0 then
|
||||
--[[ FIXME: This maybe not be the best solution if packages can have a single grammar
|
||||
but also addon files
|
||||
]]--
|
||||
for arg_num = 1,#arg do
|
||||
print(rpm.expand(install_cmd_base .. arg[arg_num] .. " " .. install_path .. "%{name}/" .. arg[arg_num] .. "\n"))
|
||||
print("\n")
|
||||
end
|
||||
end
|
||||
|
||||
for k,grammar in pairs(grammars) do
|
||||
if grammar then
|
||||
print(rpm.expand(install_cmd_base .. grammar .. "/grammar.js " .. install_path .. "%{name}/" .. grammar .. "/grammar.js\n"))
|
||||
print("\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function treesitter_devel_files()
|
||||
--[[
|
||||
Install -devel files to %%{_treesitter_grammar_develdir}
|
||||
--]]
|
||||
rpm.expand("%_treesitter_macro_init")
|
||||
local grammars = string.split(rpm.expand("%{treesitter_grammar_names}"))
|
||||
local grammar_develdir = rpm.expand("%{_treesitter_grammar_develdir}")
|
||||
local fpp
|
||||
|
||||
print(rpm.expand("%dir %{_treesitter_grammar_develdir} \n"))
|
||||
--[[
|
||||
Own all directories leading up to %%_includedir which we include in
|
||||
%%_treesitter_grammar_develdir
|
||||
--]]
|
||||
while not (grammar_develdir == rpm.expand("%_includedir")) do
|
||||
print(rpm.expand("%dir " .. grammar_develdir .. "\n"))
|
||||
grammar_develdir = grammar_develdir:dirname()
|
||||
end
|
||||
print(rpm.expand("%{_treesitter_grammar_develdir}/%{name}\n"))
|
||||
end
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6181ede0b7470bfca37e293e7d5dc1d16469b9485d13f13a605baec4a8b1f791
|
||||
size 2941223
|
3
tree-sitter-0.22.2.tar.xz
Normal file
3
tree-sitter-0.22.2.tar.xz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0c829523b876d4a37e1bd46a655c133a93669c0fe98fcd84972b168849c27afc
|
||||
size 3040339
|
93
tree-sitter-target.py
Normal file
93
tree-sitter-target.py
Normal file
@ -0,0 +1,93 @@
|
||||
#!/usr/bin/python3
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# SPDX-FileCopyrightText: 2024 Björn Bidar
|
||||
|
||||
"""Generate compile commands by reading binding.gyp"""
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
# pylint: disable=too-many-branches
|
||||
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
from typing import List, Dict, Optional
|
||||
import ast
|
||||
from copy import copy
|
||||
|
||||
parser = argparse.ArgumentParser(prog = Path(__file__).name,
|
||||
description = "Generate compile commands by reading binding.gyp")
|
||||
parser.add_argument('-b', '--binding', dest = "binding",
|
||||
action="store", help="Path to binding file")
|
||||
parser.add_argument('-g', '--grammar', dest = "grammars",
|
||||
action= "append",
|
||||
required = False,
|
||||
help="Specify grammars in case binding file contains more than one grammar")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.binding:
|
||||
binding_gyp = Path(args.binding)
|
||||
else:
|
||||
binding_gyp = Path("binding.gyp")
|
||||
|
||||
if not binding_gyp.exists():
|
||||
raise FileNotFoundError(f"bindings {binding_gyp.absolute()} not found")
|
||||
|
||||
|
||||
with open(binding_gyp, 'r', encoding='utf8') as binding_raw:
|
||||
binding = ast.literal_eval(binding_raw.read())
|
||||
|
||||
targets = binding['targets'][0]
|
||||
|
||||
def buildCompileCommand(target: Dict, grammars: Optional[List[str]] = None) -> Dict[
|
||||
str,
|
||||
List
|
||||
]:
|
||||
"""Generate compile commands from TARGET supplied found in GRAMMARS or src"""
|
||||
cc = 'cc'
|
||||
cflags_c = []
|
||||
cflags_cc = []
|
||||
commands = {}
|
||||
base_command = [ cc, '-shared', '-fPIC']
|
||||
suffixes_cc = ['cc', 'cxx', 'cpp']
|
||||
if 'cflags_c' in target:
|
||||
cflags_c = target['cflags_c']
|
||||
if 'clfags_cc' in target:
|
||||
cflags_cc = target['cflags_cc']
|
||||
|
||||
include_dirs = []
|
||||
for include_dir in target['include_dirs']:
|
||||
# Don't include any node commands
|
||||
if not include_dir.startswith('<!'):
|
||||
include_dirs+=[ include_dir ]
|
||||
|
||||
if not grammars:
|
||||
grammars = { "src" }
|
||||
for _grammar in grammars:
|
||||
command = copy(base_command)
|
||||
for include_dir in include_dirs:
|
||||
command += '-I', include_dir
|
||||
for source in target['sources']:
|
||||
source = Path(source)
|
||||
# We don't need node bindings
|
||||
if source.parts[0] == "node":
|
||||
continue
|
||||
if not source.parts[0] == _grammar:
|
||||
continue
|
||||
for suffix_cc in suffixes_cc:
|
||||
if source.name.endswith(suffix_cc):
|
||||
command+= '-xc++', source
|
||||
break
|
||||
if source.name.endswith('.c'):
|
||||
command+= '-xc', source
|
||||
for flag in cflags_c, cflags_cc:
|
||||
if flag:
|
||||
command += flag
|
||||
commands[_grammar] = command
|
||||
return commands
|
||||
|
||||
if not args.grammars:
|
||||
args.grammars = ["src"]
|
||||
|
||||
cc_cmd = buildCompileCommand(targets, args.grammars)
|
||||
for grammar in args.grammars:
|
||||
print(*cc_cmd[grammar])
|
@ -1,3 +1,26 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Mar 22 19:35:31 UTC 2024 - Björn Bidar <bjorn.bidar@thaodan.de>
|
||||
|
||||
- Add packaging macros for tree-sitter grammar
|
||||
- Add missing dependency for tree-sitter generate
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 19 07:17:25 UTC 2024 - Soc Virnyl Estela <uncomfy+openbuildservice@uncomfyhalomacro.pl>
|
||||
|
||||
- Update to version 0.22.2:
|
||||
* fix(lib): allow hiding symbols
|
||||
* feat(lib): implement Display for Node
|
||||
* test: fix header writes
|
||||
* chore: turbofish styling
|
||||
* feat(cli)!: add a separate build command to compile parsers
|
||||
* ci: simplify workflows
|
||||
* docs(license): update year
|
||||
* fix(lib): avoid possible UB of calling memset on a null ptr when 0 is passed into `array_grow_by`
|
||||
* fix(lib): makefile installation
|
||||
- Update _service file
|
||||
* replace obsoleted mode "disabled" with "manual"
|
||||
* use download_files instead of performing scm
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Apr 6 19:36:21 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package tree-sitter
|
||||
#
|
||||
# Copyright (c) 2023 SUSE LLC
|
||||
# Copyright (c) 2024 SUSE LLC
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@ -19,18 +19,25 @@
|
||||
%define somajor 0
|
||||
%define libdirname tree_sitter
|
||||
Name: tree-sitter
|
||||
Version: 0.20.8
|
||||
Version: 0.22.2
|
||||
Release: 0
|
||||
Summary: An incremental parsing system for programming tools
|
||||
License: MIT
|
||||
License: GPL-2.0-only AND MIT
|
||||
URL: https://tree-sitter.github.io/
|
||||
Source0: https://github.com/tree-sitter/%{name}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.xz
|
||||
Source1: vendor.tar.xz
|
||||
Source10: cargo_config
|
||||
Source1: vendor.tar.zst
|
||||
Source11: baselibs.conf
|
||||
Source20: tree-sitter-target.py
|
||||
Source21: macros.in
|
||||
Source22: macros.lua
|
||||
Source23: functions.lua
|
||||
Source24: compile-macros.sh
|
||||
Source25: treesitter_grammar.attr
|
||||
Source26: treesitter_grammar.req
|
||||
BuildRequires: cargo-packaging
|
||||
BuildRequires: rust > 1.40
|
||||
Requires: lib%{name}%{somajor} = %{version}
|
||||
Requires: nodejs
|
||||
%{?suse_build_hwcaps_libs}
|
||||
|
||||
%description
|
||||
@ -66,8 +73,9 @@ developing applications that use %{name}.
|
||||
%prep
|
||||
%autosetup -p1 -a1
|
||||
|
||||
mkdir -p .cargo
|
||||
cp %{SOURCE10} .cargo/config
|
||||
cp %{SOURCE21} .
|
||||
cp %{SOURCE22} .
|
||||
cp %{SOURCE23} .
|
||||
|
||||
# fix VERSION in Makefile
|
||||
sed -i -e '/^VERSION/s/:= .*$/:= %{version}/' Makefile
|
||||
@ -78,6 +86,8 @@ export CFLAGS='%{optflags}'
|
||||
export PREFIX='%{_prefix}' LIBDIR='%{_libdir}'
|
||||
%make_build
|
||||
|
||||
sh %{SOURCE24}
|
||||
|
||||
%install
|
||||
export PREFIX='%{_prefix}' LIBDIR='%{_libdir}' INCLUDEDIR='%{_includedir}'
|
||||
%make_install
|
||||
@ -86,12 +96,22 @@ install -p -m 0755 -D %{_builddir}/%{name}-%{version}/target/release/tree-sitter
|
||||
|
||||
find %{buildroot} -type f \( -name "*.la" -o -name "*.a" \) -delete -print
|
||||
|
||||
install -Dm644 macros.treesitter %{buildroot}%{_rpmmacrodir}/macros.treesitter
|
||||
install -Dm755 %{SOURCE20} %{buildroot}%{_rpmconfigdir}/$(basename %{SOURCE20})
|
||||
|
||||
install -Dm644 %{SOURCE25} %{buildroot}%{_fileattrsdir}/$(basename %{SOURCE25})
|
||||
install -Dm755 %{SOURCE26} %{buildroot}%{_rpmconfigdir}/$(basename %{SOURCE26})
|
||||
|
||||
%post -n lib%{name}%{somajor} -p /sbin/ldconfig
|
||||
%postun -n lib%{name}%{somajor} -p /sbin/ldconfig
|
||||
|
||||
%files
|
||||
%doc README.md CONTRIBUTING.md
|
||||
%{_bindir}/tree-sitter
|
||||
%{_rpmconfigdir}/tree-sitter-target.py
|
||||
%{_rpmmacrodir}/macros.treesitter
|
||||
%{_rpmconfigdir}/treesitter_grammar.req
|
||||
%{_fileattrsdir}/treesitter_grammar.attr
|
||||
|
||||
%files -n lib%{name}%{somajor}
|
||||
%license LICENSE
|
||||
|
2
treesitter_grammar.attr
Normal file
2
treesitter_grammar.attr
Normal file
@ -0,0 +1,2 @@
|
||||
%__treesitter_grammar_requires %{_rpmconfigdir}/treesitter_grammar.req
|
||||
%__treesitter_grammar_path ^%{_treesitter_grammar_develdir}/.*\.js
|
80
treesitter_grammar.req
Normal file
80
treesitter_grammar.req
Normal file
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/python3
|
||||
"""Scan grammar JavaScript sources for their dependencies"""
|
||||
|
||||
# SPDX-License-Identifier: MIT
|
||||
# SPDX-FileCopyrightText: 2024 Björn Bidar
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
|
||||
|
||||
import fileinput
|
||||
import re
|
||||
from typing import Optional
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
treeSitterGrammarSrcPath = "/usr/include/tree_sitter"
|
||||
treeSitterGrammarSymbolToken = "treesitter_grammar_src"
|
||||
grammarPaths = []
|
||||
|
||||
def resolveFile(grammarFile: str) -> str:
|
||||
"""Resolve GRAMMARFILE from grammarPaths return found file"""
|
||||
fullGrammarFilePath = Path(grammarFile)
|
||||
currentGrammarPath = fullGrammarFilePath.parent
|
||||
currentGrammarFile = Path(grammarFile)
|
||||
if currentGrammarPath != Path('.') and currentGrammarPath.parts[0] == "..":
|
||||
# resolve path relative to file found last
|
||||
currentGrammarPath = grammarPaths[-1] / fullGrammarFilePath
|
||||
if not currentGrammarPath.exists():
|
||||
return False
|
||||
return currentGrammarPath
|
||||
if currentGrammarPath.is_absolute():
|
||||
grammarPaths.append(currentGrammarPath)
|
||||
if Path(grammarFile).exists():
|
||||
return fullGrammarFilePath
|
||||
for path in grammarPaths:
|
||||
maybeFound = path / currentGrammarFile
|
||||
if maybeFound.exists():
|
||||
return maybeFound.exists()
|
||||
return False
|
||||
|
||||
def dummyRequire(requiredFile_fd: str, maxDepth: Optional[int] = 5 ) -> str:
|
||||
"""Dummy version of node's require function that spits out dependency symbols"""
|
||||
if maxDepth <= 0:
|
||||
return
|
||||
|
||||
if not requiredFile_fd.endswith(".js"):
|
||||
# Append .js to required file name in case is not specified
|
||||
# we have to remove .js suffix later in any case.
|
||||
requiredFile_fd+=".js"
|
||||
|
||||
resolvedFile_fd = resolveFile(requiredFile_fd)
|
||||
if resolvedFile_fd:
|
||||
try:
|
||||
with open(resolvedFile_fd, mode='r', encoding='utf8') as requiredFile:
|
||||
for r_line in requiredFile:
|
||||
require_re = r'.*require\((.*)\).*'
|
||||
requiredLvl2 = re.match(require_re, r_line)
|
||||
#print(r_line)
|
||||
if requiredLvl2 is not None:
|
||||
requiredLvl2_grp_cleaned = \
|
||||
requiredLvl2.group(1).removeprefix("'").removesuffix("'")
|
||||
requiredLvl2_grp_cleaned = \
|
||||
requiredLvl2_grp_cleaned.removeprefix("\"").removesuffix("\"")
|
||||
if not requiredLvl2_grp_cleaned.split('/')[0] == "..":
|
||||
# Don't emit dependencies which are local
|
||||
pass
|
||||
dummyRequire(requiredLvl2_grp_cleaned, maxDepth - 1)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
else:
|
||||
if maxDepth == 5:
|
||||
# In case we immediately fail to open the first grammar source file
|
||||
return
|
||||
# We only want to resolve dependencies outside of the package
|
||||
print(f"{treeSitterGrammarSymbolToken}({Path(requiredFile_fd).parent})")
|
||||
|
||||
for line in fileinput.input():
|
||||
line = line.rstrip('\n')
|
||||
if line.endswith('.js'):
|
||||
dummyRequire(line)
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e8ce5ccc428ccbdd44a3c3de0dd506dc5d9079fe90347fac5d5c7f885f87ad08
|
||||
size 16831820
|
3
vendor.tar.zst
Normal file
3
vendor.tar.zst
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8158ba3e18b25a81d41e6937d120597630a57181996355154197e6988d632030
|
||||
size 30391447
|
Loading…
Reference in New Issue
Block a user