* [gentoo-dev] [PATCH v2] libretro-core.eclass: An eclass to streamline the construction of Libretro core ebuilds
@ 2018-08-09 20:58 Craig Andrews
2018-08-15 0:23 ` [gentoo-dev] " Craig Andrews
0 siblings, 1 reply; 2+ messages in thread
From: Craig Andrews @ 2018-08-09 20:58 UTC (permalink / raw
To: gentoo-dev
I'm proposing the addition of a new eclass, libretro-core.eclass, which
I'll use when adding a number of libretro ebuilds.
This version incorporates all the changes and suggestions posed so far.
The pull request which includes this eclass as well as a few ebuilds
using it (with more to come) can be found at
https://github.com/gentoo/gentoo/pull/9330
Thanks,
~Craig
---
eclass/libretro-core.eclass | 197 ++++++++++++++++++++++++++++++++++++
1 file changed, 197 insertions(+)
create mode 100644 eclass/libretro-core.eclass
diff --git a/eclass/libretro-core.eclass b/eclass/libretro-core.eclass
new file mode 100644
index 000000000000..510f905111ce
--- /dev/null
+++ b/eclass/libretro-core.eclass
@@ -0,0 +1,197 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: libretro-core.eclass
+# @MAINTAINER:
+# candrews@gentoo.org
+# @AUTHOR:
+# Cecil Curry <leycec@gmail.com>
+# Craig Andrews <candrews@gentoo.org>
+# @BLURB: Simplify libretro core ebuilds
+# @DESCRIPTION:
+# The libretro eclass is designed to streamline the construction of
+# ebuilds for Libretro core ebuilds.
+#
+# Libretro cores can be found under https://github.com/libretro/
+#
+# They all use the same basic make based build system, are located
+# in the same github account, and do not release named or numbered
+# versions (so ebuild versions for git commits are keys).
+# This eclass covers those commonalities reducing much duplication
+# between the ebuilds.
+# @EXAMPLE:
+# @CODE
+# EAPI=7
+#
+# LIBRETRO_CORE_NAME="2048"
+# LIBRETRO_COMMIT_SHA="45655d3662e4cbcd8afb28e2ee3f5494a75888de"
+# KEYWORDS="~amd64 ~x86"
+# inherit libretro-core
+#
+# DESCRIPTION="Port of 2048 puzzle game to the libretro API"
+# LICENSE="Unlicense"
+# SLOT="0"
+# @CODE
+
+if [[ -z ${_LIBRETRO_CORE_ECLASS} ]]; then
+_LIBRETRO_CORE_ECLASS=1
+
+IUSE="debug"
+
+# @ECLASS-VARIABLE: LIBRETRO_CORE_NAME
+# @REQUIRED
+# @DESCRIPTION:
+# Name of this Libretro core. The libretro-core_src_install() phase
function
+# will install the shared library
"${S}/${LIBRETRO_CORE_NAME}_libretro.so" as a
+# Libretro core. Defaults to the name of the current package excluding
the
+# "libretro-" prefix (e.g., "mgba" for the package "libretro-mgba").
+: ${LIBRETRO_CORE_NAME:=${PN#libretro-}}
+
+# @ECLASS-VARIABLE: LIBRETRO_COMMIT_SHA
+# @DESCRIPTION:
+# Commit SHA used for SRC_URI will die if not set in <9999 ebuilds.
+# Needs to be set before inherit.
+
+# @ECLASS-VARIABLE: LIBRETRO_REPO_NAME
+# @REQUIRED
+# @DESCRIPTION:
+# Contains the real repo name of the core formatted as
"repouser/reponame".
+# Needs to be set before inherit. Otherwise defaults to
"libretro/${PN}"
+: ${LIBRETRO_REPO_NAME:="libretro/libretro-${LIBRETRO_CORE_NAME}"}
+
+: ${HOMEPAGE:="https://github.com/${LIBRETRO_REPO_NAME}"}
+
+if [[ ${PV} == *9999 ]]; then
+ : ${EGIT_REPO_URI:="https://github.com/${LIBRETRO_REPO_NAME}.git"}
+ inherit git-r3
+else
+ [[ -z "${LIBRETRO_COMMIT_SHA}" ]] && die "LIBRETRO_COMMIT_SHA must be
set before inherit."
+ S="${WORKDIR}/${LIBRETRO_REPO_NAME##*/}-${LIBRETRO_COMMIT_SHA}"
+ :
${SRC_URI:="https://github.com/${LIBRETRO_REPO_NAME}/archive/${LIBRETRO_COMMIT_SHA}.tar.gz
-> ${P}.tar.gz"}
+fi
+inherit flag-o-matic
+
+# @ECLASS-VARIABLE: LIBRETRO_CORE_LIB_FILE
+# @REQUIRED
+# @DESCRIPTION:
+# Absolute path of this Libretro core's shared library.
+: ${LIBRETRO_CORE_LIB_FILE:="${S}/${LIBRETRO_CORE_NAME}_libretro.so"}
+
+case "${EAPI:-0}" in
+ 6|7)
+ EXPORT_FUNCTIONS src_unpack src_prepare src_compile src_install
+ ;;
+ *)
+ die "EAPI=${EAPI} is not supported" ;;
+esac
+
+# @FUNCTION: libretro-core_src_unpack
+# @DESCRIPTION:
+# The libretro-core src_unpack function which is exported.
+#
+# This function retrieves the remote Libretro core info files.
+libretro-core_src_unpack() {
+ # If this is a live ebuild, retrieve this core's remote repository.
+ if [[ ${PV} == *9999 ]]; then
+ git-r3_src_unpack
+ # Add used commit SHA for version information, the above could also
work.
+ LIBRETRO_COMMIT_SHA=$(git -C "${WORKDIR}/${P}" rev-parse HEAD)
+ # Else, unpack this core's local tarball.
+ else
+ default_src_unpack
+ fi
+}
+
+# @FUNCTION: libretro-core_src_prepare
+# @DESCRIPTION:
+# The libretro-core src_prepare function which is exported.
+#
+# This function prepares the source by making custom modifications.
+libretro-core_src_prepare() {
+ ebegin "Attempting to hack Makefiles to use custom cflags"
+ # Populate COMMIT for GIT_VERSION
+ CUSTOM_LIBRETRO_COMMIT_SHA="\" ${LIBRETRO_COMMIT_SHA:0:7}\""
+ local makefile
+ local flags_modified=0
+ local shopt_saved=$(shopt -p nullglob)
+ shopt -s nullglob
+ for makefile in "${S}"/[Mm]akefile*
"${S}"/target-libretro/[Mm]akefile*; do
+ # * Convert CRLF to LF
+ # * Expand *FLAGS to prevent potential self-references
+ # * Where LDFLAGS directly define the link version
+ # script append LDFLAGS and LIBS
+ # * Where SHARED is used to provide shared linking
+ # flags ensure final link command includes LDFLAGS
+ # and LIBS
+ # * Always use $(CFLAGS) when calling $(CC)
+ # * Add short-rev to Makefile
+ [[ -e "${makefile}" ]] && sed \
+ -e 's/\r$//g' \
+ -e "/flags.*=/s:-O[[:digit:]]:${CFLAGS}:g" \
+ -e "/CFLAGS.*=/s:-O[[:digit:]]:${CFLAGS}:g" \
+ -e "/.*,--version-script=.*/s:$: ${LDFLAGS} ${LIBS}:g" \
+ -e "/\$(CC)/s:\(\$(SHARED)\):\1 ${LDFLAGS} ${LIBS}:" \
+ -e 's:\(\$(CC)\):\1 \$(CFLAGS):g' \
+ -e
"s/GIT_VERSION\s.=.*$/GIT_VERSION=${CUSTOM_LIBRETRO_COMMIT_SHA}/g" \
+ -i "${makefile}" || die "Failed to use custom cflags in ${makefile}"
+ done
+ ${shopt_saved}
+ eend
+ export OPTFLAGS="${CFLAGS}"
+ default_src_prepare
+}
+
+# @VARIABLE: myemakeargs
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Optional emake arguments as a bash array. Should be defined before
calling
+# src_compile.
+# @CODE
+# src_compile() {
+# local myemakeargs=(
+# $(usex neon "HAVE_NEON=1" "")
+# )
+# libretro-core_src_configure
+# }
+# @CODE
+
+# @FUNCTION: libretro-core_src_compile
+# @DESCRIPTION:
+# The libretro-core src_compile function which is exported.
+#
+# This function compiles the shared library for this Libretro core.
+libretro-core_src_compile() {
+ # most (if not all) libretro makefiles use DEBUG=1
+ # to enable additional debug features.
+ emake CC=$(tc-getCC) CXX=$(tc-getCXX) \
+ $(usex debug "DEBUG=1" "") "${myemakeargs[@]}" \
+ $([[ -f makefile.libretro ]] && echo '-f makefile.libretro') \
+ $([[ -f Makefile.libretro ]] && echo '-f Makefile.libretro')
+}
+
+# @FUNCTION: libretro-core_src_install
+# @DESCRIPTION:
+# The libretro-core src_install function which is exported.
+#
+# This function installs the shared library for this Libretro core.
+libretro-core_src_install() {
+ # Absolute path of the directory containing Libretro shared libraries.
+ local LIBRETRO_LIB_DIR="/usr/$(get_libdir)/libretro"
+ # If this core's shared library exists, install that.
+ if [[ -f "${LIBRETRO_CORE_LIB_FILE}" ]]; then
+ insinto "${LIBRETRO_LIB_DIR}"
+ doexe "${LIBRETRO_CORE_LIB_FILE}"
+ else
+ # Basename of this library.
+ local lib_basename="${LIBRETRO_CORE_LIB_FILE##*/}"
+
+ # Absolute path to which this library was installed.
+ local lib_file_target="${ED}${LIBRETRO_LIB_DIR}/${lib_basename}"
+
+ # If this library was *NOT* installed, fail.
+ [[ -f "${lib_file_target}" ]] ||
+ die "Libretro core shared library \"${lib_file_target}\" not
installed."
+ fi
+}
+
+fi # end _LIBRETRO_CORE_ECLASS guard
--
2.18.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [gentoo-dev] Re: [PATCH v2] libretro-core.eclass: An eclass to streamline the construction of Libretro core ebuilds
2018-08-09 20:58 [gentoo-dev] [PATCH v2] libretro-core.eclass: An eclass to streamline the construction of Libretro core ebuilds Craig Andrews
@ 2018-08-15 0:23 ` Craig Andrews
0 siblings, 0 replies; 2+ messages in thread
From: Craig Andrews @ 2018-08-15 0:23 UTC (permalink / raw
To: gentoo-dev
On 09.08.2018 16:58, Craig Andrews wrote:
> I'm proposing the addition of a new eclass, libretro-core.eclass,
> which I'll use when adding a number of libretro ebuilds.
>
> This version incorporates all the changes and suggestions posed so far.
>
> The pull request which includes this eclass as well as a few ebuilds
> using it (with more to come) can be found at
> https://github.com/gentoo/gentoo/pull/9330
>
> Thanks,
> ~Craig
>
> ---
> eclass/libretro-core.eclass | 197 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 197 insertions(+)
> create mode 100644 eclass/libretro-core.eclass
>
> diff --git a/eclass/libretro-core.eclass b/eclass/libretro-core.eclass
> new file mode 100644
> index 000000000000..510f905111ce
> --- /dev/null
> +++ b/eclass/libretro-core.eclass
> @@ -0,0 +1,197 @@
> +# Copyright 1999-2018 Gentoo Foundation
> +# Distributed under the terms of the GNU General Public License v2
> +
> +# @ECLASS: libretro-core.eclass
> +# @MAINTAINER:
> +# candrews@gentoo.org
> +# @AUTHOR:
> +# Cecil Curry <leycec@gmail.com>
> +# Craig Andrews <candrews@gentoo.org>
> +# @BLURB: Simplify libretro core ebuilds
> +# @DESCRIPTION:
> +# The libretro eclass is designed to streamline the construction of
> +# ebuilds for Libretro core ebuilds.
> +#
> +# Libretro cores can be found under https://github.com/libretro/
> +#
> +# They all use the same basic make based build system, are located
> +# in the same github account, and do not release named or numbered
> +# versions (so ebuild versions for git commits are keys).
> +# This eclass covers those commonalities reducing much duplication
> +# between the ebuilds.
> +# @EXAMPLE:
> +# @CODE
> +# EAPI=7
> +#
> +# LIBRETRO_CORE_NAME="2048"
> +# LIBRETRO_COMMIT_SHA="45655d3662e4cbcd8afb28e2ee3f5494a75888de"
> +# KEYWORDS="~amd64 ~x86"
> +# inherit libretro-core
> +#
> +# DESCRIPTION="Port of 2048 puzzle game to the libretro API"
> +# LICENSE="Unlicense"
> +# SLOT="0"
> +# @CODE
> +
> +if [[ -z ${_LIBRETRO_CORE_ECLASS} ]]; then
> +_LIBRETRO_CORE_ECLASS=1
> +
> +IUSE="debug"
> +
> +# @ECLASS-VARIABLE: LIBRETRO_CORE_NAME
> +# @REQUIRED
> +# @DESCRIPTION:
> +# Name of this Libretro core. The libretro-core_src_install() phase
> function
> +# will install the shared library
> "${S}/${LIBRETRO_CORE_NAME}_libretro.so" as a
> +# Libretro core. Defaults to the name of the current package excluding
> the
> +# "libretro-" prefix (e.g., "mgba" for the package "libretro-mgba").
> +: ${LIBRETRO_CORE_NAME:=${PN#libretro-}}
> +
> +# @ECLASS-VARIABLE: LIBRETRO_COMMIT_SHA
> +# @DESCRIPTION:
> +# Commit SHA used for SRC_URI will die if not set in <9999 ebuilds.
> +# Needs to be set before inherit.
> +
> +# @ECLASS-VARIABLE: LIBRETRO_REPO_NAME
> +# @REQUIRED
> +# @DESCRIPTION:
> +# Contains the real repo name of the core formatted as
> "repouser/reponame".
> +# Needs to be set before inherit. Otherwise defaults to
> "libretro/${PN}"
> +: ${LIBRETRO_REPO_NAME:="libretro/libretro-${LIBRETRO_CORE_NAME}"}
> +
> +: ${HOMEPAGE:="https://github.com/${LIBRETRO_REPO_NAME}"}
> +
> +if [[ ${PV} == *9999 ]]; then
> + : ${EGIT_REPO_URI:="https://github.com/${LIBRETRO_REPO_NAME}.git"}
> + inherit git-r3
> +else
> + [[ -z "${LIBRETRO_COMMIT_SHA}" ]] && die "LIBRETRO_COMMIT_SHA must
> be set before inherit."
> + S="${WORKDIR}/${LIBRETRO_REPO_NAME##*/}-${LIBRETRO_COMMIT_SHA}"
> + :
> ${SRC_URI:="https://github.com/${LIBRETRO_REPO_NAME}/archive/${LIBRETRO_COMMIT_SHA}.tar.gz
> -> ${P}.tar.gz"}
> +fi
> +inherit flag-o-matic
> +
> +# @ECLASS-VARIABLE: LIBRETRO_CORE_LIB_FILE
> +# @REQUIRED
> +# @DESCRIPTION:
> +# Absolute path of this Libretro core's shared library.
> +: ${LIBRETRO_CORE_LIB_FILE:="${S}/${LIBRETRO_CORE_NAME}_libretro.so"}
> +
> +case "${EAPI:-0}" in
> + 6|7)
> + EXPORT_FUNCTIONS src_unpack src_prepare src_compile src_install
> + ;;
> + *)
> + die "EAPI=${EAPI} is not supported" ;;
> +esac
> +
> +# @FUNCTION: libretro-core_src_unpack
> +# @DESCRIPTION:
> +# The libretro-core src_unpack function which is exported.
> +#
> +# This function retrieves the remote Libretro core info files.
> +libretro-core_src_unpack() {
> + # If this is a live ebuild, retrieve this core's remote repository.
> + if [[ ${PV} == *9999 ]]; then
> + git-r3_src_unpack
> + # Add used commit SHA for version information, the above could also
> work.
> + LIBRETRO_COMMIT_SHA=$(git -C "${WORKDIR}/${P}" rev-parse HEAD)
> + # Else, unpack this core's local tarball.
> + else
> + default_src_unpack
> + fi
> +}
> +
> +# @FUNCTION: libretro-core_src_prepare
> +# @DESCRIPTION:
> +# The libretro-core src_prepare function which is exported.
> +#
> +# This function prepares the source by making custom modifications.
> +libretro-core_src_prepare() {
> + ebegin "Attempting to hack Makefiles to use custom cflags"
> + # Populate COMMIT for GIT_VERSION
> + CUSTOM_LIBRETRO_COMMIT_SHA="\" ${LIBRETRO_COMMIT_SHA:0:7}\""
> + local makefile
> + local flags_modified=0
> + local shopt_saved=$(shopt -p nullglob)
> + shopt -s nullglob
> + for makefile in "${S}"/[Mm]akefile*
> "${S}"/target-libretro/[Mm]akefile*; do
> + # * Convert CRLF to LF
> + # * Expand *FLAGS to prevent potential self-references
> + # * Where LDFLAGS directly define the link version
> + # script append LDFLAGS and LIBS
> + # * Where SHARED is used to provide shared linking
> + # flags ensure final link command includes LDFLAGS
> + # and LIBS
> + # * Always use $(CFLAGS) when calling $(CC)
> + # * Add short-rev to Makefile
> + [[ -e "${makefile}" ]] && sed \
> + -e 's/\r$//g' \
> + -e "/flags.*=/s:-O[[:digit:]]:${CFLAGS}:g" \
> + -e "/CFLAGS.*=/s:-O[[:digit:]]:${CFLAGS}:g" \
> + -e "/.*,--version-script=.*/s:$: ${LDFLAGS} ${LIBS}:g" \
> + -e "/\$(CC)/s:\(\$(SHARED)\):\1 ${LDFLAGS} ${LIBS}:" \
> + -e 's:\(\$(CC)\):\1 \$(CFLAGS):g' \
> + -e
> "s/GIT_VERSION\s.=.*$/GIT_VERSION=${CUSTOM_LIBRETRO_COMMIT_SHA}/g" \
> + -i "${makefile}" || die "Failed to use custom cflags in
> ${makefile}"
> + done
> + ${shopt_saved}
> + eend
> + export OPTFLAGS="${CFLAGS}"
> + default_src_prepare
> +}
> +
> +# @VARIABLE: myemakeargs
> +# @DEFAULT_UNSET
> +# @DESCRIPTION:
> +# Optional emake arguments as a bash array. Should be defined before
> calling
> +# src_compile.
> +# @CODE
> +# src_compile() {
> +# local myemakeargs=(
> +# $(usex neon "HAVE_NEON=1" "")
> +# )
> +# libretro-core_src_configure
> +# }
> +# @CODE
> +
> +# @FUNCTION: libretro-core_src_compile
> +# @DESCRIPTION:
> +# The libretro-core src_compile function which is exported.
> +#
> +# This function compiles the shared library for this Libretro core.
> +libretro-core_src_compile() {
> + # most (if not all) libretro makefiles use DEBUG=1
> + # to enable additional debug features.
> + emake CC=$(tc-getCC) CXX=$(tc-getCXX) \
> + $(usex debug "DEBUG=1" "") "${myemakeargs[@]}" \
> + $([[ -f makefile.libretro ]] && echo '-f makefile.libretro') \
> + $([[ -f Makefile.libretro ]] && echo '-f Makefile.libretro')
> +}
> +
> +# @FUNCTION: libretro-core_src_install
> +# @DESCRIPTION:
> +# The libretro-core src_install function which is exported.
> +#
> +# This function installs the shared library for this Libretro core.
> +libretro-core_src_install() {
> + # Absolute path of the directory containing Libretro shared
> libraries.
> + local LIBRETRO_LIB_DIR="/usr/$(get_libdir)/libretro"
> + # If this core's shared library exists, install that.
> + if [[ -f "${LIBRETRO_CORE_LIB_FILE}" ]]; then
> + insinto "${LIBRETRO_LIB_DIR}"
> + doexe "${LIBRETRO_CORE_LIB_FILE}"
> + else
> + # Basename of this library.
> + local lib_basename="${LIBRETRO_CORE_LIB_FILE##*/}"
> +
> + # Absolute path to which this library was installed.
> + local lib_file_target="${ED}${LIBRETRO_LIB_DIR}/${lib_basename}"
> +
> + # If this library was *NOT* installed, fail.
> + [[ -f "${lib_file_target}" ]] ||
> + die "Libretro core shared library \"${lib_file_target}\" not
> installed."
> + fi
> +}
> +
> +fi # end _LIBRETRO_CORE_ECLASS guard
Merged with a few tweaks: commit
532441d38e4bc6fe2445385ab177f7ed6b1ec2c1
Thank you to everyone who reviewed this work and provided feedback!
~Craig
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-08-15 0:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-09 20:58 [gentoo-dev] [PATCH v2] libretro-core.eclass: An eclass to streamline the construction of Libretro core ebuilds Craig Andrews
2018-08-15 0:23 ` [gentoo-dev] " Craig Andrews
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox