Hello everyone,

This patch series adds new eclasses for packages that use Zig
toolchain with varying level of integration. Since some projects
or ebuilds use only Zig compiler directly, without touching Zig Build
System, I have decided to split eclasses into 2:

* zig-toolchain.eclass: handles dependency on Zig toolchain and
  finds appropriate versions/slots, converts C-style target tuples/triples
  to Zig format and sets environment variables to be used in other
  eclasses and ebuilds. This eclass is more low-level and intended
  to be used by programs and libraries that call "zig" commands directly,
  without having build.zig file and using "zig build" command. For example,
  authors could use "zig build-exe" and "zig test" directly in Makefile,
  or add "zig cc" and compile both C and Zig version of library etc.
  In this patchset it is also used by dev-lang/zig to convert targets
  during bootstrapping, and other logic is suppressed.
* zig-build.eclass: handles working with "zig build" sub-command and build.zig 
files.
  This eclass is more high-level and for most ebuilds it's the only
  one which needs to be inherited. It sets default functions for
  ebuild phases, deals with dependencies in package manager, allows
  ebuilds and end users to configure used flags, respects multi-threading
  and verboseness preferences, has some small support for cross-compilation
  and so on.

Github PR and discussion here: https://github.com/gentoo/gentoo/pull/37283 .
I have also wrote small generator for Zig ebuild skeletons here:
https://github.com/BratishkaErik/zig-ebuild . Example output in that PR.
It requires dev-lang/zig:9999 to compile, but at runtime it works
with any version supported by eclass (currently 0.13 and 9999).

In "v2" revision, including suggestions on mailing list:
 * Move EAPI check after inherit guard
 * Change BDEPEND from "+=" to "=" and remove initial space here,
 * Keep length below 80 characters, and add 2 spaces after full stop,
 * Align lines in switch cases (according to Neovim, on nano I had
   not noticed it before),
 * Add "die -n" to ezig(),
 * Move and rewrite TODO comments in zig-build_start_base_args to be
   shorter and move less relevant information to patch itself.

...and GitHub. Also remove old leftovers of Zig 0.12 compatibility.

Eric Joldasov (5):
  zig-toolchain.eclass: new eclass
  zig-build.eclass: new eclass
  dev-lang/zig: add 0.13.0-r1
  dev-lang/zig: sync 9999 with 0.13.0-r1
  sys-fs/ncdu: add 2.6-r1

 .../zig-0.13.0-skip-test-stack_iterator.patch |  32 +
 dev-lang/zig/zig-0.13.0-r1.ebuild             | 245 ++++++++
 dev-lang/zig/zig-9999.ebuild                  | 244 ++++----
 eclass/zig-build.eclass                       | 580 ++++++++++++++++++
 eclass/zig-toolchain.eclass                   | 375 +++++++++++
 sys-fs/ncdu/ncdu-2.6-r1.ebuild                |  50 ++
 6 files changed, 1407 insertions(+), 119 deletions(-)
 create mode 100644 dev-lang/zig/files/zig-0.13.0-skip-test-stack_iterator.patch
 create mode 100644 dev-lang/zig/zig-0.13.0-r1.ebuild
 create mode 100644 eclass/zig-build.eclass
 create mode 100644 eclass/zig-toolchain.eclass
 create mode 100644 sys-fs/ncdu/ncdu-2.6-r1.ebuild

Interdiff against v1:
diff --git a/eclass/zig-build.eclass b/eclass/zig-build.eclass
index b1fc89e38d9d..ffa075043cde 100644
--- a/eclass/zig-build.eclass
+++ b/eclass/zig-build.eclass
@@ -1,572 +1,580 @@
 # Copyright 2024 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 # @ECLASS: zig-build.eclass
 # @MAINTAINER:
 # Eric Joldasov <bratishkae...@landless-city.net>
 # @AUTHOR:
 # Alfred Wingate <par...@protonmail.com>
 # Violet Purcell <vimpro...@inventati.org>
 # Eric Joldasov <bratishkae...@landless-city.net>
 # @SUPPORTED_EAPIS: 8
 # @PROVIDES: zig-toolchain
-# @BLURB: Functions for working with ZBS (Zig Build System).
+# @BLURB: Functions for working with ZBS (Zig Build System)
 # @DESCRIPTION:
-# Functions for working with Zig build system and package manager.
-# Supports Zig 0.13+. Exports default functions for convenience.
+# Functions for working with Zig build system and package manager.  
+# Supports Zig 0.13+.  Exports default functions for convenience.  
 #
 # Note that zig-build.eclass is mostly tailored for projects that:
 # 1) Install something in build.zig steps: "artifacts" (executable,
-# libraries, objects), source codes, assets, tests, scripts etc. But many 
authors
-# also use it to write Zig "modules", build logic and/or bindings/wrappers
-# for C/C++ libraries. They install nothing and are only used at build-time,
-# so it's unneccessary and mostly useless to make ebuilds for them.
-# 2) Have required `target`, `cpu` and optional `optimize` options
-# in build.zig that accept standard Zig-style target and optimize mode.
-# They are usually created by `standardTargetOptions` and 
`standardOptimizeOption`.
+# libraries, objects), source codes, assets, tests, scripts etc.   But
+# many authors also use it to write Zig "modules", build logic
+# and/or bindings/wrappers for C/C++ libraries.  They install nothing
+# and are only used at build-time, so it's unneccessary and mostly
+# useless to make ebuilds for them.  
+# 2) Have required `target`, `cpu` and optional `optimize` options in
+# build.zig that accept standard Zig-style target and optimize mode.  
+# They are usually created by calling `b.standardTargetOptions` and
+# `b.standardOptimizeOption` functions.  
 #
-# For end-user executables, usually it's recommended to fix calling these 
options by patch
-# and upstream it, but in some cases they have good reasons
-# to not have this option, f.e. if it is built only for WASM
-# platform with ReleaseSmall, and is not intended to run in your /usr/bin/.
-# In this case, declare dummy options using `standardTargetOptions` and
-# ignore their values, or else eclass wouldn't work.
+# For end-user executables, usually it's recommended to patch to call
+# these options and upstream it, but in some cases authors have good
+# reasons to not have them, f.e. if it is built only for WASM
+# platform with ReleaseSmall, and is not intended to run in /usr/bin/.  
+# In this case, declare dummy options using `b.option` and  ignore
+# their values, or else eclass wouldn't work.  
 #
-# Another case is when upstream has `target` option but it is customized
-# and does not accept usual targets, but something specific to the project
-# like "linux-baseline-lts" or combine CPU and target in one option.
-# In this case, it's best to rename that option to something like 
`target-custom`,
-# then declare `target` option and make converter from one value to other.
+# Another case is when upstream has `target` option but it has
+# custom format and does not accept usual Zig targets, but rather
+# something specific to the project like "linux-baseline-lts", or
+# combine CPU and target in one option.  
+# In this case, it's best to rename that option to something like
+# `target-custom`, then declare `target` option and make converter
+# from one value to other.  
 #
-# For non-executable binaries like C shared/static libraries, objects etc.
-# our policy is stricter, all 3 options are required and should not
-# be ignored, with no exceptions.
+# For non-executable binaries like C libraries, objects etc. our
+# policy is stricter, all 3 options are required and should not
+# be ignored, with no exceptions.  
+
+if [[ ! ${_ZIG_BUILD_ECLASS} ]]; then
+_ZIG_BUILD_ECLASS=1
 
 case ${EAPI} in
        8) ;;
        *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
 esac
 
