From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id EFA7C1396D0 for ; Sat, 12 Aug 2017 22:24:04 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id DE4981FC08A; Sat, 12 Aug 2017 22:23:58 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 78BCC1FC045 for ; Sat, 12 Aug 2017 22:23:58 +0000 (UTC) Received: from localhost.localdomain (d202-252.icpnet.pl [109.173.202.252]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: mgorny) by smtp.gentoo.org (Postfix) with ESMTPSA id A1B493418D9; Sat, 12 Aug 2017 22:23:56 +0000 (UTC) From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= To: gentoo-dev@lists.gentoo.org Cc: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Subject: [gentoo-dev] [PATCH] out-of-source.eclass: A new eclass to help with out-of-source builds Date: Sun, 13 Aug 2017 00:23:51 +0200 Message-Id: <20170812222351.7592-1-mgorny@gentoo.org> X-Mailer: git-send-email 2.14.1 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Archives-Salt: 140d339a-483d-47e8-83ab-ae58e4463f9a X-Archives-Hash: f45c0e56e9265ff1d0370e652614a70d The out-of-source.eclass is a simple multilib-minimal-style wrapper to perform out of source builds of autotools (and other) packages. It is mostly derived from the function served in the past by autotools-utils since a number of developers found it useful. However, in order to avoid the mistakes of autotools-utils, it is meant to be focused on a single feature and have a better API. This eclass has two use cases: 1. Ensuring that packages are tested with out-of-source builds. 2. Improving consistency between multilib and non-multilib packages. // NB: I've even considered naming the phases multilib_*() to make // switching to multilib even easier. In the most basic form, it just redefines the phases from src_configure() to src_install() with out-of-source wrappers. However, each phase can be overriden using my_src_*() sub-phase that is run inside build dir (alike multilib_src_*() in multilib-minimal). There is also my_src_install_all() for the trailing source-dir actions. // I'm wondering whether ECONF_SOURCE should be declared unconditionally // as it is now in the patch, or if it should only be included // in the default and required to be specified in my_src_configure() // when redefined. FWICS, multilib-minimal currently requires it // explicitly specified all the time. --- eclass/out-of-source.eclass | 123 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 eclass/out-of-source.eclass diff --git a/eclass/out-of-source.eclass b/eclass/out-of-source.eclass new file mode 100644 index 000000000000..e19256426882 --- /dev/null +++ b/eclass/out-of-source.eclass @@ -0,0 +1,123 @@ +# Copyright 1999-2017 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: out-of-source.eclass +# @MAINTAINER: +# Michał Górny +# @BLURB: convenient wrapper to build autotools packages out-of-source +# @DESCRIPTION: +# This eclass provides a minimalistic wrapper interface to easily +# build autotools (and alike) packages out-of-source. It is meant +# to resemble the interface used by multilib-minimal without actually +# requiring the package to be multilib. +# +# For the simplest ebuilds, it is enough to inherit the eclass +# and the new phase functions will automatically build the package +# out-of-source. If you need to redefine one of the default phases +# between src_configure() and src_install(), you need to define +# the sub-phases: my_src_configure(), my_src_compile(), my_src_test() +# and my_src_install() instead that will be run inside the build +# directory. Additionally, my_src_install_all() is provided to perform +# doc-install and other common tasks done in source directory. +# +# Example use: +# @CODE +# inherit out-of-source +# +# my_src_configure() { +# econf \ +# --disable-static +# } +# @CODE + +case ${EAPI} in + 6);; + *) die "EAPI ${EAPI:-0} unsupported (too old)";; +esac + +EXPORT_FUNCTIONS src_configure src_compile src_test src_install + +if [[ ! ${_OUT_OF_SOURCE_ECLASS} ]]; then + +# @FUNCTION: out-of-source_src_configure +# @DESCRIPTION: +# The default src_configure() implementation establishes a BUILD_DIR, +# sets ECONF_SOURCE to the current directory (usually S), and runs +# my_src_configure() (or the default) inside it. +out-of-source_src_configure() { + debug-print-function ${FUNCNAME} "$@" + + # set some BUILD_DIR if we don't have one yet + : "${BUILD_DIR:=${WORKDIR}/${P}_build}" + local ECONF_SOURCE=${PWD} + + mkdir -p "${BUILD_DIR}" || die + pushd "${BUILD_DIR}" >/dev/null || die + if declare -f my_src_configure >/dev/null ; then + my_src_configure + else + default_src_configure + fi + popd >/dev/null || die +} + +# @FUNCTION: out-of-source_src_compile +# @DESCRIPTION: +# The default src_compile() implementation runs my_src_compile() +# (or the default) inside the build directory. +out-of-source_src_compile() { + debug-print-function ${FUNCNAME} "$@" + + pushd "${BUILD_DIR}" >/dev/null || die + if declare -f my_src_compile >/dev/null ; then + my_src_compile + else + default_src_compile + fi + popd >/dev/null || die +} + +# @FUNCTION: out-of-source_src_test +# @DESCRIPTION: +# The default src_test() implementation runs my_src_test() +# (or the default) inside the build directory. +out-of-source_src_test() { + debug-print-function ${FUNCNAME} "$@" + + pushd "${BUILD_DIR}" >/dev/null || die + if declare -f my_src_test >/dev/null ; then + my_src_test + else + default_src_test + fi + popd >/dev/null || die +} + +# @FUNCTION: out-of-source_src_install +# @DESCRIPTION: +# The default src_install() implementation runs my_src_install() +# (or the 'make install' part of the default) inside the build directory, +# followed by a call to my_src_install_all() (or 'einstalldocs' part +# of the default) in the original working directory. +out-of-source_src_install() { + debug-print-function ${FUNCNAME} "$@" + + pushd "${BUILD_DIR}" >/dev/null || die + if declare -f my_src_install >/dev/null ; then + my_src_install + else + if [[ -f Makefile || -f GNUmakefile || -f makefile ]] ; then + emake DESTDIR="${D}" install + fi + fi + popd >/dev/null || die + + if declare -f my_src_install_all >/dev/null ; then + my_src_install_all + else + einstalldocs + fi +} + +_OUT_OF_SOURCE_ECLASS=1 +fi -- 2.14.1