public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: Violet Purcell <vimproved@inventati.org>
To: gentoo-dev@lists.gentoo.org
Cc: Violet Purcell <vimproved@inventati.org>
Subject: [gentoo-dev] [PATCH] zig.eclass: new eclass
Date: Wed,  4 Oct 2023 17:58:13 -0400	[thread overview]
Message-ID: <20231004215818.7274-1-vimproved@inventati.org> (raw)

This is an eclass to help with building programs that use Zig's "build
system." It includes things such as PIE support and the ability to set
min/max for Zig versions.

Signed-off-by: Violet Purcell <vimproved@inventati.org>
---
 eclass/zig.eclass | 168 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 168 insertions(+)
 create mode 100644 eclass/zig.eclass

diff --git a/eclass/zig.eclass b/eclass/zig.eclass
new file mode 100644
index 000000000000..f901f2ca49e4
--- /dev/null
+++ b/eclass/zig.eclass
@@ -0,0 +1,168 @@
+# Copyright 2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: zig.eclass
+# @MAINTAINER:
+# Violet Purcell <vimproved@inventati.org>
+# @AUTHOR:
+# Violet Purcell <vimproved@inventati.org>
+# @SUPPORTED_EAPIS: 8
+# @BLURB: Utility functions for packages using Zig's build system.
+# @DESCRIPTION:
+# Utility eclass for packages that use Zig's build system (eg. with build.zig).
+
+case ${EAPI} in
+	8) ;;
+	*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
+esac
+
+if [[ ! ${_ZIG_ECLASS} ]]; then
+_ZIG_ECLASS=1
+
+inherit edo
+
+# @ECLASS_VARIABLE: ZIG_USE_PIE
+# @PRE_INHERIT
+# @DESCRIPTION:
+# If true, add the pie USE flag to the package. Toggle off only if the
+# program is broken with PIE.
+ZIG_USE_PIE="${ZIG_USE_PIE:=true}"
+
+if [[ "${ZIG_USE_PIE}" = true ]]; then
+	IUSE="pie"
+fi
+
+# @ECLASS_VARIABLE: ZIG
+# @DESCRIPTION:
+# The Zig binary to use for build. Useful if you have multiple Zig versions
+# installed and want to use a specific version.
+ZIG="${ZIG:-}"
+
+# @ECLASS_VARIABLE: ezigargs
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Optional Zig arguments as Bash array; this should be defined before calling
+# zig_src_compile
+
+# @ECLASS_VARIABLE: MYZIGARGS
+# @USER_VARIABLE
+# @DESCRIPTION:
+# User-controlled variable containing extra arguments to be passed to
+# `zig build`.
+
+# @ECLASS_VARIABLE: ZIG_BUILD_VERBOSE
+# @DESCRIPTION:
+# If non-empty, build with verbose output.
+ZIG_BUILD_VERBOSE="${ZIG_BUILD_VERBOSE:=1}"
+
+# @ECLASS_VARIABLE: ZIG_MIN
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Specifies the minimum version of Zig. Must be a minor version (x.y).
+ZIG_MIN="${ZIG_MIN:-}"
+
+# @ECLASS_VARIABLE: ZIG_MAX
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Specifies the maximum version of Zig. Must be a minor version (x.y).
+ZIG_MAX="${ZIG_MAX:-}"
+
+BDEPEND="|| (
+	dev-lang/zig
+	dev-lang/zig-bin
+)"
+
+# @FUNCTION: zig-set_ZIG
+# @DESCRIPTION:
+# Sets the ZIG environment variable.
+zig-set_ZIG() {
+	# Exit if ZIG is already set by the user or the ebuild.
+	[[ -n ${ZIG} ]] && return
+
+	# Determine suitable Zig version. Will select the highest minor version
+	# that's less than ZIG_MAX.
+	local candidate selected selected_ver ver
+
+	for candidate in "${BROOT}"/usr/bin/zig-*; do
+		if [[ ! -L ${candidate} || ${candidate} != */zig?(-bin)-+([0-9.]) ]]; then
+			continue
+		fi
+
+		ver=${candidate##*-}
+
+		ver_minor=${ver%.*}
+
+		if [[ -n ${ZIG_MIN} ]] \
+			&& ver_test "${ver_minor}" -lt "${ZIG_MIN}"; then
+			continue
+		fi
+
+		if [[ -n ${ZIG_MAX} ]] \
+			&& ver_test "${ver_minor}" -gt "${ZIG_MAX}"; then
+			continue
+		fi
+
+		if [[ -n ${selected_ver} ]] \
+			&& ver_test "${selected_ver}" -gt "${ver_minor}"; then
+			continue
+		fi
+
+		selected="${candidate}"
+		selected_ver="${ver}"
+	done
+
+	if [[ -z ${selected} ]]; then
+		die "Could not find (suitable) zig installation in ${BROOT}/usr/bin"
+	fi
+
+	export ZIG="${selected}"
+}
+
+# @FUNCTION: zig_pkg_setup
+# @DESCRIPTION:
+# Determines suitable Zig installation and exports ZIG.
+zig_pkg_setup() {
+	zig-set_ZIG
+}
+
+# @FUNCTION: zig_src_compile
+# @DESCRIPTION:
+# Runs `zig build` with specified arguments..
+zig_src_compile() {
+	local zigargs=( "${ZIG}" build )
+
+	if [[ -n "${ZIG_BUILD_VERBOSE}" ]]; then
+		zigargs+=( --verbose )
+	fi
+
+	# Enable PIE if ZIG_USE_PIE is set and use flag is enabled.
+	if [[ "${ZIG_USE_PIE}" = true ]]; then
+		zigargs+=( -Dpie=$(usex pie true false) )
+	fi
+
+	zigargs+=(
+		# Arguments from ebuild
+		"${ezigargs[@]}"
+
+		# Arguments passed to this function
+		"$@"
+
+		# Arguments from user
+		"${MYZIGARGS[@]}"
+	)
+
+	edo "${zigargs[@]}"
+}
+
+# @FUNCTION: zig_src_install
+# @DESCRIPTION:
+# Copies Zig's default install tree to DESTDIR.
+zig_src_install() {
+	# Zig has no separate install/compile steps and installs to ${S}/zig-out by
+	# default. We just copy this tree to ${ED} here.
+	cp -a "${S}/zig-out" "${ED}/usr" || die
+}
+
+EXPORT_FUNCTIONS pkg_setup src_compile src_install
+
+fi
-- 
2.42.0



                 reply	other threads:[~2023-10-04 21:58 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20231004215818.7274-1-vimproved@inventati.org \
    --to=vimproved@inventati.org \
    --cc=gentoo-dev@lists.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