fi
if ! hasq keepwork $FEATURES; then
- rm -f "$PORTAGE_BUILDDIR"/.{exit_status,logid,unpacked} \
+ rm -f "$PORTAGE_BUILDDIR"/.{exit_status,logid,unpacked,prepared} \
"$PORTAGE_BUILDDIR"/.{configured,compiled,tested,packaged}
rm -rf "${PORTAGE_BUILDDIR}/build-info"
trap SIGINT SIGQUIT
}
+abort_prepare() {
+ abort_handler src_prepare $1
+ rm -f "$PORTAGE_BUILDDIR/.prepared"
+ exit 1
+}
+
abort_configure() {
abort_handler src_configure $1
rm -f "$PORTAGE_BUILDDIR/.configured"
exit 1
}
+dyn_prepare() {
+
+ if [[ $PORTAGE_BUILDDIR/.prepared -nt $WORKDIR ]] ; then
+ vecho ">>> It appears that '$PF' is already prepared; skipping."
+ vecho ">>> Remove '$PORTAGE_BUILDDIR/.prepared' to force prepare."
+ return 0
+ fi
+
+ local srcdir
+ if [[ -d $S ]] ; then
+ srcdir=$S
+ else
+ srcdir=$WORKDIR
+ fi
+ cd "$srcdir"
+
+ trap abort_prepare SIGINT SIGQUIT
+
+ ebuild_phase pre_src_prepare
+ ebuild_phase src_prepare
+ touch "$PORTAGE_BUILDDIR"/.prepared
+ ebuild_phase post_src_prepare
+
+ trap SIGINT SIGQUIT
+}
+
dyn_configure() {
if [[ $PORTAGE_BUILDDIR/.configured -nt $WORKDIR ]] ; then
echo " fetch : download source archive(s) and patches"
echo " digest : create a manifest file for the package"
echo " manifest : create a manifest file for the package"
- echo " unpack : unpack/patch sources (auto-fetch if needed)"
+ echo " unpack : unpack sources (auto-dependencies if needed)"
+ echo " prepare : prepare sources (auto-dependencies if needed)"
echo " configure : configure sources (auto-fetch/unpack if needed)"
echo " compile : compile sources (auto-fetch/unpack/configure if needed)"
echo " test : test package (auto-fetch/unpack/configure/compile if needed)"
[ $# -ne 2 ] && die "expected exactly 2 args, got $#: $*"
local eapi=$1
local phase_func=$2
- local default_phases="pkg_nofetch src_unpack src_configure
+ local default_phases="pkg_nofetch src_unpack src_prepare src_configure
src_compile src_install src_test"
local x y default_func=""
eapi0_pkg_nofetch () { _eapi0_pkg_nofetch "$@" ; }
eapi0_src_unpack () { _eapi0_src_unpack "$@" ; }
+ eapi0_src_prepare () { die "$FUNCNAME is not supported" ; }
eapi0_src_configure () { die "$FUNCNAME is not supported" ; }
eapi0_src_compile () { _eapi0_src_compile "$@" ; }
eapi0_src_test () { _eapi0_src_test "$@" ; }
eapi1_pkg_nofetch () { _eapi0_pkg_nofetch "$@" ; }
eapi1_src_unpack () { _eapi0_src_unpack "$@" ; }
+ eapi1_src_prepare () { die "$FUNCNAME is not supported" ; }
eapi1_src_configure () { die "$FUNCNAME is not supported" ; }
eapi1_src_compile () { _eapi1_src_compile "$@" ; }
eapi1_src_test () { _eapi0_src_test "$@" ; }
eapi2_pkg_nofetch () { _eapi0_pkg_nofetch "$@" ; }
eapi2_src_unpack () { _eapi0_src_unpack "$@" ; }
+ eapi2_src_prepare () { true ; }
eapi2_src_configure () { _eapi2_src_configure "$@" ; }
eapi2_src_compile () { _eapi2_src_compile "$@" ; }
eapi2_src_test () { _eapi0_src_test "$@" ; }
| bzip2 -c -f9 > "$PORTAGE_UPDATE_ENV"
fi
;;
- unpack|configure|compile|test|clean|install)
+ unpack|prepare|configure|compile|test|clean|install)
if [[ ${SANDBOX_DISABLED:-0} = 0 ]] ; then
export SANDBOX_ON="1"
else
if hasq --exclude-init-phases $* ; then
unset S _E_DOCDESTTREE_ _E_EXEDESTTREE_
- unset -f pkg_nofetch src_unpack src_configure \
+ unset -f pkg_nofetch src_unpack src_prepare src_configure \
src_compile src_test src_install
if [[ -n $PYTHONPATH ]] ; then
export PYTHONPATH=${PYTHONPATH/${PORTAGE_PYM_PATH}:}
# There's no need to bloat environment.bz2 with internally defined
# functions and variables, so filter them out if possible.
- for x in pkg_setup pkg_nofetch src_unpack src_configure \
+ for x in pkg_setup pkg_nofetch src_unpack src_prepare src_configure \
src_compile src_test src_install pkg_preinst pkg_postinst \
pkg_prerm pkg_postrm ; do
unset -f {,_}default_$x {,_}eapi{0,1,2}_$x
keepdir unpack strip_duplicate_slashes econf einstall \
dyn_setup dyn_unpack dyn_clean into insinto exeinto docinto \
insopts diropts exeopts libopts \
- abort_handler abort_configure abort_compile \
- abort_test abort_install dyn_configure \
+ abort_handler abort_prepare abort_configure abort_compile \
+ abort_test abort_install dyn_prepare dyn_configure \
dyn_compile dyn_test dyn_install \
dyn_preinst dyn_help debug-print debug-print-function \
debug-print-section inherit EXPORT_FUNCTIONS newdepend newrdepend \
<para>
The configure portion of the src_compile function has been
split into a separate function which is named src_configure. The
- src_configure function is called in between the src_unpack and
+ src_configure function is called in-between the src_unpack and
src_compile functions.
</para>
<programlisting>
</section>
</section>
</section>
+<section id='package-ebuild-eapi-2_pre3'>
+ <title>EAPI 2_pre3</title>
+ <section id='package-ebuild-eapi-2-phases'>
+ <title>Phases</title>
+ <section id='package-ebuild-eapi-2-phases-src-prepare'>
+ <title>New src_prepare Phase Function</title>
+ <para>
+ A new src_prepare function is called in-between the src_unpack and
+ src_configure functions, with cwd initially set to $S.
+ </para>
+ </section>
+ </section>
+</section>
__slots__ = ("pkg", "scheduler", "settings") + ("_tree",)
- _phases = ("configure", "compile", "test", "install")
+ _phases = ("prepare", "configure", "compile", "test", "install")
_live_eclasses = frozenset([
"cvs",
pkg = self.pkg
phases = self._phases
- if pkg.metadata["EAPI"] in ("0", "1", "2_pre1"):
- # skip src_configure
+ eapi = pkg.metadata["EAPI"]
+ if eapi in ("0", "1", "2_pre1"):
+ # skip src_prepare and src_configure
+ phases = phases[2:]
+ elif eapi in ("2_pre2",):
+ # skip src_prepare
phases = phases[1:]
for phase in phases:
if retval:
return retval
- if mydo == "configure" and mysettings["EAPI"] in ("0", "1", "2_pre1"):
+ eapi = mysettings["EAPI"]
+
+ if mydo == "configure" and eapi in ("0", "1", "2_pre1"):
+ return os.EX_OK
+
+ if mydo == "prepare" and eapi in ("0", "1", "2_pre1", "2_pre2"):
return os.EX_OK
kwargs = actionmap[mydo]["args"]
def eapi_is_supported(eapi):
eapi = str(eapi).strip()
- if eapi in ("2_pre2", "2_pre1"):
+ if eapi in ("2_pre3", "2_pre2", "2_pre1"):
return True
try:
actionmap_deps={
"setup": [],
"unpack": ["setup"],
- "configure": ["unpack"],
+ "prepare": ["unpack"],
+ "configure": ["prepare"],
"compile":["configure"],
"test": ["compile"],
"install":["test"],
validcommands = ["help","clean","prerm","postrm","cleanrm","preinst","postinst",
"config", "info", "setup", "depend",
"fetch", "fetchall", "digest",
- "unpack", "configure", "compile", "test",
+ "unpack", "prepare", "configure", "compile", "test",
"install", "rpm", "qmerge", "merge",
"package","unmerge", "manifest"]
actionmap = {
"setup": {"cmd":ebuild_sh, "args":{"droppriv":0, "free":1, "sesandbox":0, "fakeroot":0}},
"unpack": {"cmd":ebuild_sh, "args":{"droppriv":droppriv, "free":0, "sesandbox":sesandbox, "fakeroot":0}},
+"prepare": {"cmd":ebuild_sh, "args":{"droppriv":droppriv, "free":0, "sesandbox":sesandbox, "fakeroot":0}},
"configure":{"cmd":ebuild_sh, "args":{"droppriv":droppriv, "free":nosandbox, "sesandbox":sesandbox, "fakeroot":0}},
"compile": {"cmd":ebuild_sh, "args":{"droppriv":droppriv, "free":nosandbox, "sesandbox":sesandbox, "fakeroot":0}},
"test": {"cmd":ebuild_sh, "args":{"droppriv":droppriv, "free":nosandbox, "sesandbox":sesandbox, "fakeroot":0}},
"ACCEPT_KEYWORDS", "ACCEPT_LICENSE",
"CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
"PRELINK_PATH", "PRELINK_PATH_MASK", "PROFILE_ONLY_VARIABLES"]
-EBUILD_PHASES = ["setup", "unpack", "configure",
+EBUILD_PHASES = ["setup", "unpack", "prepare", "configure",
"compile", "test", "install",
"package", "preinst", "postinst","prerm", "postrm",
"nofetch", "config", "info", "other"]