-if [[ ! ${_ZIG_BUILD_ECLASS} ]]; then
-_ZIG_BUILD_ECLASS=1
-
 inherit multiprocessing zig-toolchain
 
 # @ECLASS_VARIABLE: ZIG_OPTIONAL
 # @PRE_INHERIT
 # @DEFAULT_UNSET
 # @DESCRIPTION:
-# If set to a non-empty value, all logic in zig-toolchain and zig-build
-# eclasses will be considered optional. No dependencies will be added and
-# no phase functions will be exported.
+# If set to a non-empty value, all logic in zig-toolchain and
+# zig-build eclasses will be considered optional.  No dependencies
+# will be added and no phase functions will be exported.  
 #
 # For zig-build.eclass users:
-# You need to add Zig and pkgconfig dependency in your BDEPEND, set 
QA_FLAGS_IGNORED
-# and call all phase functions manually, or, if you want to call "ezig" 
directly,
-# at least call "zig-build_pkg_setup" before it.
+# You need to add Zig and pkgconfig dependencies in your BDEPEND, set
+# QA_FLAGS_IGNORED and call all phase functions manually.  If you want
+# to use "ezig build" directly, call "zig-build_pkg_setup" before it.  
 #
-# For zig-toolchain.eclass users: see documentation in zig-toolchain.eclass 
instead.
+# For zig-toolchain.eclass users: see documentation in
+# zig-toolchain.eclass instead.  
 if [[ ! ${ZIG_OPTIONAL} ]]; then
-       BDEPEND+="virtual/pkgconfig"
+       BDEPEND="virtual/pkgconfig"
 
        # See https://github.com/ziglang/zig/issues/3382
        # Zig Build System does not support CFLAGS/LDFLAGS/etc.
        QA_FLAGS_IGNORED=".*"
 fi
 
 # @ECLASS_VARIABLE: ZBS_DEPENDENCIES
 # @PRE_INHERIT
 # @DEFAULT_UNSET
 # @DESCRIPTION:
 # Bash associative array with all tarballs that will be fetched by
-# "ezig fetch" in zig-build_src_unpack phase. Value is URL where
+# "ezig fetch" in zig-build_src_unpack phase.  Value is URL where
 # tarball is located, key is name under which it would be downloaded
-# and renamed. So generally it has effect of "value -> key".
+# and renamed.  So generally it has effect of "value -> key".  
 #
 # Note: if Zig Build System dependency can't be represented in SRC_URI
-# (like direct Git commit URIs), you should do the following (zig-ebuilder
-# does archiving automatically for you):
+# (like direct Git commit URIs), you should do the following
+# (zig-ebuilder does archiving automatically for you):
 #   1. Archive each folder with dependency content in some tarball,
-#      so f.e. if you have 2 Git dependencies, create 2 tarballs.
+#      so f.e. if you have 2 Git dependencies, create 2 tarballs.  
 #   2. Archive all previous tarballs into one combined tarball (also
 #      called tarball-tarball from now on), no subdirs, so that eclass
 #      can firstly unpack this tarball with "unpack",
-#      and secondly unpack its content with "zig fetch".
+#      and secondly unpack its content with "zig fetch".  
 #   3. (zig-ebuilder can't do this) Host this tarball somewhere
-#      and put URL of this tarball in SRC_URI, and archives in 
ZBS_DEPENDENCIES,
-#      keys must be names of archives, leave values empty.
+#      and put URL of this tarball in SRC_URI, and archives in
+#      ZBS_DEPENDENCIES, keys must be names of archives, values empty.  
 #
 # Example:
 # @CODE
 # declare -r -A ZBS_DEPENDENCIES=(
 #      [tarball_a-<long-hash>.tar.gz]='URL_A'
 #      [tarball_b-<long-hash>.tar.gz]='URL_B'
 #
 #      # If there are Git dependencies:
 #      [git_c-<long-hash>.tar.gz]=''
 #      # Tarball-tarball should contain inside above tarball flatly.
 # )
 # @CODE
 
 # @ECLASS_VARIABLE: ZBS_DEPENDENCIES_SRC_URI
 # @OUTPUT_VARIABLE
 # @DEFAULT_UNSET
 # @DESCRIPTION:
-# Content of ZBS_DEPENDENCIES converted at inherit-time, to be used in SRC_URI.
-# Note that elements with empty keys will be skipped.
+# Content of ZBS_DEPENDENCIES converted at inherit-time, to be used in
+# SRC_URI.  Note that elements with empty keys will be skipped.  
 # Example:
 # @CODE
 # SRC_URI="
-#      <URL to archive of project sources, patches, other non-Zig resources 
etc.>
+#      <URL to project sources, patches, non-Zig resources etc.>
 #
 #      # If there are Git dependencies:
 #      # <URL to tarball-tarball>
 #
 #      ${ZBS_DEPENDENCIES_SRC_URI}
 # "
 # @CODE
 
 # @FUNCTION: _zig-build_set_zbs_uris
 # @INTERNAL
 # @DESCRIPTION:
