commit:     83e994e50f806880e1cf1b2b2d47a1d69ab18a60
Author:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 14 14:03:02 2024 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Sat Mar 23 08:27:41 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=83e994e5

tree-sitter-grammar.eclass: support for new upstream makefile

The build system for tree-sitters now generates a much better
Makefile we can use to build the parser and grammar into a good C
library.
This also matches the build procedure used by upstream, making our
reports easier for them to debug (we hit this issue in an old bug
report on memory leak with tree-sitter-bash).

Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>

 eclass/tree-sitter-grammar.eclass | 64 ++++++++++++++++++++++++++-------------
 1 file changed, 43 insertions(+), 21 deletions(-)

diff --git a/eclass/tree-sitter-grammar.eclass 
b/eclass/tree-sitter-grammar.eclass
index b2563220cfc2..13539daf7e61 100644
--- a/eclass/tree-sitter-grammar.eclass
+++ b/eclass/tree-sitter-grammar.eclass
@@ -1,10 +1,11 @@
-# Copyright 1999-2023 Gentoo Authors
+# Copyright 1999-2024 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]>
+# Arthur Zamarin <[email protected]>
 # @AUTHOR:
 # Matthew Smith <[email protected]>
 # @SUPPORTED_EAPIS: 8
@@ -22,7 +23,7 @@ inherit edo 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
+S="${WORKDIR}"/${PN}-${TS_PV:-${PV}}
 
 BDEPEND+=" test? ( dev-util/tree-sitter-cli )"
 IUSE+=" test"
@@ -44,15 +45,16 @@ _get_tsg_abi_ver() {
        # This sed script finds ABI definition string in parser source file,
        # substitutes all the string until the ABI number, and prints remains
        # (the ABI number itself)
-       sed -n 's/#define LANGUAGE_VERSION //p' "${S}"/parser.c ||
+       sed -n 's/#define LANGUAGE_VERSION //p' "${S}"/src/parser.c ||
                die "Unable to extract ABI version for this grammar"
 }
 
-# @FUNCTION: tree-sitter-grammar_src_compile
+# @FUNCTION: _tree-sitter-grammar_legacy_compile
+# @INTERNAL
 # @DESCRIPTION:
-# Compiles the Tree Sitter parser as a shared library.
-tree-sitter-grammar_src_compile() {
-       debug-print-function ${FUNCNAME} "${@}"
+# Compiles the Tree Sitter parser as a shared library, the legacy way.
+_tree-sitter-grammar_legacy_compile() {
+       cd "${S}/src" || die
 
        # Grammars always contain parser.c, and sometimes a scanner.c,
        # or scanner.cc.
@@ -60,17 +62,17 @@ tree-sitter-grammar_src_compile() {
        tc-export CC CXX
        # We want to use the bundled parser.h, not anything lurking on the 
system, hence -I
        # See 
https://github.com/tree-sitter/tree-sitter-bash/issues/199#issuecomment-1694416505
-       export CFLAGS="${CFLAGS} -fPIC -I. -Itree_sitter"
-       export CXXFLAGS="${CXXFLAGS} -fPIC -I. -Itree_sitter"
+       local -x CFLAGS="${CFLAGS} -fPIC -I. -Itree_sitter"
+       local -x CXXFLAGS="${CXXFLAGS} -fPIC -I. -Itree_sitter"
 
        local objects=( parser.o )
-       if [[ -f "${S}"/scanner.c || -f "${S}"/scanner.cc ]]; then
+       if [[ -f "${S}"/src/scanner.c || -f "${S}"/src/scanner.cc ]]; then
                objects+=( scanner.o )
        fi
        emake "${objects[@]}"
 
        local link="$(tc-getCC) ${CFLAGS}"
-       if [[ -f "${S}/scanner.cc" ]]; then
+       if [[ -f "${S}/src/scanner.cc" ]]; then
                link="$(tc-getCXX) ${CXXFLAGS}"
        fi
 
@@ -84,10 +86,24 @@ tree-sitter-grammar_src_compile() {
        edo ${link} ${LDFLAGS} \
                        -shared \
                        *.o \
-                       ${soname_args} \
+                       "${soname_args}" \
                        -o "${WORKDIR}"/${soname}
 }
 
+tree-sitter-grammar_src_compile() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       # legacy grammars don't have a pyproject.toml
+       if [[ -f "${S}/pyproject.toml" ]]; then
+               sed -e "/SONAME_MINOR :=/s/:=.*$/:= $(_get_tsg_abi_ver)/" -i 
"${S}/Makefile" || die
+               emake \
+                       PREFIX="${EPREFIX}/usr" \
+                       LIBDIR="${EPREFIX}/usr/$(get_libdir)"
+       else
+               _tree-sitter-grammar_legacy_compile
+       fi
+}
+
 # @FUNCTION: tree-sitter-grammar_src_test
 # @DESCRIPTION:
 # Runs the Tree Sitter parser's test suite.
@@ -95,20 +111,26 @@ tree-sitter-grammar_src_compile() {
 tree-sitter-grammar_src_test() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       (cd .. && tree-sitter test) || die "Test suite failed"
+       tree-sitter test || die "Test suite failed"
 }
 
-# @FUNCTION: tree-sitter-grammar_src_install
-# @DESCRIPTION:
-# Installs the Tree Sitter parser library.
 tree-sitter-grammar_src_install() {
        debug-print-function ${FUNCNAME} "${@}"
 
-       local soname=lib${PN}$(get_libname $(_get_tsg_abi_ver))
-
-       dolib.so "${WORKDIR}/${soname}"
-       dosym "${soname}" \
-                 /usr/$(get_libdir)/lib${PN}$(get_libname)
+       # legacy grammars don't have a pyproject.toml
+       if [[ -f "${S}/pyproject.toml" ]]; then
+               emake \
+                       PREFIX="${EPREFIX}/usr" \
+                       LIBDIR="${EPREFIX}/usr/$(get_libdir)" \
+                       DESTDIR="${D}/" \
+                       install
+               find "${D}" -name '*.a' -delete || die "failed to remove static 
libraries"
+       else
+               local soname=lib${PN}$(get_libname $(_get_tsg_abi_ver))
+
+               dolib.so "${WORKDIR}/${soname}"
+               dosym "${soname}" /usr/$(get_libdir)/lib${PN}$(get_libname)
+       fi
 }
 
 fi

Reply via email to