/[gentoo-x86]/eclass/eutils.eclass
Gentoo

Diff of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.3 Revision 1.12
1# Copyright 1999-2002 Gentoo Technologies, Inc. 1# Copyright 1999-2002 Gentoo Technologies, Inc.
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# Author: Martin Schlemmer <azarah@gentoo.org> 3# Author: Martin Schlemmer <azarah@gentoo.org>
4# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.3 2002/11/11 19:51:20 azarah Exp $ 4# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.12 2002/12/14 21:46:25 azarah Exp $
5# This eclass is for general purpose functions that most ebuilds 5# This eclass is for general purpose functions that most ebuilds
6# have to implement themselfs. 6# have to implement themselves.
7# 7#
8# NB: If you add anything, please comment it! 8# NB: If you add anything, please comment it!
9 9
10ECLASS=eutils 10ECLASS=eutils
11INHERITED="$INHERITED $ECLASS" 11INHERITED="$INHERITED $ECLASS"
12 12
13newdepend sys-devel/patch 13newdepend "!bootstrap? ( sys-devel/patch )"
14 14
15DESCRIPTION="Based on the ${ECLASS} eclass" 15DESCRIPTION="Based on the ${ECLASS} eclass"
16 16
17# This function generate linker scripts in /usr/lib for dynamic 17# This function generate linker scripts in /usr/lib for dynamic
18# libs in /lib. This is to fix linking problems when you have 18# libs in /lib. This is to fix linking problems when you have
47 more info. */ 47 more info. */
48GROUP ( /lib/libxxx ) 48GROUP ( /lib/libxxx )
49END_LDSCRIPT 49END_LDSCRIPT
50 50
51 dosed "s:libxxx:$1:" /usr/lib/$1 51 dosed "s:libxxx:$1:" /usr/lib/$1
52
53 return 0
52} 54}
53 55
56# Simple function to draw a line consisting of '=' the same length as $*
57#
58# <azarah@gentoo.org> (11 Nov 2002)
59#
60draw_line() {
61 local i=0
62 local str_length=""
63
64 # Handle calls that do not have args, or wc not being installed ...
65 if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
66 then
67 echo "==============================================================="
68 return 0
69 fi
70
71 # Get the length of $*
72 str_length="$(echo -n "$*" | wc -m)"
73
74 while [ "$i" -lt "${str_length}" ]
75 do
76 echo -n "="
77
78 i=$((i + 1))
79 done
80
81 echo
82
83 return 0
84}
54 85
55# Default directory where patches are located 86# Default directory where patches are located
56EPATCH_SOURCE="${WORKDIR}/patch" 87EPATCH_SOURCE="${WORKDIR}/patch"
57# Default extension for patches 88# Default extension for patches
58EPATCH_SUFFIX="patch.bz2" 89EPATCH_SUFFIX="patch.bz2"
59# Default options for patch 90# Default options for patch
60EPATCH_OPTS="" 91EPATCH_OPTS=""
92# List of patches not to apply. Not this is only file names,
93# and not the full path ..
94EPATCH_EXCLUDE=""
95# Change the printed message for a single patch.
96EPATCH_SINGLE_MSG=""
61 97
62# This function is for bulk patching, or in theory for just one 98# This function is for bulk patching, or in theory for just one
63# or two patches. 99# or two patches.
64# 100#
65# It should work with .bz2, .gz, .zip and plain text patches. 101# It should work with .bz2, .gz, .zip and plain text patches.
93# <azarah@gentoo.org> (10 Nov 2002) 129# <azarah@gentoo.org> (10 Nov 2002)
94# 130#
95epatch() { 131epatch() {
96 local PIPE_CMD="" 132 local PIPE_CMD=""
97 local STDERR_TARGET="${T}/$$.out" 133 local STDERR_TARGET="${T}/$$.out"
134 local PATCH_TARGET="${T}/$$.patch"
135 local PATCH_SUFFIX=""
98 local SINGLE_PATCH="no" 136 local SINGLE_PATCH="no"
137 local x=""
99 138
100 if [ "$#" -gt 1 ] 139 if [ "$#" -gt 1 ]
101 then 140 then
102 eerror "Invalid arguments to epatch()" 141 eerror "Invalid arguments to epatch()"
103 die "Invalid arguments to epatch()" 142 die "Invalid arguments to epatch()"
105 144
106 if [ -n "$1" -a -f "$1" ] 145 if [ -n "$1" -a -f "$1" ]
107 then 146 then
108 SINGLE_PATCH="yes" 147 SINGLE_PATCH="yes"
109 148
110 EPATCH_SOURCE="$1" 149 local EPATCH_SOURCE="$1"
111 EPATCH_SUFFIX="${1##*\.}" 150 local EPATCH_SUFFIX="${1##*\.}"
112 151
113 elif [ -n "$1" -a -d "$1" ] 152 elif [ -n "$1" -a -d "$1" ]
114 then 153 then
115 EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 154 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
116 else 155 else
156 if [ ! -d ${EPATCH_SOURCE} ]
157 then
158 echo
159 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
160 eerror
161 eerror " ${EPATCH_SOURCE}"
162 echo
163 die "Cannot find \$EPATCH_SOURCE!"
164 fi
165
117 EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 166 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
118 fi 167 fi
119 168
120 case ${EPATCH_SUFFIX##*\.} in 169 case ${EPATCH_SUFFIX##*\.} in
121 bz2) 170 bz2)
122 PIPE_CMD="bzip2 -dc" 171 PIPE_CMD="bzip2 -dc"
172 PATCH_SUFFIX="bz2"
123 ;; 173 ;;
124 gz) 174 gz|Z|z)
125 PIPE_CMD="gzip -dc" 175 PIPE_CMD="gzip -dc"
176 PATCH_SUFFIX="gz"
126 ;; 177 ;;
127 zip) 178 ZIP|zip)
128 PIPE_CMD="unzip -p" 179 PIPE_CMD="unzip -p"
180 PATCH_SUFFIX="zip"
129 ;; 181 ;;
130 *) 182 *)
131 PIPE_CMD="cat" 183 PIPE_CMD="cat"
184 PATCH_SUFFIX="patch"
132 ;; 185 ;;
133 esac 186 esac
134 187
135 if [ "${SINGLE_PATCH}" = "no" ] 188 if [ "${SINGLE_PATCH}" = "no" ]
136 then 189 then
141 # New ARCH dependant patch naming scheme... 194 # New ARCH dependant patch naming scheme...
142 # 195 #
143 # ???_arch_foo.patch 196 # ???_arch_foo.patch
144 # 197 #
145 if [ -f ${x} ] && \ 198 if [ -f ${x} ] && \
146 [ -n "$1" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] 199 [ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ]
147 then 200 then
148 local count=0 201 local count=0
149 local popts="${EPATCH_OPTS}" 202 local popts="${EPATCH_OPTS}"
203
204 if [ -n "${EPATCH_EXCLUDE}" ]
205 then
206 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
207 then
208 continue
209 fi
210 fi
150 211
151 if [ "${SINGLE_PATCH}" = "yes" ] 212 if [ "${SINGLE_PATCH}" = "yes" ]
152 then 213 then
214 if [ -n "${EPATCH_SINGLE_MSG}" ]
215 then
216 einfo "${EPATCH_SINGLE_MSG}"
217 else
153 einfo "Applying ${x##*/}..." 218 einfo "Applying ${x##*/}..."
219 fi
154 else 220 else
155 einfo " ${x##*/}..." 221 einfo " ${x##*/}..."
156 fi 222 fi
157 223
158 echo "*** Patch ${x##*/} ***" > ${STDERR_TARGET} 224 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
225 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
159 226
160 # Allow for prefix to differ ... im lazy, so shoot me :/ 227 # Allow for prefix to differ ... im lazy, so shoot me :/
161 while [ "${count}" -lt 5 ] 228 while [ "${count}" -lt 5 ]
162 do 229 do
163 if eval ${PIPE_CMD} ${x} | patch ${popts} --dry-run -f -p${count} 2>&1 >> ${STDERR_TARGET} 230 # Generate some useful debug info ...
231 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
232 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
233
234 if [ "${PATCH_SUFFIX}" != "patch" ]
235 then
236 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
237 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
238 else
239 PATCH_TARGET="${x}"
240 fi
241
242 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
243 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244
245 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
247
248 if [ "${PATCH_SUFFIX}" != "patch" ]
249 then
250 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
164 then 251 then
165 eval ${PIPE_CMD} ${x} | patch ${popts} -p${count} 2>&1 >> ${STDERR_TARGET} 252 echo
253 eerror "Could not extract patch!"
254 #die "Could not extract patch!"
255 count=5
256 break
257 fi
258 fi
259
260 if patch ${popts} --dry-run -f -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
261 then
262 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
263 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
264 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
267
268 patch ${popts} -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
269
270 if [ "$?" -ne 0 ]
271 then
272 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
273 echo
274 eerror "A dry-run of patch command succeeded, but actually"
275 eerror "applying the patch failed!"
276 #die "Real world sux compared to the dreamworld!"
277 count=5
278 fi
279
280 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
281
166 break 282 break
167 fi 283 fi
168 284
169 count=$((count + 1)) 285 count=$((count + 1))
170 done 286 done
171 287
288 if [ "${PATCH_SUFFIX}" != "patch" ]
289 then
290 rm -f ${PATCH_TARGET}
291 fi
292
172 if [ "${count}" -eq 5 ] 293 if [ "${count}" -eq 5 ]
173 then 294 then
295 echo
174 eerror "Failed Patch: ${x##*/}!" 296 eerror "Failed Patch: ${x##*/}!"
175 eerror 297 eerror
176 eerror "Include in your bugreport the contents of:" 298 eerror "Include in your bugreport the contents of:"
177 eerror 299 eerror
178 eerror " ${STDERR_TARGET}" 300 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
179 eerror 301 echo
180 die "Failed Patch: ${x##*/}!" 302 die "Failed Patch: ${x##*/}!"
181 fi 303 fi
304
305 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
182 306
183 eend 0 307 eend 0
184 fi 308 fi
185 done 309 done
186 if [ "${SINGLE_PATCH}" = "no" ] 310 if [ "${SINGLE_PATCH}" = "no" ]
187 then 311 then
188 einfo "Done with patching" 312 einfo "Done with patching"
189 fi 313 fi
190} 314}
191 315
316# This function check how many cpu's are present, and then set
317# -j in MAKEOPTS accordingly.
318#
319# Thanks to nall <nall@gentoo.org> for this.
320#
321get_number_of_jobs() {
322 if [ ! -r /proc/cpuinfo ]
323 then
324 return 1
325 fi
326
327 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j[0-9]*::g'`"
328
329 if [ "${ARCH}" = "x86" ]
330 then
331 # x86 always has "processor"
332 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^processor /proc/cpuinfo` * 2))"
333
334 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
335 then
336 # sparc always has "ncpus active"
337 export MAKEOPTS="${MAKEOPTS} -j$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
338
339 elif [ "${ARCH}" = "alpha" ]
340 then
341 # alpha has "cpus active", but only when compiled with SMP
342 if [ "`grep -c "^cpus active" /proc/cpuinfo`" = "1" ]
343 then
344 export MAKEOPTS="${MAKEOPTS} -j$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
345 else
346 export MAKEOPTS="${MAKEOPTS} -j2"
347 fi
348
349 elif [ "${ARCH}" = "ppc" ]
350 then
351 # ppc has "processor", but only when compiled with SMP
352 if [ "`grep -c "^processor" /proc/cpuinfo`" = "1" ]
353 then
354 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^processor /proc/cpuinfo` * 2))"
355 else
356 export MAKEOPTS="${MAKEOPTS} -j2"
357 fi
358 else
359 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^cpu /proc/cpuinfo` * 2))"
360 die "Unknown ARCH -- ${ARCH}!"
361 fi
362}
363

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.12

  ViewVC Help
Powered by ViewVC 1.1.20