-# Sets ZBS_DEPENDENCIES_SRC_URI variable based on ZBS_DEPENDENCIES.
+# Sets ZBS_DEPENDENCIES_SRC_URI variable based on ZBS_DEPENDENCIES.  
 _zig-build_set_zbs_uris() {
        # Thanks to Alfred Wingate "parona" for inspiration here:
        # 
https://gitlab.com/Parona/parona-overlay/-/blob/874dcfe03116574a33ed51f469cc993e98db1fa2/eclass/zig.eclass
 
        ZBS_DEPENDENCIES_SRC_URI=
 
        for dependency in ${!ZBS_DEPENDENCIES[@]}; do
                local uri="${ZBS_DEPENDENCIES[${dependency}]}"
                if [[ ${#uri} -gt 0 ]]; then
                        ZBS_DEPENDENCIES_SRC_URI+=" ${uri} -> ${dependency}"
                else
                        # Unrepresentable dependency
                        continue
                fi
        done
 }
 _zig-build_set_zbs_uris
 
 # @ECLASS_VARIABLE: my_zbs_args
 # @DESCRIPTION:
-# Ebuild-specified arguments to pass to the "zig build" after "src_configure".
-# This should be a Bash array. It's appended to the ZBS_ARGS
-# during "src_configure". Note: if you need to override default
-# optimize mode of this eclass (ReleaseSafe) with your default,
-# please use "--release=small" etc. syntax so that user can still
-# override it in ZBS_ARGS_EXTRA.
+# Bash array with ebuild-specified arguments to pass to the
+# "zig build" after "src_configure".  
+# It's appended to the ZBS_ARGS during "src_configure".  Note: if you
+# need to override default optimize mode of this eclass (ReleaseSafe)
+# with your default, please use "--release=small" etc. syntax so that
+# user can still override it in ZBS_ARGS_EXTRA.  
 #
 # Example:
 # @CODE
 # src_configure() {
 #      local my_zbs_args=(
 #              -Dpie=true
 #      )
 #
 #      zig-build_src_configure
 # }
 # @CODE
 : "${my_zbs_args:=}"
 
 # @ECLASS_VARIABLE: ZBS_ARGS_EXTRA
 # @USER_VARIABLE
 # @DESCRIPTION:
-# User-specified arguments to pass to the "zig build" after "src_configure".
-# This is also where amount of jobs for "zig build" is taken from.
-# It's appended to the ZBS_ARGS during "zig-build_src_configure".
+# Bash string with user-specified arguments to pass to the "zig build"
+# after "src_configure".  
+# It's appended to the ZBS_ARGS during "zig-build_src_configure".  
 #
-# If this does not have amount of jobs, eclass will try to take amount of jobs
-# from MAKEOPTS, and if it also does not have them, it will default to 
$(nproc).
+# If this does not have amount of jobs, eclass will try to take amount
+# of jobs from MAKEOPTS, and if it also does not have them, it will
+# default to $(nproc).  
 #
 # Example:
 # @CODE
 # -j8 --release=small
 # @CODE
 : "${ZBS_ARGS_EXTRA:=}"
 
 # @ECLASS_VARIABLE: ZBS_VERBOSE
 # @USER_VARIABLE
 # @DESCRIPTION:
 # If enabled, eclass will add "--summary all --verbose" options to
 # "ezig build", so that it prints every command before executing,
-# and summarry tree at the end of step. If not, will do nothing.
-# Enabled by default. Set to OFF to disable these verbose messages.
+# and summarry tree at the end of step.  If not, will do nothing.  
+# Enabled by default.  Set to OFF to disable these verbose messages.  
 #
-# Note: this variable does not control other options starting with 
"--verbose-",
-# such as "--verbose-link" or "--verbose-llvm-cpu-features". If you need them,
-# add them manually to ZBS_ARGS_EXTRA.
+# Note: this variable does not control other options starting with
+# "--verbose-", such as "--verbose-link" or "--verbose-cimport".  If
+# you need them, add them manually to ZBS_ARGS_EXTRA.  
 : "${ZBS_VERBOSE:=ON}"
 
 # @ECLASS_VARIABLE: BUILD_DIR
 # @DEFAULT_UNSET
 # @DESCRIPTION:
-# Directory where all "ezig build" calls will be proceeded.
-# Defaults to "${WORKDIR}/${P}-build" if not set.
+# Directory where all "ezig build" calls will be proceeded.  
+# Defaults to "${WORKDIR}/${P}-build" if not set.  
 : "${BUILD_DIR:=${WORKDIR}/${P}-build}"
 
 # @ECLASS_VARIABLE: ZBS_ECLASS_DIR
 # @DESCRIPTION:
-# Directory where various files used by this eclass are stored.
-# They can be supplied by the ebuild or by eclass.
+# Directory where various files used by this eclass are stored.  
+# They can be supplied by the ebuild or by eclass.  
 # Currently, it's used only for Zig packages, which are stored in "p/"
-# subdirectory.
-# Defaults to "${WORKDIR}/zig-eclass" if not set.
-# Should be set before calling "zig-build_src_unpack" or 
"zig-build_live_fetch".
+# subdirectory.  
+# Defaults to "${WORKDIR}/zig-eclass" if not set.  
+# Should be set before calling "zig-build_src_unpack" or
+# "zig-build_live_fetch".  
 : "${ZBS_ECLASS_DIR:=${WORKDIR}/zig-eclass}"
 
 # @FUNCTION: zig-build_get_jobs
 # @DESCRIPTION:
-# Returns number of jobs from ZBS_ARGS_EXTRA or MAKEOPTS.
-# If there is none, defaults to number of available processing units.
+# Returns number of jobs from ZBS_ARGS_EXTRA or MAKEOPTS.  
+# If there is none, defaults to number of available processing units.  
 zig-build_get_jobs() {
+       local all_args="${ZBS_ARGS_EXTRA} ${MAKEOPTS}"
        local default_jobs="$(get_nproc)"
-       local jobs=$(makeopts_jobs "${ZBS_ARGS_EXTRA} ${MAKEOPTS}" 
"${default_jobs}")
+       local jobs=$(makeopts_jobs "${all_args}" "${default_jobs}")
 
        if [[ ${jobs} == "0" ]]; then
-               # Zig build system does not allow jobs count to be less than 1,
-               # and does not have option for unlimited parallelism. Pass
-               # default number of jobs here.
+               # Zig build system does not allow "-j0", and does not have
+               # option for unlimited parallelism. Pass our  default number
+               # of jobs here.
                echo "${default_jobs}"
        else
                echo "${jobs}"
        fi
 }
 
 # @FUNCTION: zig-build_start_base_args
 # @DESCRIPTION:
-# Stores basic args for future "ezig build" calls in ZBS_ARGS_BASE,
+# Stores basic args for future "ezig build" calls in ZBS_ARGS_BASE.  
 # Package manager option is managed by "zig-build_src_prepare",
-# ebuild and user options are added by "zig-build_src_configure".
+# ebuild and user options are added by "zig-build_src_configure".  
 #
 # This function is used by "zig-build_pkg_setup", and it is neccessary
 # that args are available as early as possible, so that ebuilds
 # could use them in steps like "src_unpack" if neccessary, while
-# still having verbosity and amount of jobs from user respected.
+# still having verbosity and amount of jobs from user respected.  
+#
+#
+# TODO: currently this function enables "--search-prefix" (1) and
+# "--sysroot" (2) only when cross-compiling, should be fixed to
+# unconditionally enabling it.  
+#
+# For solving (1) this patch should be reworked and upstreamed:
+# https://paste.sr.ht/~bratishkaerik/2ddffe2bf0f8f9d6dfb60403c2e9560334edaa88
+#
+# (2)
+# "--sysroot" should be passed together with "--search-prefix" above,
+# if we pass only "--sysroot" it gives these errors:
+# @CODE
+# error: unable to find dynamic system library 'zstd' using strategy 
'paths_first'. searched paths: none
+# @CODE
 zig-build_start_base_args() {
        [[ ${ZBS_ARGS_BASE} ]] && return
 
        local crt_dir="${ESYSROOT}/usr/"
        if [[ ${ZIG_TARGET} == *musl* ]]; then
                crt_dir+="lib/"
        else
                crt_dir+="$(get_libdir)/"
        fi
 
        # Sync with the output format of `zig libc`.
        # TODO maybe add to upstream to use ZON format instead...
        # Will also help "https://github.com/ziglang/zig/issues/20327";,
        # and hopefully will respect our settings too.
-       cat <<- _EOF_ > "${T}/zig_libc.txt" || die "Failed to create Zig libc 
installation paths file"
-               # Note: they are not prepended by "--sysroot" value, so repeat 
it here.
+       cat <<- _EOF_ > "${T}/zig_libc.txt"
+               # Note: they are not prepended by "--sysroot" value,
+               # so repeat it here.
                include_dir=${ESYSROOT}/usr/include/
                sys_include_dir=${ESYSROOT}/usr/include/
                crt_dir=${crt_dir}
                # Windows with MSVC only.
                msvc_lib_dir=
                # Windows with MSVC only.
                kernel32_lib_dir=
                # Haiku only.
                gcc_dir=
        _EOF_
+       if [[ ${?} -ne 0 ]]; then
+               die "Failed to create Zig libc installation info file"
+       fi
 
        declare -g -a ZBS_ARGS_BASE=(
                -j$(zig-build_get_jobs)
                --build-file "${S}/build.zig"
 
                -Dtarget=${ZIG_TARGET}
                -Dcpu=${ZIG_CPU}
                --release=safe
 
                --prefix-exe-dir bin/
                --prefix-lib-dir $(get_libdir)/
                --prefix-include-dir include/
 
                # Should be relative path to make other calls easier,
                # so remove leading slash here.
                --prefix "${EPREFIX:+${EPREFIX#/}/}usr/"
 
                --libc "${T}/zig_libc.txt"
        )
-       [[ "${ZBS_VERBOSE}" != OFF ]] && ZBS_ARGS_BASE+=( --summary all 
--verbose )
+       if [[ "${ZBS_VERBOSE}" != OFF ]]; then
+               ZBS_ARGS_BASE+=( --summary all --verbose )
+       fi
 
        if tc-is-cross-compiler; then
                ZBS_ARGS_BASE+=(
-                       # TODO add to upstream some way to add different search 
prefixes
-                       # for binaries, include paths and libraries, like 
existing --prefix-exe-dir etc.
-                       # Right now std.Build.findProgram will try to search 
here first, before PATH,
-                       # but std.Build.run and std.Build.runAllowFail use 
passed arguments as is and
-                       # uses std.process.Child under the hood, which itself 
can use PATH.
-                       #
-                       # Passing "--search-prefix" when not cross-compiling 
gives these errors:
-                       # install
-                       # └─ install ncdu
-                       #    └─ zig build-exe ncdu ReleaseSafe native 5 errors
-                       # error: ld.lld: /usr/lib64/Scrt1.o is incompatible 
with elf32-i386
-                       # error: ld.lld: /usr/lib64/crti.o is incompatible with 
elf32-i386
-                       # error: ld.lld: 
/var/tmp/portage/sys-fs/ncdu-2.6-r1/temp/zig-cache/local/o/21d4a7d4d6563c46cfe08d129805520f/ncdu.o
 is incompatible with elf32-i386
-                       # error: ld.lld: 
/var/tmp/portage/sys-fs/ncdu-2.6-r1/temp/zig-cache/global/o/15ced1ec04eb7a5fc68f8ee7bed8650c/libcompiler_rt.a(/var/tmp/portage/sys-fs/ncdu-2.6-r1/temp/zig-cache/global/o/15ced1ec04eb7a5fc68f8ee7bed8650c/libcompiler_rt.a.o)
 is incompatible with elf32-i386
-                       # error: ld.lld: /usr/lib64/crtn.o is incompatible with 
elf32-i386
-                       # error: the following command failed with 5 
compilation errors:
-                       # TODO: enable this unconditionnaly
-                       # after rewriting 
https://paste.sr.ht/~bratishkaerik/f68273ccde4e8771413098b302f5ee4961521a09
-                       # to include TODO above, and upstreaming that patch. I 
really don't want to make
-                       # different behaviour for 9999 and 0.13 in this place 
now.
                        --search-prefix "${ESYSROOT}/usr/"
-
-                       # Note: combined with our other options, it's mostly 
not used by Zig itself, only by lld linker.
-                       # Without this option, lld thinks we are not 
cross-compiling
-                       # and will complain that dynamic linker like 
"/lib/ld-linux-aarch64.so.1" does not exist.
-                       #
-                       # "--sysroot" should be passed together with 
"--search-prefix" above, else it gives these errors:
-                       # install
-                       # └─ install ncdu
-                       #   └─ zig build-exe ncdu ReleaseSafe native failure
-                       # error: error: unable to find dynamic system library 
'ncursesw' using strategy 'paths_first'. searched paths: none
-                       # error: unable to find dynamic system library 'tinfow' 
using strategy 'paths_first'. searched paths: none
-                       # error: unable to find dynamic system library 'zstd' 
using strategy 'paths_first'. searched paths: none
-
-                       # error: the following command exited with error code 1:
                        --sysroot "${ESYSROOT}/"
                )
        fi
 }
 
 # @FUNCTION: zig-build_pkg_setup
 # @DESCRIPTION:
 # Sets up environmental variables for Zig toolchain
-# and basic args for Zig Build System.
+# and basic args for Zig Build System.  
 zig-build_pkg_setup() {
        [[ ${MERGE_TYPE} != binary ]] || return 0
 
        zig-toolchain_populate_env_vars
        zig-build_start_base_args
 
        # Used only by 9999 for now, change in upstream did not appear
        # in fixed release yet.
        export PKG_CONFIG="${PKG_CONFIG:-$(tc-getPKG_CONFIG)}"
 
        mkdir "${T}/zig-cache/" || die
        export ZIG_LOCAL_CACHE_DIR="${T}/zig-cache/local/"
        export ZIG_GLOBAL_CACHE_DIR="${T}/zig-cache/global/"
 }
 
 # @FUNCTION: zig-build_live_fetch
 # @USAGE: [<args>...]
 # @DESCRIPTION:
-# Fetches packages, if they exist, to the "ZBS_ECLASS_DIR/p/".
+# Fetches packages, if they exist, to the "ZBS_ECLASS_DIR/p/".  
 # If you have some lazy dependency which is not triggered in default
 # configuration, pass options like you would pass them for regular
-# "ezig build". Try to cover all of them before "src_configure".
+# "ezig build".  Try to cover all of them before "src_configure".  
 # **Note**: this function will be deprecated once/if
-# https://github.com/ziglang/zig/pull/19975 lands.
+# https://github.com/ziglang/zig/pull/19975 lands.  
 #
 # Example:
 # @CODE
 # src_unpack() {
 #      # If there are no lazy dependency:
 #      zig-build_live_fetch
 #
 #      # If there are lazy dependencies that can be triggered together:
 #      zig-build_live_fetch -Denable-wayland -Denable-xwayland
 #
 #      # If there are 2 lazy dependencies that can't be triggered
 #      # together in one call because they conflict:
 #      zig-build_live_fetch -Dmain-backend=opengl
 #      zig-build_live_fetch -Dmain-backend=vulkan
 # }
 # @CODE
 zig-build_live_fetch() {
-       # This function will probably be called before [zig-build_]src_prepare,
-       # like in src_unpack, so this directory might not exist yet.
+       # This function will likely be called in src_unpack,
+       # before [zig-build_]src_prepare, so this directory might not
+       # exist yet.
        mkdir -p "${BUILD_DIR}" > /dev/null || die
        pushd "${BUILD_DIR}" > /dev/null || die
 
        local args=(
-               "${ZBS_ARGS_BASE[@]}"
-
-               --global-cache-dir "${ZBS_ECLASS_DIR}/"
                --fetch
 
+               "${ZBS_ARGS_BASE[@]}"
+
                # Function arguments
                "${@}"
        )
 
-       einfo "ZBS: attempting to live-fetch dependencies using the following 
options: ${args[@]}"
-       ezig build "${args[@]}" || die "ZBS: fetching dependencies failed"
+       einfo "ZBS: live-fetching with following args: ${args[@]}"
+       ezig build --global-cache-dir "${ZBS_ECLASS_DIR}/" "${args[@]}"
 
        popd > /dev/null || die
 }
 
 # @FUNCTION: zig-build_src_unpack
 # @DESCRIPTION:
-# Unpacks every archive in SRC_URI and ZBS_DEPENDENCIES, in that order.
+# Unpacks every archive in SRC_URI and ZBS_DEPENDENCIES,
+# in that order.  
 zig-build_src_unpack() {
        # Thanks to Alfred Wingate "parona" for inspiration here:
        # 
https://gitlab.com/Parona/parona-overlay/-/blob/874dcfe03116574a33ed51f469cc993e98db1fa2/eclass/zig.eclass
 
        if [[ "${#ZBS_DEPENDENCIES_SRC_URI}" -eq 0 ]]; then
                default_src_unpack
                return
        fi
 
        local zig_deps=()
        for dependency in ${!ZBS_DEPENDENCIES[@]}; do
                zig_deps+=("${dependency}")
        done
        # First unpack non-Zig dependencies, so that
        # tarball with all Git dependencies tarballs is unpacked early.
        for dist in ${A}; do
                for zig_dep in "${zig_deps[@]}"; do
                        if [[ "${dist}" == "${zig_dep}" ]]; then
                                continue 2
                        fi
                done
 
                unpack "${dist}"
        done
 
        # Now unpack all Zig dependencies, including those that are
        # now unpacked from tarball-tarball.
        for zig_dep in "${zig_deps[@]}"; do
                # Hide now-spammy hash from stdout
-               ezig fetch --global-cache-dir "${ZBS_ECLASS_DIR}/" 
"${DISTDIR}/${zig_dep}" > /dev/null
+               ezig fetch --global-cache-dir "${ZBS_ECLASS_DIR}/" \
+                       "${DISTDIR}/${zig_dep}" > /dev/null
        done
        einfo "ZBS: ${#zig_deps[@]} dependencies fetched"
 }
 
 # @FUNCTION: zig-build_src_prepare
 # @DESCRIPTION:
 # Calls default "src_prepare" function, creates BUILD_DIR directory
 # and enables or disables system mode (by adding to ZBS_BASE_ARGS),
-# depending on how many packages there are.
+# depending on how many packages there are.  
 #
-# System mode is toggled here and not in "src_unpack" because
-# they could have been fetched by "live_fetch" in live ebuilds instead.
+# System mode is toggled here and not in "src_unpack" because they
+# could have been fetched by "live_fetch" in live ebuilds instead.  
 zig-build_src_prepare() {
        default_src_prepare
 
        mkdir -p "${BUILD_DIR}" || die
        einfo "BUILD_DIR: \"${BUILD_DIR}\""
 
        local system_dir="${ZBS_ECLASS_DIR}/p/"
 
-       # We are using directories count instead of ZBS_DEPENDENCIES.len
-       # because author might have fetched packages using live_fetch instead.
+       # We are using directories.len instead of ZBS_DEPENDENCIES.len
+       # because ebuild might have fetched packages using live_fetch
+       # instead.
        local -a packages=()
-       readarray -d '' -t packages < <(find "${system_dir}" -mindepth 1 
-maxdepth 1 -type d -print0 2> /dev/null || echo -n "")
+       readarray -d '' -t packages < <(find "${system_dir}" -mindepth 1 \
+               -maxdepth 1 -type d -print0 2> /dev/null || echo -n "")
        local count="${#packages[@]}"
 
        if [[ "${count}" -gt 0 ]]; then
                einfo "ZBS: system mode enabled, ${count} packages found"
                ZBS_ARGS_BASE+=( --system "${system_dir}" )
        else
                einfo "ZBS: no packages found, no need to enable system mode"
        fi
 }
 
 # @FUNCTION: zig-build_src_configure
 # @DESCRIPTION:
 # Creates ZBS_ARGS array which can be used in all future phases,
 # by combining ZBS_ARGS_BASE set previously, my_zbs_args from ebuild,
-# and ZBS_ARGS_EXTRA by user, in this order.
+# and ZBS_ARGS_EXTRA by user, in this order.  
 #
-# Specific flags currently only add support for the cross-compilation.
-# They are likely to be extended in the future.
+# Specific flags currently only add support for the cross-compilation.  
+# They are likely to be extended in the future.  
 zig-build_src_configure() {
        # Handle quoted whitespace.
        eval "local -a ZBS_ARGS_EXTRA=( ${ZBS_ARGS_EXTRA} )"
 
-       # Since most arguments in array are also cached by ZBS, we want to
-       # reuse array as much as possible, so prevent modification of it.
+       # Since most arguments in array are also cached by ZBS, we
+       # want to reuse array as much as possible, so prevent
+       # modification of it.
        declare -g -a -r ZBS_ARGS=(
                # Base arguments from pkg_setup/setup_base_args
                "${ZBS_ARGS_BASE[@]}"
 
                # Arguments from ebuild
                "${my_zbs_args[@]}"
 
                # Arguments from user
                "${ZBS_ARGS_EXTRA[@]}"
        )
 
        einfo "Configured with:"
        einfo "${ZBS_ARGS[@]}"
 }
 
 # @FUNCTION: zig-build_src_compile
 # @USAGE: [<args>...]
 # @DESCRIPTION:
-# Calls "ezig build" with previously set ZBS_ARGS.
-# Args passed to this function will be passed after ZBS_ARGS.
+# Calls "ezig build" with previously set ZBS_ARGS.  
+# Args passed to this function will be passed after ZBS_ARGS.  
 zig-build_src_compile() {
        pushd "${BUILD_DIR}" > /dev/null || die
 
-       ezig build "${ZBS_ARGS[@]}" "${@}" || die "ZBS: compilation failed"
+       local args=( "${ZBS_ARGS[@]}" "${@}" )
+       nonfatal ezig build "${args[@]}" || die "ZBS: compilation failed"
 
        popd > /dev/null || die
 }
 
 # @FUNCTION: zig-build_src_test
 # @USAGE: [<args>...]
 # @DESCRIPTION:
-# If "test" step exist, calls "ezig build test" with previously set ZBS_ARGS.
-# Args passed to this function will be passed after ZBS_ARGS.
+# If "test" step exist, calls "ezig build test" with previously set
+# ZBS_ARGS.  
+# Args passed to this function will be passed after ZBS_ARGS.  
 # Note: currently step detection might give false positives in
-# very rare cases, it will be improved in the future.
+# very rare cases, it will be improved in the future.  
 zig-build_src_test() {
        pushd "${BUILD_DIR}" > /dev/null || die
 
+       local args=( "${ZBS_ARGS[@]}" "${@}" )
+
        # UPSTREAM std.testing.tmpDir and a lot of other functions
        # do not respect --cache-dir or ZIG_LOCAL_CACHE_DIR:
        # https://github.com/ziglang/zig/issues/19874
        mkdir -p "zig-cache/" ".zig-cache/" || die
 
        local found_test_step=false
 
        local -a steps
-       readarray steps < <(ezig build --list-steps "${ZBS_ARGS[@]}" || die 
"ZBS: listing steps failed")
+       readarray steps < <(nonfatal ezig build --list-steps "${args[@]}" \
+               || die "ZBS: listing steps failed")
 
        for step in "${steps[@]}"; do
                # UPSTREAM Currently, step name can have any characters in it,
-               # including whitespaces, so splitting names and
-               # descriptions by whitespaces is not enough for some cases.
-               # We probably need something like "--list-steps names_only".
+               # including whitespaces, so splitting names and descriptions
+               # by whitespaces is not enough for some cases.
+               # We probably need something like  "--list-steps names_only".
                # In practice, almost nobody sets such names.
                step_name=$(awk '{print $1}' <<< "${step}")
                if [[ ${step_name} == test ]]; then
                        found_test_step=true
                        break
                fi
        done
 
        if [[ ${found_test_step} == true ]]; then
-               ezig build test "${ZBS_ARGS[@]}" "${@}" || die "ZBS: tests 
failed"
+               nonfatal ezig build test "${args[@]}" \
+                       || die "ZBS: tests failed"
        else
                einfo "Test step not found, skipping."
        fi
 
        popd > /dev/null || die
 }
 
 # @FUNCTION: zig-build_src_install
 # @USAGE: [<args>...]
 # @DESCRIPTION:
-# Calls "ezig build install" with DESTDIR and previously set ZBS_ARGS.
-# Args passed to this function will be passed after ZBS_ARGS.
-# Also installs documentation via "einstalldocs".
+# Calls "ezig build install" with DESTDIR and previously set ZBS_ARGS.  
+# Args passed to this function will be passed after ZBS_ARGS.  
+# Also installs documentation via "einstalldocs".  
 zig-build_src_install() {
        pushd "${BUILD_DIR}" > /dev/null || die
-       DESTDIR="${D}" ezig build install "${ZBS_ARGS[@]}" "${@}" || die "ZBS: 
installing failed"
+       local args=( "${ZBS_ARGS[@]}" "${@}" )
+       DESTDIR="${D}" nonfatal ezig build install "${args[@]}" \
+               || die "ZBS: installing failed"
        popd > /dev/null || die
 
        pushd "${S}" > /dev/null || die
        einstalldocs
        popd > /dev/null || die
 }
 
 fi
 
 if [[ ! ${ZIG_OPTIONAL} ]]; then
        EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure 
src_compile src_test src_install
 fi
diff --git a/eclass/zig-toolchain.eclass b/eclass/zig-toolchain.eclass
index 6297c9fc9cdd..42a3f8ec3706 100644
--- a/eclass/zig-toolchain.eclass
+++ b/eclass/zig-toolchain.eclass
@@ -1,336 +1,375 @@
 # Copyright 2024 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 # @ECLASS: zig-toolchain.eclass
 # @MAINTAINER:
 # Eric Joldasov <bratishkae...@landless-city.net>
 # @AUTHOR:
 # Eric Joldasov <bratishkae...@landless-city.net>
 # @SUPPORTED_EAPIS: 8
-# @BLURB: Prepare Zig toolchain and set environment variables.
+# @BLURB: Prepare Zig toolchain and set environment variables
 # @DESCRIPTION:
-# Prepare Zig toolchain and set environment variables. Supports Zig 0.13+.
+# Prepare Zig toolchain and set environment variables.
+# Supports Zig 0.13+.
 # Does not set any default function, ebuilds must call them manually.
 # Generally, only "zig-toolchain_populate_env_vars" is needed.
 #
 # Intended to be used by ebuilds that call "zig build-exe/lib/obj"
 # or "zig test" directly and by "dev-lang/zig".
 # For ebuilds with ZBS (Zig Build System), it's usually better
 # to inherit zig-build instead, as it has default phases-functions.
 
+if [[ ! ${_ZIG_TOOLCHAIN_ECLASS} ]]; then
+_ZIG_TOOLCHAIN_ECLASS=1
+
 case ${EAPI} in
        8) ;;
        *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
 esac
 
-if [[ ! ${_ZIG_TOOLCHAIN_ECLASS} ]]; then
-_ZIG_TOOLCHAIN_ECLASS=1
-
 inherit edo flag-o-matic
 
 # @ECLASS_VARIABLE: ZIG_SLOT
 # @PRE_INHERIT
 # @REQUIRED
 # @DESCRIPTION:
-# Zig slot that will be used in "ezig" function. Also, if ZIG_OPTIONAL is
-# empty, adds dev-lang/zig and dev-lang/zig-bin dependency to BDEPEND.
-# Must be >= "0.13".
+# Zig slot that will be used in "ezig" function.  Also, if
+# ZIG_OPTIONAL is empty, adds dev-lang/zig and dev-lang/zig-bin
+# dependency to BDEPEND.  Must be >= "0.13".
 #
 # Example:
 # @CODE
 # 0.13
 # @CODE
 #
 # When a new Zig release occurs, it is advisable for maintainers to
-# check whether their ebuild supports that new version. If yes, they
+# check whether their ebuild supports that new version.  If yes, they
 # they should bump ZIG_SLOT to the latest version; if not supported,
-# they need to patch any issues with new version and again bump ZIG_SLOT.
-# This helps to reduce dependencies on outdated Zig versions.
+# they need to patch any issues with new version and again bump
+# ZIG_SLOT.  This helps to reduce dependencies on outdated Zig
+# versions.
 #
 # This policy of "1 exclusive Zig slot" will work until it
 # stabilizes enough (probably near 1.0), then it will be re-evaluated
 # and most likely changed to more common in other eclasses ZIG_MIN/
 # ZIG_MAX form.
 
 # @ECLASS_VARIABLE: ZIG_OPTIONAL
 # @PRE_INHERIT
 # @DEFAULT_UNSET
 # @DESCRIPTION:
-# If set to a non-empty value, all logic in zig-toolchain and zig-build
-# eclasses will be considered optional. No dependencies will be added and
-# no phase functions will be exported.
+# If set to a non-empty value, all logic in zig-toolchain and
+# zig-build eclasses will be considered optional.  No dependencies
+# will be added and no phase functions will be exported.
 #
 # For zig-toolchain.eclass users:
 # You have to add Zig dependency in your BDEPEND manually and call
 # at least "zig-toolchain_populate_env_vars" before using "ezig".
 #
-# For zig-build.eclass users: see documentation in zig-build.eclass instead.
+# For zig-build.eclass users: see documentation in zig-build.eclass
+# instead.
 if [[ ! ${ZIG_OPTIONAL} ]]; then
-       BDEPEND+=" || (
+       BDEPEND="|| (
                dev-lang/zig:${ZIG_SLOT}
                dev-lang/zig-bin:${ZIG_SLOT}
        )"
 fi
 
 # @ECLASS_VARIABLE: ZIG_TARGET
 # @DESCRIPTION:
-# Zig target triple to use. Has the following format:
+# Zig target triple to use.  Has the following format:
 # arch-os[.os_version_range]-abi[.abi_version]
 # Can be passed as:
 # * "-target " option in "zig test" or "zig build-exe/lib/obj",
-# * "-Dtarget=" option in "zig build" (if project uses 
"std.Build.standardTargetOptions").
+# * "-Dtarget=" option in "zig build"
+#   (if project uses "std.Build.standardTargetOptions").
 #
-# Can be overriden by user. If not overriden, then set by 
"zig-toolchain_populate_env_vars".
+# Can be overriden by user.  If not overriden, then set by
+# "zig-toolchain_populate_env_vars".
 #
 # Example:
 # @CODE
-# native # autodetected by Zig
-# x86_64-linux-gnu # Machine running Linux x86_64 system, with glibc
-# x86_64-linux.6.1.12...6.6.16-gnu.2.38 # Similar to above, but versions are 
passed explicitly
-# powerpc64le-linux-musl # Machine running Linux 64-bit little-endian PowerPC 
system, with musl
+# # Autodetected by Zig:
+# native
+# # Machine running Linux x86_64 system, with glibc:
+# x86_64-linux-gnu
+# # Similar to above, but versions are passed explicitly:
+# x86_64-linux.6.1.12...6.6.16-gnu.2.38
+# # Machine running Linux PPC64 little-endian system, with musl
+# powerpc64le-linux-musl
 # @CODE
 #
 
 # @ECLASS_VARIABLE: ZIG_CPU
 # @DESCRIPTION:
-# Zig target CPU and features to use. Has the following format:
+# Zig target CPU and features to use.  Has the following format:
 # family_name(\+enable_feature|\-disable_feature)*
 # Can be passed as:
 # * "-mcpu " option in "zig test" or "zig build-exe/lib/obj",
