Gentoo Archives: gentoo-portage-dev

From: "Michał Górny" <mgorny@g.o>
To: gentoo-portage-dev@l.g.o
Cc: "Michał Górny" <mgorny@g.o>
Subject: [gentoo-portage-dev] [PATCH 6/6] Rewrite default ebuild phase setting code
Date: Mon, 18 Aug 2014 17:51:36
Message-Id: 1408384301-14588-7-git-send-email-mgorny@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCHES] Random issues and refactoring before EAPI6 series by "Michał Górny"
1 Replace the ebuild phase setting code for EAPI 2 and newer with a
2 simpler approach; first set proper default_* functions, and call them
3 within the phase. Disallow calling default_* for other phase functions
4 than the one being run.
5 ---
6 bin/phase-functions.sh | 117 ++++++++++++++++++++++---------------------------
7 bin/save-ebuild-env.sh | 2 +-
8 2 files changed, 53 insertions(+), 66 deletions(-)
9
10 diff --git a/bin/phase-functions.sh b/bin/phase-functions.sh
11 index f39a024..b7fb5d7 100644
12 --- a/bin/phase-functions.sh
13 +++ b/bin/phase-functions.sh
14 @@ -734,91 +734,78 @@ __ebuild_phase_funcs() {
15 [ $# -ne 2 ] && die "expected exactly 2 args, got $#: $*"
16 local eapi=$1
17 local phase_func=$2
18 - local default_phases="pkg_nofetch src_unpack src_prepare src_configure
19 - src_compile src_install src_test"
20 - local x y default_func=""
21 -
22 - for x in pkg_nofetch src_unpack src_test ; do
23 - declare -F $x >/dev/null || \
24 - eval "$x() { __eapi0_$x \"\$@\" ; }"
25 + local all_phases="src_compile pkg_config src_configure pkg_info
26 + src_install pkg_nofetch pkg_postinst pkg_postrm pkg_preinst
27 + src_prepare pkg_prerm pkg_pretend pkg_setup src_test src_unpack"
28 + local x
29 +
30 + # First, set up the error handlers for default*
31 + for x in ${all_phases} ; do
32 + eval "default_${x}() {
33 + die \"default_${x}() is not supported in EAPI='${eapi}' in phase ${phase_func}\"
34 + }"
35 done
36
37 + # We can just call the specific handler -- it will either error out
38 + # on invalid phase or run it.
39 + eval "default() {
40 + default_${phase_func}
41 + }"
42 +
43 case "$eapi" in
44 + 0|1) # EAPIs not supporting 'default'
45
46 - 0|1)
47 + for x in pkg_nofetch src_unpack src_test ; do
48 + declare -F $x >/dev/null || \
49 + eval "$x() { __eapi0_$x; }"
50 + done
51
52 if ! declare -F src_compile >/dev/null ; then
53 case "$eapi" in
54 0)
55 - src_compile() { __eapi0_src_compile "$@" ; }
56 + src_compile() { __eapi0_src_compile; }
57 ;;
58 *)
59 - src_compile() { __eapi1_src_compile "$@" ; }
60 + src_compile() { __eapi1_src_compile; }
61 ;;
62 esac
63 fi
64 -
65 - for x in $default_phases ; do
66 - eval "default_$x() {
67 - die \"default_$x() is not supported with EAPI='$eapi' during phase $phase_func\"
68 - }"
69 - done
70 -
71 - eval "default() {
72 - die \"default() is not supported with EAPI='$eapi' during phase $phase_func\"
73 - }"
74 -
75 ;;
76
77 - *)
78 -
79 + *) # EAPIs supporting 'default'
80 +
81 + # defaults starting with EAPI 0
82 + [[ ${phase_func} == pkg_nofetch ]] && \
83 + default_pkg_nofetch() { __eapi0_pkg_nofetch; }
84 + [[ ${phase_func} == src_unpack ]] && \
85 + default_src_unpack() { __eapi0_src_unpack; }
86 + [[ ${phase_func} == src_test ]] && \
87 + default_src_test() { __eapi0_src_test; }
88 +
89 + # defaults starting with EAPI 2
90 + [[ ${phase_func} == src_configure ]] && \
91 + default_src_configure() { __eapi2_src_configure; }
92 + [[ ${phase_func} == src_compile ]] && \
93 + default_src_compile() { __eapi2_src_compile; }
94 +
95 + # bind supported phases to the defaults
96 + declare -F src_unpack >/dev/null || \
97 + src_unpack() { default; }
98 declare -F src_configure >/dev/null || \
99 - src_configure() { __eapi2_src_configure "$@" ; }
100 -
101 + src_configure() { default; }
102 declare -F src_compile >/dev/null || \
103 - src_compile() { __eapi2_src_compile "$@" ; }
104 -
105 - has $eapi 2 3 || declare -F src_install >/dev/null || \
106 - src_install() { __eapi4_src_install "$@" ; }
107 + src_compile() { default; }
108 + declare -F src_test >/dev/null || \
109 + src_test() { default; }
110
111 - if has $phase_func $default_phases ; then
112 -
113 - __eapi2_pkg_nofetch () { __eapi0_pkg_nofetch "$@" ; }
114 - __eapi2_src_unpack () { __eapi0_src_unpack "$@" ; }
115 - __eapi2_src_prepare () { true ; }
116 - __eapi2_src_test () { __eapi0_src_test "$@" ; }
117 - __eapi2_src_install () { die "$FUNCNAME is not supported" ; }
118 -
119 - for x in $default_phases ; do
120 - eval "default_$x() { __eapi2_$x \"\$@\" ; }"
121 - done
122 -
123 - eval "default() { __eapi2_$phase_func \"\$@\" ; }"
124 -
125 - case "$eapi" in
126 - 2|3)
127 - ;;
128 - *)
129 - eval "default_src_install() { __eapi4_src_install \"\$@\" ; }"
130 - [[ $phase_func = src_install ]] && \
131 - eval "default() { __eapi4_$phase_func \"\$@\" ; }"
132 - ;;
133 - esac
134 -
135 - else
136 -
137 - for x in $default_phases ; do
138 - eval "default_$x() {
139 - die \"default_$x() is not supported in phase $default_func\"
140 - }"
141 - done
142 -
143 - eval "default() {
144 - die \"default() is not supported with EAPI='$eapi' during phase $phase_func\"
145 - }"
146 + # defaults starting with EAPI 4
147 + if ! has ${eapi} 2 3; then
148 + [[ ${phase_func} == src_install ]] && \
149 + default_src_install() { __eapi4_src_install; }
150
151 + declare -F src_install >/dev/null || \
152 + src_install() { default; }
153 fi
154 -
155 ;;
156 esac
157 }
158 diff --git a/bin/save-ebuild-env.sh b/bin/save-ebuild-env.sh
159 index 98cff83..de0c499 100644
160 --- a/bin/save-ebuild-env.sh
161 +++ b/bin/save-ebuild-env.sh
162 @@ -42,7 +42,7 @@ __save_ebuild_env() {
163
164 for x in pkg_setup pkg_nofetch src_unpack src_prepare src_configure \
165 src_compile src_test src_install pkg_preinst pkg_postinst \
166 - pkg_prerm pkg_postrm ; do
167 + pkg_prerm pkg_postrm pkg_config pkg_info pkg_pretend ; do
168 unset -f default_$x __eapi{0,1,2,3,4}_$x
169 done
170 unset x
171 --
172 2.0.4