blob: d8bb0ad2814df29945a22b01b7685f6fac3eb045 (
plain)
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
|
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: rpm.eclass
# @MAINTAINER:
# base-system@gentoo.org
# @SUPPORTED_EAPIS: 6 7 8
# @BLURB: convenience class for extracting RPMs
case ${EAPI} in
6) inherit epatch eutils ;; # eutils for eqawarn
7|8) ;;
*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
esac
if [[ -z ${_RPM_ECLASS} ]] ; then
_RPM_ECLASS=1
inherit estack
case ${EAPI} in
6) DEPEND="app-arch/rpm2targz" ;;
*) BDEPEND="app-arch/rpm2targz" ;;
esac
# @FUNCTION: rpm_unpack
# @USAGE: <rpms>
# @DESCRIPTION:
# Unpack the contents of the specified rpms like the unpack() function.
rpm_unpack() {
[[ $# -eq 0 ]] && set -- ${A}
local a
for a in "$@" ; do
echo ">>> Unpacking ${a} to ${PWD}"
if [[ ${a} == ./* ]] ; then
: # nothing to do -- path is local
elif [[ ${a} == "${DISTDIR}"/* ]] ; then
eqawarn 'do not use ${DISTDIR} with rpm_unpack -- it is added for you'
elif [[ ${a} == /* ]] ; then
eqawarn 'do not use full paths with rpm_unpack -- use ./ paths instead'
else
a="${DISTDIR}/${a}"
fi
rpm2tar -O "${a}" | tar xf -
assert "failure unpacking ${a}"
done
}
# @FUNCTION: srcrpm_unpack
# @USAGE: <rpms>
# @DESCRIPTION:
# Unpack the contents of the specified rpms like the unpack() function as well
# as any archives that it might contain. Note that the secondary archive
# unpack isn't perfect in that it simply unpacks all archives in the working
# directory (with the assumption that there weren't any to start with).
srcrpm_unpack() {
[[ $# -eq 0 ]] && set -- ${A}
rpm_unpack "$@"
# no .src.rpm files, then nothing to do
[[ "$* " != *".src.rpm " ]] && return 0
eshopts_push -s nullglob
# unpack everything
local a
for a in *.tar.{gz,bz2,xz} *.t{gz,bz2,xz} *.zip *.ZIP ; do
unpack "./${a}"
rm -f "${a}" || die
done
eshopts_pop
return 0
}
# @FUNCTION: rpm_src_unpack
# @DESCRIPTION:
# Automatically unpack all archives in ${A} including rpms. If one of the
# archives in a source rpm, then the sub archives will be unpacked as well.
rpm_src_unpack() {
local a
for a in ${A} ; do
case ${a} in
*.rpm) srcrpm_unpack "${a}" ;;
*) unpack "${a}" ;;
esac
done
}
# @FUNCTION: rpm_spec_epatch
# @USAGE: [spec]
# @DEPRECATED: none
# @DESCRIPTION:
# Read the specified spec (defaults to ${PN}.spec) and attempt to apply
# all the patches listed in it. If the spec does funky things like moving
# files around, well this won't handle that.
rpm_spec_epatch() {
# no epatch in EAPI 7 and later
[[ ${EAPI} == 6 ]] || die "${FUNCNAME} is banned in EAPI ${EAPI}"
local p spec=$1
local dir
if [[ -z ${spec} ]] ; then
# search likely places for the spec file
for spec in "${PWD}" "${S}" "${WORKDIR}" ; do
spec+="/${PN}.spec"
[[ -e ${spec} ]] && break
done
fi
[[ ${spec} == */* ]] \
&& dir=${spec%/*} \
|| dir=
ebegin "Applying patches from ${spec}"
grep '^%patch' "${spec}" | \
while read line ; do
# expand the %patch line
set -- ${line}
p=$1
shift
# process the %patch arguments
local arg
EPATCH_OPTS=
for arg in "$@" ; do
case ${arg} in
-b) EPATCH_OPTS+=" --suffix" ;;
*) EPATCH_OPTS+=" ${arg}" ;;
esac
done
# extract the patch name from the Patch# line
set -- $(grep "^P${p#%p}: " "${spec}")
shift
epatch "${dir:+${dir}/}$*"
done
eend
}
fi
EXPORT_FUNCTIONS src_unpack
|