-# * "-Dcpu=" option in "zig build" (if project uses 
"std.Build.standardTargetOptions").
+# * "-Dcpu=" option in "zig build"
+#   (if project uses "std.Build.standardTargetOptions").
 #
-# Can be overriden by user. If not overriden, then set by 
"zig-toolchain_populate_env_vars".
+# Can be overriden by user.  If not overriden, then set by
+# "zig-toolchain_populate_env_vars".
 #
 # Example:
 # @CODE
-# native # autodetected by Zig
-# znver2 # AMD Zen 2 processor
-# x86_64+x87-sse2" # x86_64 processor, X87 support enabled, SSE2 support 
disabled
+# # Autodetected by Zig:
+# native
+# # AMD Zen 2 processor
+# znver2
+# # x86_64 processor, X87 support enabled, SSE2 support disabled
+# x86_64+x87-sse2
 # @CODE
 
 # @ECLASS_VARIABLE: ZIG_EXE
 # @DESCRIPTION:
 # Absolute path to the used Zig executable.
 #
-# Please note that when passing one flag several times with different values:
-# * to "zig build" in "-Dbar=false -Dbar" form: errors due to conflict of 
flags,
-# * to "zig build" in "-Dbar=false -Dbar=true" form: "bar" becomes a list, 
which is likely not what you (or upstream) want,
-# * to "zig test" or "zig build-exe/lib/obj" in "-fbar -fno-bar" form: latest 
value overwrites values before.
-# Similar situation with other types of options (enums, "std.SemanticVersion", 
integers, strings, etc.)
+# Please note that when passing one flag several times with different
+# values:
+# * (only "zig build") in "-Dbar=false -Dbar" form:
+#   errors due to conflict of flags,
+# * (only "zig build") in "-Dbar=false -Dbar=true" form:
+#   "bar" becomes a list, which is likely not what you want,
+# * in "-fbar -fno-bar" form:
+#   latest value overwrites values before.
+# Example above shows only boolean option, but it is same with other
+# types of options (enums, "std.zig.BuildId", "std.SemanticVersion",
+# integers, strings, etc.).
 #
