commit: 2b2b50543122b1e068cac963f70de19cc3f50dd4 Author: Anna (cybertailor) Vyalkova <cyber+gentoo <AT> sysrq <DOT> in> AuthorDate: Tue Nov 8 16:12:14 2022 +0000 Commit: Anna Vyalkova <cyber+gentoo <AT> sysrq <DOT> in> CommitDate: Tue Nov 8 17:11:30 2022 +0000 URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=2b2b5054
crystal-utils.eclass: new eclass Signed-off-by: Anna (cybertailor) Vyalkova <cyber+gentoo <AT> sysrq.in> eclass/crystal-utils.eclass | 124 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/eclass/crystal-utils.eclass b/eclass/crystal-utils.eclass new file mode 100644 index 000000000..cb67682a6 --- /dev/null +++ b/eclass/crystal-utils.eclass @@ -0,0 +1,124 @@ +# Copyright 2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: crystal-utils.eclass +# @MAINTAINER: +# Anna <[email protected]> +# @AUTHOR: +# Anna <[email protected]> +# @SUPPORTED_EAPIS: 8 +# @BLURB: utility functions for Crystal packages +# @DESCRIPTION: +# A utility eclass providing functions to invoke Crystal. +# +# This eclass does not set any metadata variables nor export any phase, so it +# can be inherited safely. +# +# All helper functions die on failure and support being called via 'nonfatal'. + +case ${EAPI} in + 8) ;; + *) die "${ECLASS}: EAPI ${EAPI} unsupported." +esac + +if [[ ! ${_CRYSTAL_UTILS_ECLASS} ]]; then +_CRYSTAL_UTILS_ECLASS=1 + +inherit edo flag-o-matic + +# @ECLASS_VARIABLE: CRYSTAL_DEPS +# @OUTPUT_VARIABLE +# @DESCRIPTION: +# This is an eclass-generated Crystal dependency string. +CRYSTAL_DEPS=" + || ( + dev-lang/crystal + dev-lang/crystal-bin + ) +" + +# @FUNCTION: _crystal_get_colors_opt +# @INTERNAL +# @RETURN: "--no-color" if colors should be disabled, empty string otherwise +_crystal_get_colors_opt() { + if [[ ${NOCOLOR} == "true" || ${NOCOLOR} == "yes" ]]; then + echo "--no-color" + fi +} + +# @FUNCTION: _crystal_get_debug_opt +# @INTERNAL +# @RETURN: "--debug" if USE=debug, "--no-debug" otherwise +_crystal_get_debug_opt() { + if has debug ${IUSE} && use debug; then + echo "--debug" + else + echo "--no-debug" + fi +} + +# @FUNCTION: crystal_configure +# @DESCRIPTION: +# Set Crystal environment variables to match user settings. +# +# Must be run or ecrystal/eshards will fail. +crystal_configure() { + debug-print-function ${FUNCNAME} "${@}" + + # avoid possible sandbox violation + export CRYSTAL_CACHE_DIR="${T}/crystal" + export SHARDS_CACHE_PATH="${T}/shards" + + local args=( + --link-flags="\"${LDFLAGS}\"" + --release + --progress + $(_crystal_get_debug_opt) + $(_crystal_get_colors_opt) + $(is-flagq -mcpu && echo "--mcpu=$(get-flag mcpu)") + $(is-flagq -mcmodel && echo "--mcmodel=$(get-flag mcmodel)") + # TODO: --mattr + ) + + export CRYSTAL_OPTS="${args[@]}" + + _CRYSTAL_CONFIGURE_HAS_RUN=1 +} + +# @FUNCTION: ecrystal +# @USAGE: [<args>...] +# @DESCRIPTION: +# Call crystal, passing supplied arguments. +ecrystal() { + debug-print-function ${FUNCNAME} "${@}" + + [[ ${_CRYSTAL_CONFIGURE_HAS_RUN} ]] || \ + die "${FUNCNAME}: crystal_configure has not been run" + + mkdir -p "${CRYSTAL_CACHE_DIR}" || die "Creating Crystal cache dir failed" + edo crystal "${@}" +} + +# @FUNCTION: eshards +# @USAGE: [<args>...] +# @DESCRIPTION: +# Call shards, passing the standard set of options, then supplied arguments. +eshards() { + debug-print-function ${FUNCNAME} "${@}" + + [[ ${_CRYSTAL_CONFIGURE_HAS_RUN} ]] || \ + die "${FUNCNAME}: crystal_configure has not been run" + + mkdir -p "${CRYSTAL_CACHE_DIR}" || die "Creating Crystal cache dir failed" + mkdir -p "${SHARDS_CACHE_PATH}" || die "Creating Shards cache dir failed" + + local args=( + --local + --without-development + $(_crystal_get_colors_opt) + ) + + edo shards "${args[@]}" "${@}" +} + +fi
