/
portage-2.3.6-r1.ebuild
368 lines (329 loc) · 12.5 KB
/
portage-2.3.6-r1.ebuild
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
# Distributed under the terms of the GNU General Public License v2
EAPI="4-python"
PYTHON_MULTIPLE_ABIS="1"
PYTHON_RESTRICTED_ABIS="2.5 *-jython 2.7-pypy-1.9"
inherit eutils python
DESCRIPTION="Portage is the package management and distribution system for Gentoo"
HOMEPAGE="http://www.gentoo.org/proj/en/portage/index.xml"
LICENSE="GPL-2"
KEYWORDS="*"
SLOT="0"
IUSE="build doc epydoc +ipc linguas_pl linguas_ru pypy2_0 python2 python3 selinux xattr"
GITHUB_REPO="portage-funtoo"
GITHUB_USER="funtoo"
GITHUB_TAG="funtoo-${PVR}"
RESTRICT="mirror"
# Import of the io module in python-2.6 raises ImportError for the
# thread module if threading is disabled.
python_dep_ssl="python3? ( =dev-lang/python-3*[ssl] )
!pypy2_0? ( !python2? ( !python3? (
|| ( >=dev-lang/python-2.7[ssl] dev-lang/python:2.6[threads,ssl] )
) ) )
pypy2_0? ( !python2? ( !python3? ( dev-python/pypy:2.0[bzip2,ssl] ) ) )
python2? ( !python3? ( || ( dev-lang/python:2.7[ssl] dev-lang/python:2.6[ssl,threads] ) ) )"
python_dep="${python_dep_ssl//\[ssl\]}"
python_dep="${python_dep//,ssl}"
python_dep="${python_dep//ssl,}"
# The pysqlite blocker is for bug #282760.
# make-3.82 is for bug #455858
DEPEND="${python_dep}
>=sys-devel/make-3.82
>=sys-apps/sed-4.0.5 sys-devel/patch
doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 )
epydoc? ( >=dev-python/epydoc-2.0 !<=dev-python/pysqlite-2.4.1 )"
# Require sandbox-2.2 for bug #288863.
# For xattr, we can spawn getfattr and setfattr from sys-apps/attr, but that's
# quite slow, so it's not considered in the dependencies as an alternative to
# to python-3.3 / pyxattr. Also, xattr support is only tested with Linux, so
# for now, don't pull in xattr deps for other kernels.
# For whirlpool hash, require python[ssl] or python-mhash (bug #425046).
# For compgen, require bash[readline] (bug #445576).
RDEPEND="${python_dep}
!build? ( >=sys-apps/sed-4.0.5
|| ( >=app-shells/bash-4.2_p37[readline] ( <app-shells/bash-4.2_p37 >=app-shells/bash-3.2_p17 ) )
>=app-admin/eselect-1.2
|| ( ${python_dep_ssl} dev-python/python-mhash )
)
elibc_FreeBSD? ( sys-freebsd/freebsd-bin )
elibc_glibc? ( >=sys-apps/sandbox-2.2 )
elibc_uclibc? ( >=sys-apps/sandbox-2.2 )
>=app-misc/pax-utils-0.1.17
xattr? ( kernel_linux? ( $(python_abi_depend -e "3.[3-9]" dev-python/pyxattr) ) )
selinux? ( || ( >=sys-libs/libselinux-2.0.94[python] <sys-libs/libselinux-2.0.94 ) )
!<app-shells/bash-3.2_p17
!<app-admin/logrotate-3.8.0"
PDEPEND="
!build? (
>=net-misc/rsync-2.6.4
userland_GNU? ( >=sys-apps/coreutils-6.4 )
)"
# coreutils-6.4 rdep is for date format in emerge-webrsync #164532
# NOTE: FEATURES=installsources requires debugedit and rsync
SRC_ARCHIVES="http://dev.gentoo.org/~zmedico/portage/archives"
prefix_src_archives() {
local x y
for x in ${@}; do
for y in ${SRC_ARCHIVES}; do
echo ${y}/${x}
done
done
}
PV_PL="2.1.2"
PATCHVER_PL=""
SRC_URI="https://www.github.com/${GITHUB_USER}/${GITHUB_REPO}/tarball/${GITHUB_TAG} -> portage-${GITHUB_TAG}.tar.gz
linguas_pl? ( mirror://gentoo/${PN}-man-pl-${PV_PL}.tar.bz2
$(prefix_src_archives ${PN}-man-pl-${PV_PL}.tar.bz2) )"
S_PL="${WORKDIR}"/${PN}-${PV_PL}
compatible_python_is_selected() {
[[ $("${EPREFIX}/usr/bin/python" -c 'import sys ; sys.stdout.write(sys.hexversion >= 0x2060000 and "good" or "bad")') = good ]]
}
pkg_setup() {
if use python2 && use python3 ; then
ewarn "Both python2 and python3 USE flags are enabled, but only one"
ewarn "can be in the shebangs. Using python3."
fi
if use pypy2_0 && use python3 ; then
ewarn "Both pypy2_0 and python3 USE flags are enabled, but only one"
ewarn "can be in the shebangs. Using python3."
fi
if use pypy2_0 && use python2 ; then
ewarn "Both pypy2_0 and python2 USE flags are enabled, but only one"
ewarn "can be in the shebangs. Using python2"
fi
if ! use pypy2_0 && ! use python2 && ! use python3 && \
! compatible_python_is_selected ; then
ewarn "Attempting to select a compatible default python interpreter"
local x success=0
for x in "${EPREFIX}"/usr/bin/python2.* ; do
x=${x#${EPREFIX}/usr/bin/python2.}
if [[ $x -ge 6 ]] 2>/dev/null ; then
eselect python set python2.$x
if compatible_python_is_selected ; then
elog "Default python interpreter is now set to python-2.$x"
success=1
break
fi
fi
done
if [ $success != 1 ] ; then
eerror "Unable to select a compatible default python interpreter!"
die "This version of portage requires at least python-2.6 to be selected as the default python interpreter (see \`eselect python --help\`)."
fi
fi
python_pkg_setup
ACTIVE_PYTHON=python
if use python3; then
ACTIVE_PYTHON=python3
elif use python2; then
ACTIVE_PYTHON=python2
elif use pypy2_0; then
ACTIVE_PYTHON=pypy-c2.0
fi
}
src_unpack() {
unpack ${A}
mv "${WORKDIR}/${GITHUB_USER}-${PN}-funtoo"-??????? "${S}" || die
}
src_prepare() {
if [ -n "${PATCHVER}" ] ; then
if [[ -L $S/bin/ebuild-helpers/portageq ]] ; then
rm "$S/bin/ebuild-helpers/portageq" \
|| die "failed to remove portageq helper symlink"
fi
epatch "${WORKDIR}/${PN}-${PATCHVER}.patch"
fi
einfo "Setting portage.VERSION to ${PVR} ..."
sed -e "s/^VERSION=.*/VERSION=\"${PVR}\"/" -i pym/portage/__init__.py || \
die "Failed to patch portage.VERSION"
sed -e "1s/VERSION/${PVR}/" -i doc/fragment/version || \
die "Failed to patch VERSION in doc/fragment/version"
sed -e "1s/VERSION/${PVR}/" -i $(find man -type f) || \
die "Failed to patch VERSION in man page headers"
if ! use ipc ; then
einfo "Disabling ipc..."
sed -e "s:_enable_ipc_daemon = True:_enable_ipc_daemon = False:" \
-i pym/_emerge/AbstractEbuildProcess.py || \
die "failed to patch AbstractEbuildProcess.py"
fi
if use xattr && use kernel_linux ; then
einfo "Adding FEATURES=xattr to make.globals ..."
echo -e '\nFEATURES="${FEATURES} xattr"' >> cnf/make.globals \
|| die "failed to append to make.globals"
fi
if use python3; then
einfo "Converting shebangs for python3..."
python_convert_shebangs -r 3 .
elif use python2; then
einfo "Converting shebangs for python2..."
python_convert_shebangs -r 2 .
elif use pypy2_0; then
einfo "Converting shebangs for pypy-c2.0..."
python_convert_shebangs -r 2.7-pypy-2.0 .
fi
if [[ -n ${EPREFIX} ]] ; then
einfo "Setting portage.const.EPREFIX ..."
sed -e "s|^\(SANDBOX_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/sandbox\"\)|\\1${EPREFIX}\\2|" \
-e "s|^\(FAKEROOT_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/fakeroot\"\)|\\1${EPREFIX}\\2|" \
-e "s|^\(BASH_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/bash\"\)|\\1${EPREFIX}\\2|" \
-e "s|^\(MOVE_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/mv\"\)|\\1${EPREFIX}\\2|" \
-e "s|^\(PRELINK_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/sbin/prelink\"\)|\\1${EPREFIX}\\2|" \
-e "s|^\(EPREFIX[[:space:]]*=[[:space:]]*\"\).*|\\1${EPREFIX}\"|" \
-i pym/portage/const.py || \
die "Failed to patch portage.const.EPREFIX"
einfo "Prefixing shebangs ..."
while read -r -d $'\0' ; do
local shebang=$(head -n1 "$REPLY")
if [[ ${shebang} == "#!"* && ! ${shebang} == "#!${EPREFIX}/"* ]] ; then
sed -i -e "1s:.*:#!${EPREFIX}${shebang:2}:" "$REPLY" || \
die "sed failed"
fi
done < <(find . -type f -print0)
einfo "Adjusting make.globals ..."
sed -e 's|^SYNC=.*|SYNC="rsync://rsync.prefix.freens.org/gentoo-portage-prefix"|' \
-e "s|^\(PORTDIR=\)\(/usr/portage\)|\\1\"${EPREFIX}\\2\"|" \
-e "s|^\(PORTAGE_TMPDIR=\)\(/var/tmp\)|\\1\"${EPREFIX}\\2\"|" \
-i cnf/make.globals || die "sed failed"
einfo "Adding FEATURES=force-prefix to make.globals ..."
echo -e '\nFEATURES="${FEATURES} force-prefix"' >> cnf/make.globals \
|| die "failed to append to make.globals"
fi
cd "${S}/cnf" || die
if [ -f "make.conf.${ARCH}".diff ]; then
patch make.conf "make.conf.${ARCH}".diff || \
die "Failed to patch make.conf.example"
else
eerror ""
eerror "Portage does not have an arch-specific configuration for this arch."
eerror "Please notify the arch maintainer about this issue. Using generic."
eerror ""
fi
}
src_compile() {
if use doc; then
emake docbook || die
fi
if use epydoc; then
einfo "Generating api docs"
emake epydoc || die
fi
}
src_test() {
# make files executable, in case they were created by patch
find bin -type f | xargs chmod +x
EPYTHON="${ACTIVE_PYTHON}" \
emake test || die
}
src_install() {
emake DESTDIR="${D}" \
DOCS="NEWS RELEASE-NOTES" \
sysconfdir="${EPREFIX}/etc" \
prefix="${EPREFIX}/usr" \
install || die
# Use dodoc for compression, since the Makefile doesn't do that.
dodoc "${S}"/{NEWS,RELEASE-NOTES} || die
if use linguas_pl; then
doman -i18n=pl "${S_PL}"/man/pl/*.[0-9] || die
doman -i18n=pl_PL.UTF-8 "${S_PL}"/man/pl_PL.UTF-8/*.[0-9] || die
fi
create_symlinks() {
local files mod_dir dest_mod_dir python relative_path x
if use build && [[ ${ROOT} == / &&
! -x $(PYTHON -a) ]] ; then
# Tolerate --nodeps at beginning of stage1 for catalyst
ewarn "skipping python_abis_${PYTHON_ABI}, interpreter not found"
continue
fi
while read -r mod_dir ; do
cd "${ED}/usr/lib/portage/pym/${mod_dir}" || die
files=$(echo *.py)
if [ -z "${files}" ] || [ "${files}" = "*.py" ]; then
# __pycache__ directories contain no py files
continue
fi
dest_mod_dir=$(python_get_sitedir)/${mod_dir}
dodir "${dest_mod_dir}" || die
relative_path=../../../lib/portage/pym/${mod_dir}
x=/${mod_dir}
while [ -n "${x}" ] ; do
relative_path=../${relative_path}
x=${x%/*}
done
for x in ${files} ; do
dosym "${relative_path}/${x}" \
"${dest_mod_dir}/${x}" || die
done
done < <(cd "${ED}"/usr/lib/portage/pym || die ; find * -type d ! -path "portage/tests*")
cd "${S}" || die
}
python_execute_function -q create_symlinks
exeinto /usr/lib/portage/bin
doexe "${FILESDIR}/pygrade.py"
}
pkg_preinst() {
if [[ $ROOT == / ]] ; then
# Run some minimal tests as a sanity check.
local test_runner=$(find "${ED}" -name runTests)
if [[ -n $test_runner && -x $test_runner ]] ; then
einfo "Running preinst sanity tests..."
"$test_runner" || die "preinst sanity tests failed"
fi
fi
# elog dir must exist to avoid logrotate error for bug #415911.
# This code runs in preinst in order to bypass the mapping of
# portage:portage to root:root which happens after src_install.
keepdir /var/log/portage/elog
# This is allowed to fail if the user/group are invalid for prefix users.
if chown portage:portage "${ED}"var/log/portage{,/elog} 2>/dev/null ; then
chmod g+s,ug+rwx "${ED}"var/log/portage{,/elog}
fi
has_version "<=${CATEGORY}/${PN}-2.2_pre5" \
&& WORLD_MIGRATION_UPGRADE=true || WORLD_MIGRATION_UPGRADE=false
# If portage-2.1.6 is installed and the preserved_libs_registry exists,
# assume that the NEEDED.ELF.2 files have already been generated.
has_version "<=${CATEGORY}/${PN}-2.2_pre7" && \
! { [ -e "${EROOT}"var/lib/portage/preserved_libs_registry ] && \
has_version ">=${CATEGORY}/${PN}-2.1.6_rc" ; } \
&& NEEDED_REBUILD_UPGRADE=true || NEEDED_REBUILD_UPGRADE=false
}
pkg_postinst() {
PYTHON_ABIS="$(EPYTHON="${ACTIVE_PYTHON}" "${EPREFIX}/usr/bin/python" -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")" python_mod_optimize --allow-evaluated-non-sitedir-paths '/usr/lib/portage/pym$()'
python_mod_optimize _emerge portage repoman
"${EROOT}usr/lib/portage/bin/pygrade.py"
if $WORLD_MIGRATION_UPGRADE && \
grep -q "^@" "${EROOT}/var/lib/portage/world"; then
einfo "moving set references from the worldfile into world_sets"
cd "${EROOT}/var/lib/portage/"
grep "^@" world >> world_sets
sed -i -e '/^@/d' world
fi
if ${NEEDED_REBUILD_UPGRADE} ; then
einfo "rebuilding NEEDED.ELF.2 files"
local cpv filename line newline
for cpv in "${EROOT}/var/db/pkg"/*/*; do
[[ -f "${cpv}/NEEDED" && ! -f "${cpv}/NEEDED.ELF.2" ]] || continue
while read -r line; do
filename=${line% *}
newline=$(scanelf -BF "%a;%F;%S;%r;%n" "${ROOT%/}${filename}")
newline=${newline// - }
[[ ${#ROOT} -gt 1 ]] && newline=${newline/${ROOT%/}}
echo "${newline:3}" >> "${cpv}/NEEDED.ELF.2"
done < "${cpv}/NEEDED"
done
fi
# make.conf magick. We rather prefer to have make.conf in one place and set the symlink to
# have compatibility
if [[ ! -L ${EROOT}etc/make.conf ]]; then
if [[ -e ${EROOT}etc/make.conf ]]; then
if [[ -e ${EROOT}etc/portage/make.conf ]]; then
mv "${EROOT}etc/make.conf" "${EROOT}etc/make.conf.backup"
ewarn "Redundant '${EROOT}etc/make.conf' has been renamed to '${EROOT}etc/make.conf.backup'."
else
mv "${EROOT}etc/make.conf" "${EROOT}etc/portage/make.conf"
fi
fi
ln -s portage/make.conf "${EROOT}etc/make.conf"
fi
}
pkg_postrm() {
python_mod_cleanup --allow-evaluated-non-sitedir-paths '/usr/lib/portage/pym$()' _emerge portage repoman
}