public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: Arthur Zamarin <arthurzam@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: Matthew Smith <matthew@gentoo.org>,
	Nick Sarnie <sarnex@gentoo.org>,
	Arthur Zamarin <arthurzam@gentoo.org>
Subject: [gentoo-dev] [PATCH 1/2] tree-sitter-grammar.eclass: support for new upstream makefile
Date: Wed, 20 Mar 2024 22:52:38 +0200	[thread overview]
Message-ID: <20240320205659.204635-2-arthurzam@gentoo.org> (raw)
In-Reply-To: <20240320205659.204635-1-arthurzam@gentoo.org>

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@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 b2563220cfc..13539daf7e6 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 <matthew@gentoo.org>
 # Nick Sarnie <sarnex@gentoo.org>
+# Arthur Zamarin <arthurzam@gentoo.org>
 # @AUTHOR:
 # Matthew Smith <matthew@gentoo.org>
 # @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
-- 
2.44.0



  reply	other threads:[~2024-03-20 20:58 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-20 20:52 [gentoo-dev] tree-sitter-grammar.eclass: support new upstream bindings Arthur Zamarin
2024-03-20 20:52 ` Arthur Zamarin [this message]
2024-03-20 20:52 ` [gentoo-dev] [PATCH 2/2] tree-sitter-grammar.eclass: support opt in python bindings Arthur Zamarin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240320205659.204635-2-arthurzam@gentoo.org \
    --to=arthurzam@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    --cc=matthew@gentoo.org \
    --cc=sarnex@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox