commit:     9afc675ca6a16d345f48224d14c0cf6301d32607
Author:     Matt Smith <matt <AT> offtopica <DOT> uk>
AuthorDate: Sat Oct 16 19:39:16 2021 +0000
Commit:     Nick Sarnie <sarnex <AT> gentoo <DOT> org>
CommitDate: Thu Oct 21 23:49:23 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9afc675c

tree-sitter-grammar.eclass: Init

Signed-off-by: Matt Smith <matt <AT> offtopica.uk>
Signed-off-by: Nick Sarnie <sarnex <AT> gentoo.org>

 eclass/tree-sitter-grammar.eclass | 96 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/eclass/tree-sitter-grammar.eclass 
b/eclass/tree-sitter-grammar.eclass
new file mode 100644
index 00000000000..46573027f96
--- /dev/null
+++ b/eclass/tree-sitter-grammar.eclass
@@ -0,0 +1,96 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: tree-sitter-grammar.eclass
+# @MAINTAINER:
+# Matthew Smith <[email protected]>
+# Nick Sarnie <[email protected]>
+# @AUTHOR:
+# Matthew Smith <[email protected]>
+# @SUPPORTED_EAPIS: 8
+# @BLURB: Common functions and variables for Tree Sitter grammars
+
+if [[ -z ${_TREE_SITTER_GRAMMAR_ECLASS} ]]; then
+_TREE_SITTER_GRAMMAR_ECLASS=1
+
+case ${EAPI} in
+       8) ;;
+       *) die "EAPI=${EAPI:-0} is not supported" ;;
+esac
+
+inherit multilib toolchain-funcs
+
+SRC_URI="https://github.com/tree-sitter/${PN}/archive/${TS_PV:-v${PV}}.tar.gz
+       -> ${P}.tar.gz"
+S="${WORKDIR}"/${PN}-${TS_PV:-${PV}}/src
+
+# Needed for tree_sitter/parser.h
+DEPEND="dev-libs/tree-sitter"
+
+EXPORT_FUNCTIONS src_compile src_install
+
+# @ECLASS-VARIABLE: TS_PV
+# @PRE_INHERIT
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Used to override upstream tag name if tagged differently, e.g. most releases
+# are v${PV} but some are tagged as rust-${PV}.
+
+# @FUNCTION: _get_tsg_abi_ver
+# @INTERNAL
+# @DESCRIPTION:
+# This internal function determines the ABI version of a grammar library based
+# on the package version.
+_get_tsg_abi_ver() {
+       if ver_test -gt 0.21; then
+               die "Grammar too new; unknown ABI version"
+       elif ver_test -ge 0.19.0; then
+               echo 13
+       else
+               die "Grammar too old; unknown ABI version"
+       fi
+}
+
+# @FUNCTION: tree-sitter-grammar_src_compile
+# @DESCRIPTION:
+# Compiles the Tree Sitter parser as a shared library.
+tree-sitter-grammar_src_compile() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       # Grammars always contain parser.c, and sometimes a scanner.c,
+       # or scanner.cc.
+
+       tc-export CC CXX
+       export CFLAGS="${CFLAGS} -fPIC"
+       export CXXFLAGS="${CXXFLAGS} -fPIC"
+
+       local objects=( parser.o )
+       if [[ -f "${S}"/scanner.c || -f "${S}"/scanner.cc ]]; then
+               objects+=( scanner.o )
+       fi
+       emake "${objects[@]}"
+
+       local link="$(tc-getCC) ${CFLAGS}"
+       if [[ -f "${S}/scanner.cc" ]]; then
+               link="$(tc-getCXX) ${CXXFLAGS}"
+       fi
+
+       local soname=lib${PN}$(get_libname $(_get_tsg_abi_ver))
+       ${link} ${LDFLAGS} \
+                       -shared \
+                       *.o \
+                       -Wl,-soname ${soname} \
+                       -o "${WORKDIR}"/${soname} || die
+}
+
+# @FUNCTION: tree-sitter-grammar_src_install
+# @DESCRIPTION:
+# Installs the Tree Sitter parser library.
+tree-sitter-grammar_src_install() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       dolib.so "${WORKDIR}"/lib${PN}$(get_libname $(_get_tsg_abi_ver))
+       dosym lib${PN}$(get_libname $(_get_tsg_abi_ver)) \
+                 /usr/$(get_libdir)/lib${PN}$(get_libname)
+}
+fi

Reply via email to