summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/ebuild.sh44
-rwxr-xr-xbin/isolated-functions.sh8
-rw-r--r--doc/package/ebuild/eapi/2.docbook15
-rw-r--r--pym/_emerge/__init__.py10
-rw-r--r--pym/portage/__init__.py15
-rw-r--r--pym/portage/const.py2
6 files changed, 77 insertions, 17 deletions
diff --git a/bin/ebuild.sh b/bin/ebuild.sh
index 2a434ef75..e45747d02 100755
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@ -726,7 +726,7 @@ dyn_clean() {
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"
@@ -832,6 +832,12 @@ abort_handler() {
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"
@@ -856,6 +862,32 @@ abort_install() {
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
@@ -1038,7 +1070,8 @@ dyn_help() {
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)"
@@ -1387,7 +1420,7 @@ _ebuild_phase_funcs() {
[ $# -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=""
@@ -1440,6 +1473,7 @@ _ebuild_phase_funcs() {
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 "$@" ; }
@@ -1447,6 +1481,7 @@ _ebuild_phase_funcs() {
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 "$@" ; }
@@ -1454,6 +1489,7 @@ _ebuild_phase_funcs() {
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 "$@" ; }
@@ -1945,7 +1981,7 @@ ebuild_main() {
| 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
diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh
index e52c9fd7c..0345bbead 100755
--- a/bin/isolated-functions.sh
+++ b/bin/isolated-functions.sh
@@ -517,7 +517,7 @@ save_ebuild_env() {
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}:}
@@ -543,7 +543,7 @@ save_ebuild_env() {
# 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
@@ -559,8 +559,8 @@ save_ebuild_env() {
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 \
diff --git a/doc/package/ebuild/eapi/2.docbook b/doc/package/ebuild/eapi/2.docbook
index 1a4073e5e..20f7434df 100644
--- a/doc/package/ebuild/eapi/2.docbook
+++ b/doc/package/ebuild/eapi/2.docbook
@@ -106,7 +106,7 @@
<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>
@@ -274,3 +274,16 @@ src_compile() {
</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>
diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py
index c6d8c71fd..333043d4d 100644
--- a/pym/_emerge/__init__.py
+++ b/pym/_emerge/__init__.py
@@ -2588,7 +2588,7 @@ class EbuildExecuter(CompositeTask):
__slots__ = ("pkg", "scheduler", "settings") + ("_tree",)
- _phases = ("configure", "compile", "test", "install")
+ _phases = ("prepare", "configure", "compile", "test", "install")
_live_eclasses = frozenset([
"cvs",
@@ -2659,8 +2659,12 @@ class EbuildExecuter(CompositeTask):
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:
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index bcf710842..a97f1eec7 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -4324,7 +4324,12 @@ def spawnebuild(mydo, actionmap, mysettings, debug, alwaysdep=0,
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"]
@@ -4569,7 +4574,7 @@ def _spawn_misc_sh(mysettings, commands, **kwargs):
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:
@@ -5105,7 +5110,8 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
actionmap_deps={
"setup": [],
"unpack": ["setup"],
- "configure": ["unpack"],
+ "prepare": ["unpack"],
+ "configure": ["prepare"],
"compile":["configure"],
"test": ["compile"],
"install":["test"],
@@ -5127,7 +5133,7 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
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"]
@@ -5713,6 +5719,7 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
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}},
diff --git a/pym/portage/const.py b/pym/portage/const.py
index 3cb1ef6d4..1b8b3036e 100644
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@ -55,7 +55,7 @@ INCREMENTALS = ["USE", "USE_EXPAND", "USE_EXPAND_HIDDEN", "FEATURES",
"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"]