-# Can be overriden by user. If not overriden, then set by 
"zig-toolchain_populate_env_vars".
+# Can be overriden by user.  If not overriden, then set by
+# "zig-toolchain_populate_env_vars".
 
 # @ECLASS_VARIABLE: ZIG_VER
 # @OUTPUT_VARIABLE
 # @DESCRIPTION:
-# Zig version found during "zig-toolchain_find_installation", as reported in 
dev-lang/zig-${PV} PV part.
+# Zig version found during "zig-toolchain_find_installation",
+# as reported in dev-lang/zig-${PV} PV part.
 #
 # Example:
 # @CODE
 # 0.13.0
 # @CODE
 
 # @FUNCTION: zig-toolchain_get_target
 # @USAGE: <C-style target triple>
 # @DESCRIPTION:
 # Translates C-style target triple (like CHOST or CBUILD)
-# to Zig-style target triple. Some information (like ARM features)
-# is handled by "zig-toolchain_get_cpu". Mostly used during cross-compiling
-# if user does not set ZIG_TARGET variable.
+# to Zig-style target triple.  Some information (like ARM features)
+# is handled by "zig-toolchain_get_cpu".  Mostly used during
+# cross-compiling if user does not set ZIG_TARGET variable.
 #
 # See ZIG_TARGET description for more information.
 zig-toolchain_get_target() {
-       [[ ${#} -eq 1 ]] || die "${FUNCNAME[0]}: exactly one argument must be 
passed"
+       if [[ ${#} -ne 1 ]]; then
+               die "${FUNCNAME[0]}: expected 1 arguments, got ${#}"
+       fi
        local c_target=${1}
        local c_target_prefix=${c_target%%-*}
        local c_target_suffix=${c_target##*-}
 
        local arch os abi
 
        case ${c_target_prefix} in
                i?86)   arch=x86;;
                arm64)  arch=aarch64;;
                arm*)   arch=arm;;
-               *)      arch=${c_target_prefix};;
+               *)              arch=${c_target_prefix};;
        esac
 
        case ${c_target} in
                *linux*)        os=linux;;
                *apple*)        os=macos;;
        esac
 
        case ${c_target_suffix} in
                solaris*)       os=solaris abi=none;;
                darwin*)        abi=none;;
