public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Gilles Dartiguelongue" <eva@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gnome:master commit in: eclass/
Date: Sun, 24 May 2015 16:33:06 +0000 (UTC)	[thread overview]
Message-ID: <1432485156.a587649916a3aec02884cff22128493143f64f4d.eva@gentoo> (raw)

commit:     a587649916a3aec02884cff22128493143f64f4d
Author:     Gilles Dartiguelongue <eva <AT> gentoo <DOT> org>
AuthorDate: Sun May 24 14:49:24 2015 +0000
Commit:     Gilles Dartiguelongue <eva <AT> gentoo <DOT> org>
CommitDate: Sun May 24 16:32:36 2015 +0000
URL:        https://gitweb.gentoo.org/proj/gnome.git/commit/?id=a5876499

eclass: import multibuild.eclass

 eclass/multibuild.eclass | 269 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 269 insertions(+)

diff --git a/eclass/multibuild.eclass b/eclass/multibuild.eclass
new file mode 100644
index 0000000..d9a86e9
--- /dev/null
+++ b/eclass/multibuild.eclass
@@ -0,0 +1,269 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/eclass/multibuild.eclass,v 1.20 2014/12/13 08:42:42 mgorny Exp $
+
+# @ECLASS: multibuild
+# @MAINTAINER:
+# Michał Górny <mgorny@gentoo.org>
+# @AUTHOR:
+# Author: Michał Górny <mgorny@gentoo.org>
+# @BLURB: A generic eclass for building multiple variants of packages.
+# @DESCRIPTION:
+# The multibuild eclass aims to provide a generic framework for building
+# multiple 'variants' of a package (e.g. multilib, Python
+# implementations).
+
+case "${EAPI:-0}" in
+	0|1|2|3)
+		die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}"
+		;;
+	4|5)
+		;;
+	*)
+		die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
+		;;
+esac
+
+if [[ ! ${_MULTIBUILD} ]]; then
+
+# @ECLASS-VARIABLE: MULTIBUILD_VARIANTS
+# @DESCRIPTION:
+# An array specifying all enabled variants which multibuild_foreach*
+# can execute the process for.
+#
+# In ebuild, it can be set in global scope. Eclasses should set it
+# locally in function scope to support nesting properly.
+#
+# Example:
+# @CODE
+# python_foreach_impl() {
+#	local MULTIBUILD_VARIANTS=( python{2_5,2_6,2_7} ... )
+#	multibuild_foreach_variant python_compile
+# }
+# @CODE
+
+# @ECLASS-VARIABLE: MULTIBUILD_VARIANT
+# @DESCRIPTION:
+# The current variant which the function was executed for.
+#
+# Example value:
+# @CODE
+# python2_6
+# @CODE
+
+# @ECLASS-VARIABLE: MULTIBUILD_ID
+# @DESCRIPTION:
+# The unique identifier for a multibuild run. In a simple run, it is
+# equal to MULTIBUILD_VARIANT. In a nested multibuild environment, it
+# contains the complete selection tree.
+#
+# It can be used to create variant-unique directories and files.
+#
+# Example value:
+# @CODE
+# amd64-double
+# @CODE
+
+# @ECLASS-VARIABLE: BUILD_DIR
+# @DESCRIPTION:
+# The current build directory. In global scope, it is supposed
+# to contain an 'initial' build directory. If unset, ${S} is used.
+#
+# multibuild_foreach_variant() sets BUILD_DIR locally
+# to variant-specific build directories based on the initial value
+# of BUILD_DIR.
+#
+# Example value:
+# @CODE
+# ${WORKDIR}/foo-1.3-python2_6
+# @CODE
+
+# @FUNCTION: multibuild_foreach_variant
+# @USAGE: [<argv>...]
+# @DESCRIPTION:
+# Run the passed command repeatedly for each of the enabled package
+# variants.
+#
+# Each of the runs will have variant-specific BUILD_DIR set, and output
+# teed to a separate log in ${T}.
+#
+# The function returns 0 if all commands return 0, or the first non-zero
+# exit status otherwise. However, it performs all the invocations
+# nevertheless. It is preferred to call 'die' inside of the passed
+# function.
+multibuild_foreach_variant() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	[[ ${MULTIBUILD_VARIANTS} ]] \
+		|| die "MULTIBUILD_VARIANTS need to be set"
+
+	local bdir=${BUILD_DIR:-${S}}
+
+	# Avoid writing outside WORKDIR if S=${WORKDIR}.
+	[[ ${bdir%%/} == ${WORKDIR%%/} ]] && bdir=${WORKDIR}/build
+
+	local prev_id=${MULTIBUILD_ID:+${MULTIBUILD_ID}-}
+	local ret=0 lret=0 v
+
+	debug-print "${FUNCNAME}: initial build_dir = ${bdir}"
+
+	for v in "${MULTIBUILD_VARIANTS[@]}"; do
+		local MULTIBUILD_VARIANT=${v}
+		local MULTIBUILD_ID=${prev_id}${v}
+		local BUILD_DIR=${bdir%%/}-${v}
+
+		_multibuild_run() {
+			# find the first non-private command
+			local i=1
+			while [[ ${!i} == _* ]]; do
+				(( i += 1 ))
+			done
+
+			[[ ${i} -le ${#} ]] && einfo "${v}: running ${@:${i}}"
+			"${@}"
+		}
+
+		_multibuild_run "${@}" \
+			> >(exec tee -a "${T}/build-${MULTIBUILD_ID}.log") 2>&1
+		lret=${?}
+	done
+	[[ ${ret} -eq 0 && ${lret} -ne 0 ]] && ret=${lret}
+
+	return ${ret}
+}
+
+# @FUNCTION: multibuild_parallel_foreach_variant
+# @USAGE: [<argv>...]
+# @DESCRIPTION:
+# Run the passed command repeatedly for each of the enabled package
+# variants. This used to run the commands in parallel but now it's
+# just a deprecated alias to multibuild_foreach_variant.
+#
+# The function returns 0 if all commands return 0, or the first non-zero
+# exit status otherwise. However, it performs all the invocations
+# nevertheless. It is preferred to call 'die' inside of the passed
+# function.
+multibuild_parallel_foreach_variant() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	multibuild_foreach_variant "${@}"
+}
+
+# @FUNCTION: multibuild_for_best_variant
+# @USAGE: [<argv>...]
+# @DESCRIPTION:
+# Run the passed command once, for the best of the enabled package
+# variants.
+#
+# The run will have a proper, variant-specificBUILD_DIR set, and output
+# teed to a separate log in ${T}.
+#
+# The function returns command exit status.
+multibuild_for_best_variant() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	[[ ${MULTIBUILD_VARIANTS} ]] \
+		|| die "MULTIBUILD_VARIANTS need to be set"
+
+	# bash-4.1 can't handle negative subscripts
+	local MULTIBUILD_VARIANTS=(
+		"${MULTIBUILD_VARIANTS[$(( ${#MULTIBUILD_VARIANTS[@]} - 1 ))]}"
+	)
+	multibuild_foreach_variant "${@}"
+}
+
+# @FUNCTION: multibuild_copy_sources
+# @DESCRIPTION:
+# Create per-variant copies of source tree. The source tree is assumed
+# to be in ${BUILD_DIR}, or ${S} if the former is unset. The copies will
+# be placed in directories matching BUILD_DIRs used by
+# multibuild_foreach().
+multibuild_copy_sources() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	local _MULTIBUILD_INITIAL_BUILD_DIR=${BUILD_DIR:-${S}}
+
+	einfo "Will copy sources from ${_MULTIBUILD_INITIAL_BUILD_DIR}"
+
+	local cp_args=()
+	if cp --reflink=auto --version &>/dev/null; then
+		# enable reflinking if possible to make this faster
+		cp_args+=( --reflink=auto )
+	fi
+
+	_multibuild_create_source_copy() {
+		einfo "${MULTIBUILD_VARIANT}: copying to ${BUILD_DIR}"
+		cp -pr "${cp_args[@]}" \
+			"${_MULTIBUILD_INITIAL_BUILD_DIR}" "${BUILD_DIR}" || die
+	}
+
+	multibuild_foreach_variant _multibuild_create_source_copy
+}
+
+# @FUNCTION: run_in_build_dir
+# @USAGE: <argv>...
+# @DESCRIPTION:
+# Run the given command in the directory pointed by BUILD_DIR.
+run_in_build_dir() {
+	debug-print-function ${FUNCNAME} "${@}"
+	local ret
+
+	[[ ${#} -ne 0 ]] || die "${FUNCNAME}: no command specified."
+	[[ ${BUILD_DIR} ]] || die "${FUNCNAME}: BUILD_DIR not set."
+
+	mkdir -p "${BUILD_DIR}" || die
+	pushd "${BUILD_DIR}" >/dev/null || die
+	"${@}"
+	ret=${?}
+	popd >/dev/null || die
+
+	return ${ret}
+}
+
+# @FUNCTION: multibuild_merge_root
+# @USAGE: <src-root> <dest-root>
+# @DESCRIPTION:
+# Merge the directory tree (fake root) from <src-root> to <dest-root>
+# (the real root). Both directories have to be real, absolute paths
+# (i.e. including ${D}). Source root will be removed.
+multibuild_merge_root() {
+	local src=${1}
+	local dest=${2}
+
+	local ret
+
+	if use userland_BSD; then
+		# Most of BSD variants fail to copy broken symlinks, #447370
+		# also, they do not support --version
+
+		tar -C "${src}" -f - -c . \
+			| tar -x -f - -C "${dest}"
+		[[ ${PIPESTATUS[*]} == '0 0' ]]
+		ret=${?}
+	else
+		local cp_args=()
+
+		if cp -a --version &>/dev/null; then
+			cp_args+=( -a )
+		else
+			cp_args+=( -P -R -p )
+		fi
+
+		if cp --reflink=auto --version &>/dev/null; then
+			# enable reflinking if possible to make this faster
+			cp_args+=( --reflink=auto )
+		fi
+
+		cp "${cp_args[@]}" "${src}"/. "${dest}"/
+		ret=${?}
+	fi
+
+	if [[ ${ret} -ne 0 ]]; then
+		die "${MULTIBUILD_VARIANT:-(unknown)}: merging image failed."
+	fi
+
+	rm -rf "${src}"
+}
+
+_MULTIBUILD=1
+fi


             reply	other threads:[~2015-05-24 16:33 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-24 16:33 Gilles Dartiguelongue [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-08-16 14:16 [gentoo-commits] proj/gnome:master commit in: eclass/ Matt Turner
2021-01-30 20:02 Mart Raudsepp
2021-01-30 20:02 Mart Raudsepp
2019-02-24  8:40 Mart Raudsepp
2019-02-23 20:37 Mart Raudsepp
2018-02-16 16:12 Sobhan Mohammadpour
2018-02-01 10:37 Sobhan Mohammadpour
2018-01-29  7:50 Gilles Dartiguelongue
2018-01-29  7:50 Gilles Dartiguelongue
2017-12-26 12:20 Mart Raudsepp
2017-12-10 18:37 Sobhan Mohammadpour
2017-12-10  4:04 Sobhan Mohammadpour
2017-09-13 22:19 Gilles Dartiguelongue
2016-10-30 11:44 Gilles Dartiguelongue
2016-10-30 11:44 Gilles Dartiguelongue
2016-10-30 11:44 Gilles Dartiguelongue
2016-09-05 22:05 Gilles Dartiguelongue
2015-12-24  1:18 Gilles Dartiguelongue
2015-12-24  1:18 Gilles Dartiguelongue
2015-11-26 22:46 Gilles Dartiguelongue
2015-05-25 16:08 Gilles Dartiguelongue
2015-05-25 16:08 Gilles Dartiguelongue
2015-05-24 16:33 Gilles Dartiguelongue
2015-05-10 21:27 Gilles Dartiguelongue
2014-11-23 22:35 Remi Cardona
2014-11-03 23:24 Gilles Dartiguelongue
2014-11-03 23:24 Gilles Dartiguelongue
2014-11-03 23:24 Gilles Dartiguelongue
2014-11-03 23:24 Gilles Dartiguelongue
2014-11-03 23:24 Gilles Dartiguelongue
2014-11-03 23:24 Gilles Dartiguelongue
2014-11-02 15:58 Gilles Dartiguelongue
2014-04-20 23:44 Gilles Dartiguelongue
2014-04-20 22:57 Gilles Dartiguelongue
2013-12-11 23:44 Gilles Dartiguelongue
2013-01-16 22:56 Gilles Dartiguelongue
2012-12-29 20:21 Gilles Dartiguelongue
2012-12-27 22:54 Gilles Dartiguelongue
2012-12-27 22:51 Gilles Dartiguelongue
2012-12-27 22:51 Gilles Dartiguelongue
2012-12-27 22:19 Gilles Dartiguelongue
2012-12-27 22:19 Gilles Dartiguelongue
2012-12-16 14:16 Gilles Dartiguelongue
2012-12-16 14:16 Gilles Dartiguelongue
2012-12-05 21:59 Alexandre Rostovtsev
2012-12-03 23:43 Gilles Dartiguelongue
2012-12-02 16:02 Gilles Dartiguelongue
2012-12-02 14:50 Gilles Dartiguelongue
2012-12-02 14:50 Gilles Dartiguelongue
2012-12-02 14:50 Gilles Dartiguelongue
2012-12-02 14:50 Gilles Dartiguelongue
2012-11-26 21:35 Gilles Dartiguelongue
2012-11-25 22:38 Gilles Dartiguelongue
2012-11-18 19:11 Gilles Dartiguelongue
2012-11-18 18:50 Gilles Dartiguelongue
2012-11-18 18:50 Gilles Dartiguelongue
2012-11-18 18:25 Gilles Dartiguelongue
2012-10-27  8:42 Gilles Dartiguelongue
2012-09-12 20:23 Alexandre Rostovtsev
2012-09-10  2:17 Alexandre Rostovtsev
2012-05-03  0:03 Alexandre Restovtsev
2012-04-24  3:36 Alexandre Restovtsev
2012-02-26 21:53 Alexandre Restovtsev
2012-02-12 15:32 Gilles Dartiguelongue
2012-01-03 11:56 Priit Laes
2011-12-18  5:26 Alexandre Restovtsev
2011-12-14 19:46 Alexandre Restovtsev
2011-11-15  1:31 Nirbheek Chauhan
2011-11-14  7:01 Alexandre Restovtsev
2011-11-04 20:35 Alexandre Restovtsev
2011-09-27 13:36 Nirbheek Chauhan
2011-09-26  4:46 Alexandre Restovtsev
2011-09-25 20:37 Alexandre Restovtsev
2011-09-20  2:17 Alexandre Restovtsev
2011-09-20  0:12 Alexandre Restovtsev
2011-08-28 18:46 Alexandre Restovtsev
2011-08-24  7:04 Arun Raghavan
2011-08-21  7:06 Alexandre Restovtsev
2011-07-19  0:22 Alexandre Restovtsev
2011-05-08 18:54 Gilles Dartiguelongue
2011-05-08 18:54 Gilles Dartiguelongue
2011-05-08 18:54 Gilles Dartiguelongue
2011-04-21 22:09 Gilles Dartiguelongue
2011-04-20 20:39 Nirbheek Chauhan
2011-04-20 18:58 Nirbheek Chauhan
2011-04-05  0:57 Nirbheek Chauhan
2011-04-05  0:57 Nirbheek Chauhan
2011-03-26  2:17 Nirbheek Chauhan
2011-03-20 22:15 Nirbheek Chauhan
2011-03-20 21:46 Nirbheek Chauhan
2011-03-16 20:20 Nirbheek Chauhan
2011-02-28 10:19 Nirbheek Chauhan
2011-02-25 23:34 Nirbheek Chauhan

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=1432485156.a587649916a3aec02884cff22128493143f64f4d.eva@gentoo \
    --to=eva@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.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