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

Diff of /eclass/eutils.eclass

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

Revision 1.5 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.5 2002/11/11 22:36:22 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
87EPATCH_SOURCE="${WORKDIR}/patch" 87EPATCH_SOURCE="${WORKDIR}/patch"
88# Default extension for patches 88# Default extension for patches
89EPATCH_SUFFIX="patch.bz2" 89EPATCH_SUFFIX="patch.bz2"
90# Default options for patch 90# Default options for patch
91EPATCH_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=""
92 97
93# 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
94# or two patches. 99# or two patches.
95# 100#
96# It should work with .bz2, .gz, .zip and plain text patches. 101# It should work with .bz2, .gz, .zip and plain text patches.
124# <azarah@gentoo.org> (10 Nov 2002) 129# <azarah@gentoo.org> (10 Nov 2002)
125# 130#
126epatch() { 131epatch() {
127 local PIPE_CMD="" 132 local PIPE_CMD=""
128 local STDERR_TARGET="${T}/$$.out" 133 local STDERR_TARGET="${T}/$$.out"
134 local PATCH_TARGET="${T}/$$.patch"
135 local PATCH_SUFFIX=""
129 local SINGLE_PATCH="no" 136 local SINGLE_PATCH="no"
130 local x="" 137 local x=""
131 138
132 if [ "$#" -gt 1 ] 139 if [ "$#" -gt 1 ]
133 then 140 then
144 151
145 elif [ -n "$1" -a -d "$1" ] 152 elif [ -n "$1" -a -d "$1" ]
146 then 153 then
147 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 154 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
148 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
149 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 166 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
150 fi 167 fi
151 168
152 case ${EPATCH_SUFFIX##*\.} in 169 case ${EPATCH_SUFFIX##*\.} in
153 bz2) 170 bz2)
154 PIPE_CMD="bzip2 -dc" 171 PIPE_CMD="bzip2 -dc"
172 PATCH_SUFFIX="bz2"
155 ;; 173 ;;
156 gz) 174 gz|Z|z)
157 PIPE_CMD="gzip -dc" 175 PIPE_CMD="gzip -dc"
176 PATCH_SUFFIX="gz"
158 ;; 177 ;;
159 zip) 178 ZIP|zip)
160 PIPE_CMD="unzip -p" 179 PIPE_CMD="unzip -p"
180 PATCH_SUFFIX="zip"
161 ;; 181 ;;
162 *) 182 *)
163 PIPE_CMD="cat" 183 PIPE_CMD="cat"
184 PATCH_SUFFIX="patch"
164 ;; 185 ;;
165 esac 186 esac
166 187
167 if [ "${SINGLE_PATCH}" = "no" ] 188 if [ "${SINGLE_PATCH}" = "no" ]
168 then 189 then
173 # New ARCH dependant patch naming scheme... 194 # New ARCH dependant patch naming scheme...
174 # 195 #
175 # ???_arch_foo.patch 196 # ???_arch_foo.patch
176 # 197 #
177 if [ -f ${x} ] && \ 198 if [ -f ${x} ] && \
178 [ -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}" ]
179 then 200 then
180 local count=0 201 local count=0
181 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
182 211
183 if [ "${SINGLE_PATCH}" = "yes" ] 212 if [ "${SINGLE_PATCH}" = "yes" ]
184 then 213 then
214 if [ -n "${EPATCH_SINGLE_MSG}" ]
215 then
216 einfo "${EPATCH_SINGLE_MSG}"
217 else
185 einfo "Applying ${x##*/}..." 218 einfo "Applying ${x##*/}..."
219 fi
186 else 220 else
187 einfo " ${x##*/}..." 221 einfo " ${x##*/}..."
188 fi 222 fi
189 223
190 echo "***** ${x##*/} *****" > ${STDERR_TARGET} 224 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
191 echo >> ${STDERR_TARGET} 225 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
192 226
193 # Allow for prefix to differ ... im lazy, so shoot me :/ 227 # Allow for prefix to differ ... im lazy, so shoot me :/
194 while [ "${count}" -lt 5 ] 228 while [ "${count}" -lt 5 ]
195 do 229 do
196 # Generate some useful debug info ... 230 # Generate some useful debug info ...
197 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET} 231 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
198 echo >> ${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
199 241
200 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET} 242 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
201 echo "${PIPE_CMD} ${x} | patch ${popts} -p${count}" >> ${STDERR_TARGET} 243 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
202 244
203 echo >> ${STDERR_TARGET} 245 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
204 draw_line "***** ${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
251 then
252 echo
253 eerror "Could not extract patch!"
254 #die "Could not extract patch!"
255 count=5
256 break
257 fi
258 fi
205 259
206 if eval ${PIPE_CMD} ${x} | patch ${popts} --dry-run -f -p${count} 2>&1 >> ${STDERR_TARGET} 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 ]
207 then 271 then
208 eval ${PIPE_CMD} ${x} | patch ${popts} -p${count} 2>&1 >> ${STDERR_TARGET} 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
209 break 282 break
210 fi 283 fi
211 284
212 count=$((count + 1)) 285 count=$((count + 1))
213 done 286 done
214 287
288 if [ "${PATCH_SUFFIX}" != "patch" ]
289 then
290 rm -f ${PATCH_TARGET}
291 fi
292
215 if [ "${count}" -eq 5 ] 293 if [ "${count}" -eq 5 ]
216 then 294 then
295 echo
217 eerror "Failed Patch: ${x##*/}!" 296 eerror "Failed Patch: ${x##*/}!"
218 eerror 297 eerror
219 eerror "Include in your bugreport the contents of:" 298 eerror "Include in your bugreport the contents of:"
220 eerror 299 eerror
221 eerror " ${STDERR_TARGET}" 300 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
222 eerror 301 echo
223 die "Failed Patch: ${x##*/}!" 302 die "Failed Patch: ${x##*/}!"
224 fi 303 fi
304
305 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
225 306
226 eend 0 307 eend 0
227 fi 308 fi
228 done 309 done
229 if [ "${SINGLE_PATCH}" = "no" ] 310 if [ "${SINGLE_PATCH}" = "no" ]
230 then 311 then
231 einfo "Done with patching" 312 einfo "Done with patching"
232 fi 313 fi
233} 314}
234 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.5  
changed lines
  Added in v.1.12

  ViewVC Help
Powered by ViewVC 1.1.20