-               *)              abi=${c_target_suffix};;
+               *)                      abi=${c_target_suffix};;
        esac
 
-       [[ ${arch} == arm && ${abi} == gnu ]] && die "${FUNCNAME[0]}: Zig does 
not support old ARM ABI"
+       if [[ ${arch} == arm && ${abi} == gnu ]]; then
+               die "${FUNCNAME[0]}: Zig does not support old ARM ABI"
+       fi
 
        echo ${arch}-${os}-${abi}
 }
 
 
 
 # @FUNCTION: zig-toolchain_get_cpu
 # @USAGE: <C-style target triple>
 # @DESCRIPTION:
 # Translates C-style target triple (like CHOST or CBUILD)
-# to Zig-style target CPU and features. Mostly used to get generic target CPU
-# during cross-compiling if user does not set ZIG_CPU variable.
+# to Zig-style target CPU and features.  Mostly used to get generic
+# target CPU during cross-compiling if user does not set ZIG_CPU
+# variable.
 #
 # See ZIG_CPU description for more information.
 zig-toolchain_get_cpu() {
-       [[ ${#} -eq 1 ]] || die "${FUNCNAME[0]}: exactly one argument must be 
passed"
+       if [[ ${#} -ne 1 ]]; then
+               die "${FUNCNAME[0]}: expected 1 arguments, got ${#}"
+       fi
        local c_target=${1}
        local c_target_prefix=${c_target%%-*}
 
        local base_cpu features=""
 
        case ${c_target_prefix} in
                i?86)                                   
base_cpu=${c_target_prefix};;
                loongarch64)                    base_cpu=generic_la64;;
                powerpc | powerpcle)    base_cpu=ppc;;
                powerpc64)                              base_cpu=ppc64;;
                powerpc64le)                    base_cpu=ppc64le;;
                riscv32)                                base_cpu=generic_rv32;;
                riscv64)                                base_cpu=generic_rv64;;
                *)                                              
base_cpu=generic;;
        esac
 
        case ${c_target_prefix} in
                armv5tel)       features+="+v5te";;
                armv*)          features+="+${c_target_prefix##armv}";;
        esac
 
        case ${c_target_prefix} in
                arm64)  ;;
                arm*)
                        local is_softfloat=$(CTARGET=${c_target} 
tc-tuple-is-softfloat)
                        case ${is_softfloat} in
                                only | yes) features+="+soft_float";;
                                softfp | no) features+="-soft_float";;
                                *) die "${FUNCNAME[0]}: tc-tuple-is-softfloat 
