• [gentoo-dev] Re: [PATCH 2/2] rebar3.eclass: add new eclass

    From Anna (cybertailor) Vyalkova@21:1/5 to Florian Schmaus on Thu Jul 11 05:40:01 2024
    On 2024-07-10 09:19, Florian Schmaus wrote:
    From: Florian Schmaus <flow@gentoo.org>

    Add a new eclass for dev-util/rebar:3, based on the work of Anna
    Vyalkova in ::guru (thanks!).

    There's also rebar3.eclass in lanodanOverlay, hereby CC-ing Haelwenn on
    this.

    The Erlang/OTP ecosystem is moving to Rebar3. Upstreams start to drop
    support for Rebar2, or at least consider it.

    Signed-off-by: Florian Schmaus <flow@gentoo.org>
    ---
    eclass/rebar3.eclass | 204 +++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 204 insertions(+)
    create mode 100644 eclass/rebar3.eclass

    diff --git a/eclass/rebar3.eclass b/eclass/rebar3.eclass
    new file mode 100644
    index 000000000000..83363ab54602
    --- /dev/null
    +++ b/eclass/rebar3.eclass
    @@ -0,0 +1,204 @@
    +# Copyright 1999-2024 Gentoo Authors
    +# Distributed under the terms of the GNU General Public License v2
    +
    +# @ECLASS: rebar3.eclass
    +# @MAINTAINER:
    +# Florian Schmaus <flow@gentoo.org>
    +# @AUTHOR:
    +# Amadeusz Żołnowski <aidecoe@gentoo.org>
    +# Anna (cybertailor) Vyalkova <cyber+gentoo@sysrq.in>
    +# @SUPPORTED_EAPIS: 8
    +# @PROVIDES: rebar-utils
    +# @BLURB: Build Erlang/OTP projects using dev-util/rebar:3.
    +# @DESCRIPTION:
    +# An eclass providing functions to build Erlang/OTP projects using
    +# dev-util/rebar:3.
    +#
    +# rebar is a tool which tries to resolve dependencies itself which is by
    +# cloning remote git repositories. Dependent projects are usually expected to >+# be in sub-directory 'deps' rather than looking at system Erlang lib
    +# directory. Projects relying on rebar usually don't have 'install' make
    +# targets. The eclass workarounds some of these problems. It handles
    +# installation in a generic way for Erlang/OTP structured projects.
    +
    +case ${EAPI} in
    + 8) ;;
    + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
    +esac
    +
    +if [[ -z ${_REBAR3_ECLASS} ]]; then
    +_REBAR3_ECLASS=1
    +
    +inherit edo rebar-utils
    +
    +RDEPEND="dev-lang/erlang:="
    +DEPEND="${RDEPEND}"
    +BDEPEND="
    + dev-util/rebar:3
    + >=sys-apps/gawk-4.1
    +"
    +
    +# @ECLASS_VARIABLE: REBAR_PROFILE
    +# @DESCRIPTION:
    +# Rebar profile to use.
    +: "${REBAR_PROFILE:=default}"
    +
    +# @ECLASS_VARIABLE: REBAR_APP_SRC
    +# @DESCRIPTION:
    +# Relative path to .app.src description file.
    +: "${REBAR_APP_SRC:=src/${PN}.app.src}"
    +
    +# @FUNCTION: get_erl_libs
    +# @RETURN: the path to Erlang lib directory
    +# @DESCRIPTION:
    +# Get the full path without EPREFIX to Erlang lib directory.
    +get_erl_libs() {
    + echo "/usr/$(get_libdir)/erlang/lib"
    +}
    +
    +# @FUNCTION: _rebar_find_dep
    +# @INTERNAL
    +# @USAGE: <project_name>
    +# @RETURN: 0 success, 1 dependency not found, 2 multiple versions found
    +# @DESCRIPTION:
    +# Find a Erlang package/project by name in Erlang lib directory. Project
    +# directory is usually suffixed with version. It is matched to '<project_name>'
    +# or '<project_name>-*'.
    +_rebar_find_dep() {
    + local pn="${1}"
    + local p
    + local result
    +
    + pushd "${EPREFIX}$(get_erl_libs)" >/dev/null || return 1
    + for p in ${pn} ${pn}-*; do
    + if [[ -d ${p} ]]; then
    + # Ensure there's at most one matching.
    + [[ ${result} ]] && return 2
    + result="${p}"
    + fi
    + done
    + popd >/dev/null || die
    +
    + [[ ${result} ]] || return 1
    + echo "${result}"
    +}
    +
    +# @FUNCTION: erebar3
    +# @USAGE: <targets>
    +# @DESCRIPTION:
    +# Run rebar with verbose flag. Die on failure.
    +erebar3() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + (( $# > 0 )) || die "erebar: at least one target is required"

    Oversight, should be ${FUNCNAME} instead of "erebar" (old name).

    +
    + case ${1} in
    + eunit|ct)
    + local -x ERL_LIBS="." ;;
    + *)
    + local -x ERL_LIBS="${EPREFIX}$(get_erl_libs)" ;;
    + esac
    +
    + edo rebar3 "$@"
    +}
    +
    +# @FUNCTION: rebar3_src_prepare
    +# @DESCRIPTION:
    +# Prevent rebar from fetching and compiling dependencies. Set version in

    Ditto.

    +# project description file if it's not set.
    +#
    +# Existence of rebar.config is optional, but file description file must exist >+# at 'src/${PN}.app.src'.
    +rebar3_src_prepare() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + default_src_prepare
    + rebar_set_vsn
    +
    + if [[ -f rebar.lock ]]; then
    + rm rebar.lock || die
    + fi
    +
    + if [[ -f rebar.config ]]; then
    + rebar_disable_coverage
    + rebar_remove_deps
    + fi
    +}
    +
    +# @FUNCTION: rebar3_src_configure
    +# @DESCRIPTION:
    +# Configure with ERL_LIBS set.
    +rebar3_src_configure() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + local -x ERL_LIBS="${EPREFIX}$(get_erl_libs)"
    + default_src_configure
    +}
    +
    +# @FUNCTION: rebar3_src_compile
    +# @DESCRIPTION:
    +# Compile project with rebar.

    Ditto.

    +rebar3_src_compile() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + erebar3 as "${REBAR_PROFILE}" release --all
    +}
    +
    +# @FUNCTION: rebar3_src_test
    +# @DESCRIPTION:
    +# Run unit tests.
    +rebar3_src_test() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + erebar3 eunit -v
    +}
    +
    +# @FUNCTION: rebar3_install_lib
    +# @USAGE: <dir>
    +# @DESCRIPTION:
    +# Install BEAM files, include headers and native libraries.
    +#
    +# Function expects that project conforms to Erlang/OTP structure. >+rebar3_install_lib() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + local dest="$(get_erl_libs)/${P}"
    +
    + pushd "${1?}" >/dev/null || die
    + for dir in ebin include priv; do
    + if [[ -d ${dir} && ! -L ${dir} ]]; then
    + cp -pR "${dir}" "${ED%/}${dest}/" || die "failed to install ${dir}/"
    + fi
    + done
    + popd >/dev/null || die
    +}
    +
    +# @FUNCTION: rebar3_src_install
    +# @DESCRIPTION:
    +# Install built release or library.
    +#
    +# Function expects that project conforms to Erlang/OTP structure. >+rebar3_src_install() {
    + debug-print-function ${FUNCNAME} "${@}"
    +
    + pushd "_build/${REBAR_PROFILE}" >/dev/null || die
    + if [[ -d rel/${PN} ]]; then
    + if ! declare -f rebar3_install_release >/dev/null; then
    + die "${FUNCNAME}: a custom function named 'rebar3_install_release' is required to install a release"
    + fi
    + pushd rel/${PN} >/dev/null || die
    + rebar3_install_release || die
    + popd >/dev/null || die
    + elif [[ -d lib/${PN} ]]; then
    + rebar3_install_lib lib/${PN}
    + else
    + die "No releases or libraries to install"
    + fi
    + popd >/dev/null || die
    +
    + einstalldocs
    +}
    +
    +fi
    +
    +EXPORT_FUNCTIONS src_prepare src_compile src_test src_install
    --
    2.44.2


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Eli Schwartz@21:1/5 to All on Mon Jul 15 04:50:01 2024
    This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------Ejm8DbM07lG45wJTPdpSkAcT
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: quoted-printable

    On 7/10/24 11:38 PM, Anna (cybertailor) Vyalkova wrote:
    On 2024-07-10 09:19, Florian Schmaus wrote:
    From: Florian Schmaus <flow@gentoo.org>

    Add a new eclass for dev-util/rebar:3, based on the work of Anna
    Vyalkova in ::guru (thanks!).

    There's also rebar3.eclass in lanodanOverlay, hereby CC-ing Haelwenn on
    this.

    The Erlang/OTP ecosystem is moving to Rebar3. Upstreams start to drop
    support for Rebar2, or at least consider it.


    Hello.

    I can't find the first part of this email thread, including the actual submission of the eclass for review to the mailing list. Was this a
    private conversation?

    I notice that it *has* been committed by Flow to ::gentoo already, and
    your request for Haelwenn's feedback hasn't yet been answered.


    --
    Eli Schwartz


    --------------Ejm8DbM07lG45wJTPdpSkAcT--

    -----BEGIN PGP SIGNATURE-----

    wnsEABYIACMWIQTnFNnmK0TPZHnXm3qEp9ErcA0vVwUCZpSL/AUDAAAAAAAKCRCEp9ErcA0vVzgA AQCHeEZJgbIlDKdrUVyIUK+SytcatU0Fiy937YkGgxnNRAEA6o06UkEaSrCuZjhEXJ5LRUOg8URV nXsugOnm6PS42wg=
    =aogX
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)