returned unexpected value"
                        esac
                ;;
        esac
 
        echo ${base_cpu}${features}
 }
 
 # @FUNCTION: zig-toolchain_find_installation
 # @DESCRIPTION:
-# Detects suitable Zig installation and sets ZIG_VER and ZIG_EXE variables.
+# Detects suitable Zig installation and sets ZIG_VER and ZIG_EXE
+# variables.
 #
 # See ZIG_EXE and ZIG_VER descriptions for more information.
 zig-toolchain_find_installation() {
        # Adapted from https://github.com/gentoo/gentoo/pull/28986
        # Many thanks to Florian Schmaus (Flowdalic)!
 
        [[ -n ${ZIG_SLOT} ]] || die "${FUNCNAME[0]}: ZIG_SLOT must be set"
        if ver_test "${ZIG_SLOT}" -lt "0.13"; then
                die "${ECLASS}: ZIG_SLOT must be >= 0.13, found ${ZIG_SLOT}"
        fi
 
        einfo "Searching Zig ${ZIG_SLOT}..."
 
        local zig_supported_versions=(
                "9999"
                "0.13.1"
                "0.13.0"
        )
 
-       local selected_path selected_version
-       for selected_version in "${zig_supported_versions[@]}"; do
-               # Compare with ZIG_SLOT (like 0.13)
-               local candidate_slot=$(ver_cut 1-2 ${selected_version})
+       local base_path="${BROOT}/usr/bin"
+
+       local selected_path selected_ver
+       for selected_ver in "${zig_supported_versions[@]}"; do
+               # Check if candidate satisfies ZIG_SLOT condition.
+               local candidate_slot
+               candidate_slot=$(ver_cut 1-2 ${selected_ver})
                if ver_test "${candidate_slot}" -ne ${ZIG_SLOT}; then
-                       # Candidate does not satisfy ZIG_SLOT condition.
                        continue
                fi
 
+               local candidate_path
                # Prefer "dev-lang/zig" over "dev-lang/zig-bin"
-               local candidate_path="${BROOT}/usr/bin/zig-${selected_version}"
+               candidate_path="${base_path}/zig-${selected_ver}"
                if [[ -x "${candidate_path}" ]]; then
                        selected_path="${candidate_path}"
                        break;
                fi
 
-               candidate_path="${BROOT}/usr/bin/zig-bin-${selected_version}"
+               candidate_path="${base_path}/zig-bin-${selected_ver}"
                if [[ -x "${candidate_path}" ]]; then
                        selected_path="${candidate_path}"
                        break;
                fi
        done
 
        if [[ -z "${selected_path}" ]]; then
-               die "Could not find (suitable) Zig installation in 
\"${BROOT}/usr/bin/\""
+               die "Could not find (suitable) Zig at \"${base_path}\""
        fi
 
        export ZIG_EXE="${selected_path}"
-       export ZIG_VER="${selected_version}"
-       # Sanity check, from upstream:
-       # // Check libc++ linkage to make sure Zig was built correctly, but only
-       # // for "env" and "version" to avoid affecting the startup time for
-       # // build-critical commands (check takes about ~10 μs)
-       "${ZIG_EXE}" version > /dev/null || die "Sanity check failed for 
\"${ZIG_EXE}\""
+       export ZIG_VER="${selected_ver}"
+       # Sanity check, comment from upstream:
+       # > Check libc++ linkage to make sure Zig was built correctly,
+       # > but only for "env" and "version" to avoid affecting the
+       # > startup time for build-critical commands
+       # > (check takes about ~10 μs)
+       "${ZIG_EXE}" version > /dev/null \
+               || die "Sanity check failed for \"${ZIG_EXE}\""
 }
 
 # @FUNCTION: zig-toolchain_populate_env_vars
 # @DESCRIPTION:
 # Populates ZIG_TARGET, ZIG_CPU, ZIG_EXE and ZIG_VER environment
 # variables with detected values, or, if user set them already,
 # leaves as-is.
 zig-toolchain_populate_env_vars() {
-       # Should be first because it sets ZIG_VER which might be used in the 
future
-       # when setting ZIG_TARGET and ZIG_CPU variables for incompatible 
versions.
+       # Should be first because it sets ZIG_VER which might be used
+       # in the future when setting ZIG_TARGET and ZIG_CPU variables
+       # for incompatible versions.
        if [[ -z "${ZIG_EXE}" ]]; then
                zig-toolchain_find_installation
        fi
 
        if [[ -z ${ZIG_TARGET} ]]; then
                if tc-is-cross-compiler; then
                        export ZIG_TARGET=$(zig-toolchain_get_target ${CHOST})
                else
                        export ZIG_TARGET=native
                fi
        fi
 
        if [[ -z ${ZIG_CPU} ]]; then
                if tc-is-cross-compiler; then
                        export ZIG_CPU=$(zig-toolchain_get_cpu ${CHOST})
                else
                        export ZIG_CPU=native
                fi
        fi
 
        einfo "ZIG_EXE:    \"${ZIG_EXE}\""
        einfo "ZIG_VER:     ${ZIG_VER}"
        einfo "ZIG_TARGET:  ${ZIG_TARGET}"
        einfo "ZIG_CPU:     ${ZIG_CPU}"
 }
 
 # @FUNCTION: ezig
 # @USAGE: [<args>...]
 # @DESCRIPTION:
-# Runs ZIG_EXE with supplied arguments. Dies if ZIG_EXE is not set.
+# Runs ZIG_EXE with supplied arguments.  Dies if ZIG_EXE is not set or
+# if command exits with error.  Respects `nonfatal`.
 #
-# Always disables progress bar (tree in 0.13+).
-# By default enables ANSI escape codes (colours, etc.), set NO_COLOR
-# environment variable to disable them.
+# Always disables progress tree.  By default enables ANSI escape codes
+# (colours, etc.), user can set NO_COLOR environment variable to
+# disable them.
 ezig() {
-       # Sync description above and comments below with 
"std.io.tty.detectConfig".
-        debug-print-function "${FUNCNAME[0]}" "${@}"
+       # Sync description above and comments below with upstream's
+       # "std.io.tty.detectConfig".
+       debug-print-function "${FUNCNAME[0]}" "${@}"
 
        if [[ -z "${ZIG_EXE}" ]] ; then
                die "${FUNCNAME[0]}: ZIG_EXE is not set. Was 
'zig-toolchain_populate_env_vars' called before using ezig?"
        fi
 
-       # Progress bar (tree in newer versions) are helpful indicators in
-       # TTY, but unfortunately they make Portage logs harder to read in 
plaintext.
-       # We pass "TERM=dumb" here to have clean logs, and CLICOLOR_FORCE (or 
YES_COLOR
-       # until 0.13) to preserve colors.
+       # Progress tree is helpful indicator in TTY, but unfortunately
+       # they make Portage logs harder to read in plaintext. We pass
+       # "TERM=dumb" here to have clean logs, and CLICOLOR_FORCE to
+       # preserve colors.
        # User's NO_COLOR takes precendence over this.
-       TERM=dumb YES_COLOR=1 CLICOLOR_FORCE=1 "${ZIG_EXE}" "${@}"
+       TERM=dumb CLICOLOR_FORCE=1 "${ZIG_EXE}" "${@}" \
+               || die -n "Failed to run command: ${ZIG_EXE} ${@}"
 }
 fi
-- 
2.47.0


Reply via email to