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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.359 - (hide annotations) (download)
Wed Jul 20 05:46:46 2011 UTC (3 years, 2 months ago) by vapier
Branch: MAIN
Changes since 1.358: +6 -1 lines
epatch: use EPATCH_SOURCE as a [relative] search dir even when patches are specified on the command line

1 vapier 1.356 # Copyright 1999-2011 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.359 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.358 2011/07/08 11:35:01 ssuominen Exp $
4 vapier 1.283
5     # @ECLASS: eutils.eclass
6     # @MAINTAINER:
7     # base-system@gentoo.org
8     # @BLURB: many extra (but common) functions that are used in ebuilds
9     # @DESCRIPTION:
10     # The eutils eclass contains a suite of functions that complement
11     # the ones that ebuild.sh already contain. The idea is that the functions
12     # are not required in all ebuilds but enough utilize them to have a common
13     # home rather than having multiple ebuilds implementing the same thing.
14 swegener 1.286 #
15 vapier 1.283 # Due to the nature of this eclass, some functions may have maintainers
16     # different from the overall eclass!
17 azarah 1.1
18 flameeyes 1.197 inherit multilib portability
19 azarah 1.1
20 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
21 azarah 1.1
22 betelgeuse 1.329 if has "${EAPI:-0}" 0 1 2; then
23    
24 vapier 1.283 # @FUNCTION: epause
25     # @USAGE: [seconds]
26     # @DESCRIPTION:
27     # Sleep for the specified number of seconds (default of 5 seconds). Useful when
28     # printing a message the user should probably be reading and often used in
29     # conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set,
30 betelgeuse 1.329 # don't wait at all. Defined in EAPIs 0 1 and 2.
31 ciaranm 1.98 epause() {
32 vapier 1.245 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
33 ciaranm 1.98 }
34    
35 vapier 1.283 # @FUNCTION: ebeep
36     # @USAGE: [number of beeps]
37     # @DESCRIPTION:
38     # Issue the specified number of beeps (default of 5 beeps). Useful when
39     # printing a message the user should probably be reading and often used in
40     # conjunction with the epause function. If the EBEEP_IGNORE env var is set,
41 betelgeuse 1.329 # don't beep at all. Defined in EAPIs 0 1 and 2.
42 ciaranm 1.98 ebeep() {
43     local n
44 vapier 1.245 if [[ -z ${EBEEP_IGNORE} ]] ; then
45 ciaranm 1.98 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
46     echo -ne "\a"
47     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
48     echo -ne "\a"
49     sleep 1
50     done
51     fi
52     }
53    
54 reavertm 1.331 else
55    
56 reavertm 1.332 ebeep() {
57 reavertm 1.337 ewarn "QA Notice: ebeep is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
58 reavertm 1.332 }
59 reavertm 1.331
60 reavertm 1.332 epause() {
61 reavertm 1.337 ewarn "QA Notice: epause is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
62 reavertm 1.332 }
63 reavertm 1.331
64 betelgeuse 1.329 fi
65    
66 betelgeuse 1.348 # @FUNCTION: eqawarn
67     # @USAGE: [message]
68     # @DESCRIPTION:
69     # Proxy to einfo for package managers that don't provide eqawarn and use the PM
70     # implementation if available.
71     if ! declare -F eqawarn >/dev/null ; then
72     eqawarn() {
73     einfo "$@"
74     }
75     fi
76    
77 hollow 1.298 # @FUNCTION: ecvs_clean
78 vapier 1.299 # @USAGE: [list of dirs]
79 hollow 1.298 # @DESCRIPTION:
80 vapier 1.299 # Remove CVS directories recursiveley. Useful when a source tarball contains
81     # internal CVS directories. Defaults to $PWD.
82 hollow 1.298 ecvs_clean() {
83 vapier 1.299 [[ -z $* ]] && set -- .
84 hollow 1.298 find "$@" -type d -name 'CVS' -prune -print0 | xargs -0 rm -rf
85     find "$@" -type f -name '.cvs*' -print0 | xargs -0 rm -rf
86     }
87    
88     # @FUNCTION: esvn_clean
89 vapier 1.299 # @USAGE: [list of dirs]
90 hollow 1.298 # @DESCRIPTION:
91 vapier 1.299 # Remove .svn directories recursiveley. Useful when a source tarball contains
92     # internal Subversion directories. Defaults to $PWD.
93 hollow 1.298 esvn_clean() {
94 vapier 1.299 [[ -z $* ]] && set -- .
95 hollow 1.298 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
96     }
97    
98 vapier 1.322 # @FUNCTION: eshopts_push
99 vapier 1.330 # @USAGE: [options to `set` or `shopt`]
100 vapier 1.322 # @DESCRIPTION:
101     # Often times code will want to enable a shell option to change code behavior.
102     # Since changing shell options can easily break other pieces of code (which
103     # assume the default state), eshopts_push is used to (1) push the current shell
104     # options onto a stack and (2) pass the specified arguments to set.
105     #
106 vapier 1.330 # If the first argument is '-s' or '-u', we assume you want to call `shopt`
107     # rather than `set` as there are some options only available via that.
108     #
109 vapier 1.322 # A common example is to disable shell globbing so that special meaning/care
110     # may be used with variables/arguments to custom functions. That would be:
111     # @CODE
112     # eshopts_push -o noglob
113     # for x in ${foo} ; do
114     # if ...some check... ; then
115     # eshopts_pop
116     # return 0
117     # fi
118     # done
119     # eshopts_pop
120     # @CODE
121     eshopts_push() {
122     # have to assume __ESHOPTS_SAVE__ isn't screwed with
123     # as a `declare -a` here will reset its value
124     local i=${#__ESHOPTS_SAVE__[@]}
125 vapier 1.330 if [[ $1 == -[su] ]] ; then
126     __ESHOPTS_SAVE__[$i]=$(shopt -p)
127     [[ $# -eq 0 ]] && return 0
128     shopt "$@" || die "eshopts_push: bad options to shopt: $*"
129     else
130     __ESHOPTS_SAVE__[$i]=$-
131     [[ $# -eq 0 ]] && return 0
132     set "$@" || die "eshopts_push: bad options to set: $*"
133     fi
134 vapier 1.322 }
135    
136     # @FUNCTION: eshopts_pop
137     # @USAGE:
138     # @DESCRIPTION:
139     # Restore the shell options to the state saved with the corresponding
140     # eshopts_push call. See that function for more details.
141     eshopts_pop() {
142     [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments"
143     local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 ))
144     [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
145     local s=${__ESHOPTS_SAVE__[$i]}
146     unset __ESHOPTS_SAVE__[$i]
147 vapier 1.330 if [[ ${s} == "shopt -"* ]] ; then
148     eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}"
149     else
150     set +$- || die "eshopts_pop: sanity: invalid shell settings: $-"
151     set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}"
152     fi
153 vapier 1.322 }
154    
155 vapier 1.325 # @VARIABLE: EPATCH_SOURCE
156     # @DESCRIPTION:
157     # Default directory to search for patches.
158 azarah 1.2 EPATCH_SOURCE="${WORKDIR}/patch"
159 vapier 1.325 # @VARIABLE: EPATCH_SUFFIX
160     # @DESCRIPTION:
161     # Default extension for patches (do not prefix the period yourself).
162 azarah 1.2 EPATCH_SUFFIX="patch.bz2"
163 vapier 1.325 # @VARIABLE: EPATCH_OPTS
164     # @DESCRIPTION:
165     # Default options for patch:
166     # @CODE
167     # -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
168     # --no-backup-if-mismatch - do not leave .orig files behind
169     # -E - automatically remove empty files
170     # @CODE
171 vapier 1.230 EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
172 vapier 1.325 # @VARIABLE: EPATCH_EXCLUDE
173     # @DESCRIPTION:
174 mr_bones_ 1.308 # List of patches not to apply. Note this is only file names,
175 vapier 1.325 # and not the full path. Globs accepted.
176 azarah 1.6 EPATCH_EXCLUDE=""
177 vapier 1.325 # @VARIABLE: EPATCH_SINGLE_MSG
178     # @DESCRIPTION:
179 azarah 1.9 # Change the printed message for a single patch.
180     EPATCH_SINGLE_MSG=""
181 vapier 1.325 # @VARIABLE: EPATCH_MULTI_MSG
182     # @DESCRIPTION:
183 vapier 1.173 # Change the printed message for multiple patches.
184     EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
185 vapier 1.325 # @VARIABLE: EPATCH_FORCE
186     # @DESCRIPTION:
187     # Only require patches to match EPATCH_SUFFIX rather than the extended
188     # arch naming style.
189 azarah 1.29 EPATCH_FORCE="no"
190 azarah 1.2
191 vapier 1.325 # @FUNCTION: epatch
192     # @USAGE: [patches] [dirs of patches]
193     # @DESCRIPTION:
194     # epatch is designed to greatly simplify the application of patches. It can
195     # process patch files directly, or directories of patches. The patches may be
196     # compressed (bzip/gzip/etc...) or plain text. You generally need not specify
197     # the -p option as epatch will automatically attempt -p0 to -p5 until things
198     # apply successfully.
199 azarah 1.2 #
200 vapier 1.325 # If you do not specify any options, then epatch will default to the directory
201     # specified by EPATCH_SOURCE.
202 azarah 1.2 #
203 vapier 1.325 # When processing directories, epatch will apply all patches that match:
204     # @CODE
205 vapier 1.350 # if ${EPATCH_FORCE} != "yes"
206 vapier 1.325 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
207     # else
208     # *.${EPATCH_SUFFIX}
209     # @CODE
210     # The leading ?? are typically numbers used to force consistent patch ordering.
211     # The arch field is used to apply patches only for the host architecture with
212     # the special value of "all" means apply for everyone. Note that using values
213     # other than "all" is highly discouraged -- you should apply patches all the
214     # time and let architecture details be detected at configure/compile time.
215 azarah 1.2 #
216 vapier 1.325 # If EPATCH_SUFFIX is empty, then no period before it is implied when searching
217     # for patches to apply.
218 azarah 1.2 #
219 vapier 1.325 # Refer to the other EPATCH_xxx variables for more customization of behavior.
220 azarah 1.2 epatch() {
221 swegener 1.231 _epatch_draw_line() {
222 vapier 1.325 # create a line of same length as input string
223 agriffis 1.229 [[ -z $1 ]] && set "$(printf "%65s" '')"
224     echo "${1//?/=}"
225 vapier 1.219 }
226 azarah 1.3
227 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
228    
229 vapier 1.325 # Let the rest of the code process one user arg at a time --
230     # each arg may expand into multiple patches, and each arg may
231     # need to start off with the default global EPATCH_xxx values
232     if [[ $# -gt 1 ]] ; then
233     local m
234 vapier 1.94 for m in "$@" ; do
235     epatch "${m}"
236     done
237     return 0
238 azarah 1.3 fi
239    
240 vapier 1.325 local SINGLE_PATCH="no"
241     # no args means process ${EPATCH_SOURCE}
242     [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"
243    
244     if [[ -f $1 ]] ; then
245 azarah 1.3 SINGLE_PATCH="yes"
246 vapier 1.325 set -- "$1"
247     # Use the suffix from the single patch (localize it); the code
248     # below will find the suffix for us
249     local EPATCH_SUFFIX=$1
250    
251     elif [[ -d $1 ]] ; then
252     # Some people like to make dirs of patches w/out suffixes (vim)
253     set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
254 danarmak 1.32
255 vapier 1.359 elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
256     # Re-use EPATCH_SOURCE as a search dir
257     epatch "${EPATCH_SOURCE}/$1"
258     return $?
259    
260 azarah 1.3 else
261 vapier 1.325 # sanity check ... if it isn't a dir or file, wtf man ?
262     [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
263     echo
264     eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
265     eerror
266     eerror " ${EPATCH_SOURCE}"
267     eerror " ( ${EPATCH_SOURCE##*/} )"
268     echo
269     die "Cannot find \$EPATCH_SOURCE!"
270 azarah 1.3 fi
271 azarah 1.2
272 vapier 1.325 local PIPE_CMD
273 azarah 1.2 case ${EPATCH_SUFFIX##*\.} in
274 vapier 1.325 xz) PIPE_CMD="xz -dc" ;;
275     lzma) PIPE_CMD="lzma -dc" ;;
276     bz2) PIPE_CMD="bzip2 -dc" ;;
277     gz|Z|z) PIPE_CMD="gzip -dc" ;;
278     ZIP|zip) PIPE_CMD="unzip -p" ;;
279     *) ;;
280 azarah 1.2 esac
281    
282 vapier 1.325 [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"
283    
284     local x
285     for x in "$@" ; do
286     # If the patch dir given contains subdirs, or our EPATCH_SUFFIX
287     # didn't match anything, ignore continue on
288     [[ ! -f ${x} ]] && continue
289    
290     local patchname=${x##*/}
291    
292     # Apply single patches, or forced sets of patches, or
293     # patches with ARCH dependant names.
294 flameeyes 1.266 # ???_arch_foo.patch
295 vapier 1.325 # Else, skip this input altogether
296     local a=${patchname#*_} # strip the ???_
297     a=${a%%_*} # strip the _foo.patch
298     if ! [[ ${SINGLE_PATCH} == "yes" || \
299 ulm 1.354 ${EPATCH_FORCE} == "yes" || \
300     ${a} == all || \
301     ${a} == ${ARCH} ]]
302 azarah 1.2 then
303 vapier 1.325 continue
304     fi
305 azarah 1.6
306 vapier 1.325 # Let people filter things dynamically
307     if [[ -n ${EPATCH_EXCLUDE} ]] ; then
308     # let people use globs in the exclude
309     eshopts_push -o noglob
310    
311 scarabeus 1.328 local ex
312 vapier 1.325 for ex in ${EPATCH_EXCLUDE} ; do
313 scarabeus 1.328 if [[ ${patchname} == ${ex} ]] ; then
314     eshopts_pop
315     continue 2
316     fi
317 vapier 1.325 done
318 vapier 1.326
319 vapier 1.325 eshopts_pop
320     fi
321 danarmak 1.32
322 vapier 1.325 if [[ ${SINGLE_PATCH} == "yes" ]] ; then
323     if [[ -n ${EPATCH_SINGLE_MSG} ]] ; then
324     einfo "${EPATCH_SINGLE_MSG}"
325 azarah 1.3 else
326 vapier 1.325 einfo "Applying ${patchname} ..."
327 azarah 1.3 fi
328 vapier 1.325 else
329     einfo " ${patchname} ..."
330     fi
331 azarah 1.2
332 vapier 1.325 # most of the time, there will only be one run per unique name,
333     # but if there are more, make sure we get unique log filenames
334     local STDERR_TARGET="${T}/${patchname}.out"
335     if [[ -e ${STDERR_TARGET} ]] ; then
336     STDERR_TARGET="${T}/${patchname}-$$.out"
337     fi
338 azarah 1.2
339 vapier 1.325 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}"
340 vapier 1.304
341 vapier 1.325 # Decompress the patch if need be
342     local count=0
343     local PATCH_TARGET
344     if [[ -n ${PIPE_CMD} ]] ; then
345     PATCH_TARGET="${T}/$$.patch"
346     echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"
347 vapier 1.304
348 vapier 1.325 if ! (${PIPE_CMD} "${x}" > "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
349     echo
350     eerror "Could not extract patch!"
351     #die "Could not extract patch!"
352     count=5
353     break
354 vapier 1.305 fi
355 vapier 1.325 else
356     PATCH_TARGET=${x}
357     fi
358 vapier 1.305
359 vapier 1.325 # Check for absolute paths in patches. If sandbox is disabled,
360     # people could (accidently) patch files in the root filesystem.
361     # Or trigger other unpleasantries #237667. So disallow -p0 on
362     # such patches.
363     local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
364     if [[ -n ${abs_paths} ]] ; then
365     count=1
366     printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
367     fi
368 vapier 1.353 # Similar reason, but with relative paths.
369     local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}")
370     if [[ -n ${rel_paths} ]] ; then
371     eqawarn "QA Notice: Your patch uses relative paths '../'."
372     eqawarn " In the future this will cause a failure."
373     eqawarn "${rel_paths}"
374     fi
375 vapier 1.325
376     # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
377     while [[ ${count} -lt 5 ]] ; do
378     # Generate some useful debug info ...
379     (
380     _epatch_draw_line "***** ${patchname} *****"
381     echo
382     echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
383     echo
384     _epatch_draw_line "***** ${patchname} *****"
385     ) >> "${STDERR_TARGET}"
386 azarah 1.8
387 vapier 1.325 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
388     (
389     _epatch_draw_line "***** ${patchname} *****"
390     echo
391     echo "ACTUALLY APPLYING ${patchname} ..."
392     echo
393     _epatch_draw_line "***** ${patchname} *****"
394     patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
395     ) >> "${STDERR_TARGET}"
396 danarmak 1.32
397 vapier 1.325 if [ $? -ne 0 ] ; then
398     echo
399     eerror "A dry-run of patch command succeeded, but actually"
400     eerror "applying the patch failed!"
401     #die "Real world sux compared to the dreamworld!"
402     count=5
403 azarah 1.2 fi
404 vapier 1.325 break
405 azarah 1.8 fi
406    
407 vapier 1.325 : $(( count++ ))
408     done
409 azarah 1.8
410 vapier 1.325 # if we had to decompress the patch, delete the temp one
411     if [[ -n ${PIPE_CMD} ]] ; then
412     rm -f "${PATCH_TARGET}"
413     fi
414 azarah 1.3
415 vapier 1.325 if [[ ${count} -ge 5 ]] ; then
416     echo
417     eerror "Failed Patch: ${patchname} !"
418     eerror " ( ${PATCH_TARGET} )"
419     eerror
420     eerror "Include in your bugreport the contents of:"
421     eerror
422     eerror " ${STDERR_TARGET}"
423     echo
424     die "Failed Patch: ${patchname}!"
425 azarah 1.2 fi
426 vapier 1.325
427     # if everything worked, delete the patch log
428     rm -f "${STDERR_TARGET}"
429     eend 0
430 azarah 1.2 done
431 vapier 1.325
432     [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
433     : # everything worked
434 azarah 1.26 }
435 vapier 1.318 epatch_user() {
436     [[ $# -ne 0 ]] && die "epatch_user takes no options"
437    
438     # don't clobber any EPATCH vars that the parent might want
439 zmedico 1.323 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
440 vapier 1.318 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
441     EPATCH_SOURCE=${base}/${CTARGET}/${check}
442     [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
443     [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
444     if [[ -d ${EPATCH_SOURCE} ]] ; then
445     EPATCH_SOURCE=${EPATCH_SOURCE} \
446     EPATCH_SUFFIX="patch" \
447     EPATCH_FORCE="yes" \
448     EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
449     epatch
450 vapier 1.349 return 0
451 vapier 1.318 fi
452     done
453 vapier 1.349 return 1
454 vapier 1.318 }
455 azarah 1.26
456 vapier 1.283 # @FUNCTION: emktemp
457     # @USAGE: [temp dir]
458     # @DESCRIPTION:
459 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
460 vapier 1.283 # does not exist on the users system.
461 vapier 1.117 emktemp() {
462 vapier 1.119 local exe="touch"
463 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
464     local topdir=$1
465 mr_bones_ 1.100
466 vapier 1.194 if [[ -z ${topdir} ]] ; then
467     [[ -z ${T} ]] \
468 vapier 1.117 && topdir="/tmp" \
469 vapier 1.194 || topdir=${T}
470 vapier 1.117 fi
471    
472 vapier 1.280 if ! type -P mktemp > /dev/null ; then
473     # system lacks `mktemp` so we have to fake it
474 vapier 1.117 local tmp=/
475 vapier 1.194 while [[ -e ${tmp} ]] ; do
476     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
477 vapier 1.117 done
478 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
479 vapier 1.117 echo "${tmp}"
480 vapier 1.52 else
481 vapier 1.280 # the args here will give slightly wierd names on BSD,
482     # but should produce a usable file on all userlands
483 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
484 vapier 1.280 TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX
485 flameeyes 1.223 else
486 vapier 1.280 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
487 flameeyes 1.223 fi
488 vapier 1.52 fi
489     }
490    
491 vapier 1.283 # @FUNCTION: egetent
492     # @USAGE: <database> <key>
493     # @MAINTAINER:
494     # base-system@gentoo.org (Linux)
495     # Joe Jezak <josejx@gmail.com> (OS X)
496     # usata@gentoo.org (OS X)
497     # Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
498     # @DESCRIPTION:
499 grobian 1.310 # Small wrapper for getent (Linux),
500     # nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
501 ka0ttic 1.108 # and pw (FreeBSD) used in enewuser()/enewgroup()
502 usata 1.91 egetent() {
503 flameeyes 1.205 case ${CHOST} in
504 grobian 1.319 *-darwin[678])
505 grobian 1.310 case "$2" in
506     *[!0-9]*) # Non numeric
507 betelgeuse 1.357 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2\$/) {print \$0;exit;} }"
508 grobian 1.310 ;;
509     *) # Numeric
510 grobian 1.319 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
511 grobian 1.310 ;;
512     esac
513     ;;
514 flameeyes 1.205 *-darwin*)
515 grobian 1.319 local mytype=$1
516     [[ "passwd" == $mytype ]] && mytype="Users"
517     [[ "group" == $mytype ]] && mytype="Groups"
518 usata 1.91 case "$2" in
519 flameeyes 1.205 *[!0-9]*) # Non numeric
520 grobian 1.319 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
521 usata 1.91 ;;
522 flameeyes 1.205 *) # Numeric
523 grobian 1.319 local mykey="UniqueID"
524     [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
525     dscl . -search /$mytype $mykey $2 2>/dev/null
526 usata 1.91 ;;
527     esac
528 flameeyes 1.205 ;;
529 flameeyes 1.220 *-freebsd*|*-dragonfly*)
530 ka0ttic 1.203 local opts action="user"
531     [[ $1 == "passwd" ]] || action="group"
532    
533     # lookup by uid/gid
534     if [[ $2 == [[:digit:]]* ]] ; then
535     [[ ${action} == "user" ]] && opts="-u" || opts="-g"
536 ka0ttic 1.108 fi
537 ka0ttic 1.203
538     pw show ${action} ${opts} "$2" -q
539 flameeyes 1.205 ;;
540 flameeyes 1.218 *-netbsd*|*-openbsd*)
541 flameeyes 1.206 grep "$2:\*:" /etc/$1
542     ;;
543 flameeyes 1.205 *)
544     type -p nscd >& /dev/null && nscd -i "$1"
545 vapier 1.107 getent "$1" "$2"
546 flameeyes 1.205 ;;
547     esac
548 usata 1.91 }
549    
550 vapier 1.283 # @FUNCTION: enewuser
551     # @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
552     # @DESCRIPTION:
553     # Same as enewgroup, you are not required to understand how to properly add
554     # a user to the system. The only required parameter is the username.
555     # Default uid is (pass -1 for this) next available, default shell is
556     # /bin/false, default homedir is /dev/null, there are no default groups,
557     # and default params sets the comment as 'added by portage for ${PN}'.
558 vapier 1.23 enewuser() {
559 vapier 1.233 case ${EBUILD_PHASE} in
560     unpack|compile|test|install)
561     eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
562     eerror "Package fails at QA and at life. Please file a bug."
563     die "Bad package! enewuser is only for use in pkg_* functions!"
564     esac
565    
566 vapier 1.23 # get the username
567 vapier 1.182 local euser=$1; shift
568     if [[ -z ${euser} ]] ; then
569 vapier 1.23 eerror "No username specified !"
570     die "Cannot call enewuser without a username"
571     fi
572    
573 vapier 1.84 # lets see if the username already exists
574 agriffis 1.256 if [[ -n $(egetent passwd "${euser}") ]] ; then
575 vapier 1.23 return 0
576     fi
577 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
578 vapier 1.23
579     # options to pass to useradd
580 azarah 1.59 local opts=
581 vapier 1.23
582     # handle uid
583 vapier 1.182 local euid=$1; shift
584 agriffis 1.256 if [[ -n ${euid} && ${euid} != -1 ]] ; then
585 vapier 1.182 if [[ ${euid} -gt 0 ]] ; then
586 agriffis 1.256 if [[ -n $(egetent passwd ${euid}) ]] ; then
587 vapier 1.84 euid="next"
588 vapier 1.82 fi
589 vapier 1.23 else
590     eerror "Userid given but is not greater than 0 !"
591     die "${euid} is not a valid UID"
592     fi
593     else
594 vapier 1.84 euid="next"
595     fi
596 vapier 1.182 if [[ ${euid} == "next" ]] ; then
597 agriffis 1.256 for ((euid = 101; euid <= 999; euid++)); do
598 vapier 1.182 [[ -z $(egetent passwd ${euid}) ]] && break
599 vapier 1.84 done
600 vapier 1.23 fi
601 vapier 1.84 opts="${opts} -u ${euid}"
602 vapier 1.23 einfo " - Userid: ${euid}"
603    
604     # handle shell
605 vapier 1.182 local eshell=$1; shift
606     if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
607 vapier 1.221 if [[ ! -e ${ROOT}${eshell} ]] ; then
608 vapier 1.23 eerror "A shell was specified but it does not exist !"
609 vapier 1.221 die "${eshell} does not exist in ${ROOT}"
610     fi
611     if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
612     eerror "Do not specify ${eshell} yourself, use -1"
613     die "Pass '-1' as the shell parameter"
614 vapier 1.23 fi
615     else
616 vapier 1.204 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
617     [[ -x ${ROOT}${shell} ]] && break
618 flameeyes 1.198 done
619    
620 vapier 1.204 if [[ ${shell} == "/dev/null" ]] ; then
621 flameeyes 1.253 eerror "Unable to identify the shell to use, proceeding with userland default."
622     case ${USERLAND} in
623     GNU) shell="/bin/false" ;;
624     BSD) shell="/sbin/nologin" ;;
625     Darwin) shell="/usr/sbin/nologin" ;;
626     *) die "Unable to identify the default shell for userland ${USERLAND}"
627     esac
628 flameeyes 1.198 fi
629    
630     eshell=${shell}
631 vapier 1.23 fi
632     einfo " - Shell: ${eshell}"
633     opts="${opts} -s ${eshell}"
634    
635     # handle homedir
636 vapier 1.182 local ehome=$1; shift
637     if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
638 azarah 1.59 ehome="/dev/null"
639 vapier 1.23 fi
640     einfo " - Home: ${ehome}"
641     opts="${opts} -d ${ehome}"
642    
643     # handle groups
644 vapier 1.182 local egroups=$1; shift
645     if [[ ! -z ${egroups} ]] ; then
646     local oldifs=${IFS}
647 vapier 1.107 local defgroup="" exgroups=""
648    
649 vapier 1.23 export IFS=","
650 vapier 1.182 for g in ${egroups} ; do
651     export IFS=${oldifs}
652     if [[ -z $(egetent group "${g}") ]] ; then
653 vapier 1.85 eerror "You must add group ${g} to the system first"
654 vapier 1.23 die "${g} is not a valid GID"
655     fi
656 vapier 1.182 if [[ -z ${defgroup} ]] ; then
657     defgroup=${g}
658 vapier 1.107 else
659     exgroups="${exgroups},${g}"
660     fi
661 usata 1.115 export IFS=","
662 vapier 1.23 done
663 vapier 1.182 export IFS=${oldifs}
664 vapier 1.107
665     opts="${opts} -g ${defgroup}"
666 vapier 1.182 if [[ ! -z ${exgroups} ]] ; then
667 vapier 1.107 opts="${opts} -G ${exgroups:1}"
668     fi
669 vapier 1.23 else
670     egroups="(none)"
671     fi
672     einfo " - Groups: ${egroups}"
673    
674     # handle extra and add the user
675 vapier 1.182 local oldsandbox=${SANDBOX_ON}
676 vapier 1.23 export SANDBOX_ON="0"
677 flameeyes 1.205 case ${CHOST} in
678     *-darwin*)
679 usata 1.91 ### Make the user
680 vapier 1.182 if [[ -z $@ ]] ; then
681 usata 1.91 dscl . create /users/${euser} uid ${euid}
682     dscl . create /users/${euser} shell ${eshell}
683     dscl . create /users/${euser} home ${ehome}
684     dscl . create /users/${euser} realname "added by portage for ${PN}"
685     ### Add the user to the groups specified
686 vapier 1.182 local oldifs=${IFS}
687 usata 1.115 export IFS=","
688 vapier 1.182 for g in ${egroups} ; do
689 usata 1.91 dscl . merge /groups/${g} users ${euser}
690     done
691 vapier 1.182 export IFS=${oldifs}
692 usata 1.91 else
693 vapier 1.182 einfo "Extra options are not supported on Darwin yet"
694 usata 1.91 einfo "Please report the ebuild along with the info below"
695 vapier 1.182 einfo "eextra: $@"
696 usata 1.91 die "Required function missing"
697     fi
698 vapier 1.182 ;;
699 flameeyes 1.220 *-freebsd*|*-dragonfly*)
700 vapier 1.182 if [[ -z $@ ]] ; then
701 ka0ttic 1.108 pw useradd ${euser} ${opts} \
702     -c "added by portage for ${PN}" \
703     die "enewuser failed"
704     else
705 vapier 1.182 einfo " - Extra: $@"
706 ka0ttic 1.108 pw useradd ${euser} ${opts} \
707 vapier 1.182 "$@" || die "enewuser failed"
708 ka0ttic 1.108 fi
709 vapier 1.182 ;;
710 flameeyes 1.207
711     *-netbsd*)
712     if [[ -z $@ ]] ; then
713     useradd ${opts} ${euser} || die "enewuser failed"
714     else
715     einfo " - Extra: $@"
716     useradd ${opts} ${euser} "$@" || die "enewuser failed"
717     fi
718     ;;
719 flameeyes 1.218
720     *-openbsd*)
721     if [[ -z $@ ]] ; then
722     useradd -u ${euid} -s ${eshell} \
723     -d ${ehome} -c "Added by portage for ${PN}" \
724     -g ${egroups} ${euser} || die "enewuser failed"
725     else
726     einfo " - Extra: $@"
727     useradd -u ${euid} -s ${eshell} \
728     -d ${ehome} -c "Added by portage for ${PN}" \
729     -g ${egroups} ${euser} "$@" || die "enewuser failed"
730     fi
731     ;;
732    
733 vapier 1.182 *)
734     if [[ -z $@ ]] ; then
735 cardoe 1.345 useradd -r ${opts} \
736 usata 1.91 -c "added by portage for ${PN}" \
737 grobian 1.321 ${euser} \
738 usata 1.91 || die "enewuser failed"
739     else
740 vapier 1.182 einfo " - Extra: $@"
741 cardoe 1.345 useradd -r ${opts} "$@" \
742 grobian 1.321 ${euser} \
743 usata 1.91 || die "enewuser failed"
744     fi
745 vapier 1.182 ;;
746     esac
747 vapier 1.23
748 vapier 1.193 if [[ ! -e ${ROOT}/${ehome} ]] ; then
749     einfo " - Creating ${ehome} in ${ROOT}"
750     mkdir -p "${ROOT}/${ehome}"
751     chown ${euser} "${ROOT}/${ehome}"
752     chmod 755 "${ROOT}/${ehome}"
753 vapier 1.23 fi
754 vapier 1.193
755     export SANDBOX_ON=${oldsandbox}
756 vapier 1.23 }
757    
758 vapier 1.283 # @FUNCTION: enewgroup
759     # @USAGE: <group> [gid]
760     # @DESCRIPTION:
761     # This function does not require you to understand how to properly add a
762     # group to the system. Just give it a group name to add and enewgroup will
763     # do the rest. You may specify the gid for the group or allow the group to
764     # allocate the next available one.
765 vapier 1.23 enewgroup() {
766 vapier 1.233 case ${EBUILD_PHASE} in
767     unpack|compile|test|install)
768     eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
769     eerror "Package fails at QA and at life. Please file a bug."
770     die "Bad package! enewgroup is only for use in pkg_* functions!"
771     esac
772    
773 vapier 1.23 # get the group
774     local egroup="$1"; shift
775 azarah 1.59 if [ -z "${egroup}" ]
776     then
777 vapier 1.23 eerror "No group specified !"
778     die "Cannot call enewgroup without a group"
779     fi
780    
781     # see if group already exists
782 agriffis 1.256 if [[ -n $(egetent group "${egroup}") ]]; then
783 vapier 1.23 return 0
784     fi
785 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
786 vapier 1.23
787     # options to pass to useradd
788 azarah 1.59 local opts=
789 vapier 1.23
790     # handle gid
791     local egid="$1"; shift
792 azarah 1.59 if [ ! -z "${egid}" ]
793     then
794     if [ "${egid}" -gt 0 ]
795     then
796 usata 1.91 if [ -z "`egetent group ${egid}`" ]
797 vapier 1.83 then
798 flameeyes 1.205 if [[ "${CHOST}" == *-darwin* ]]; then
799 usata 1.91 opts="${opts} ${egid}"
800     else
801     opts="${opts} -g ${egid}"
802     fi
803 vapier 1.83 else
804 vapier 1.84 egid="next available; requested gid taken"
805 vapier 1.83 fi
806 vapier 1.23 else
807     eerror "Groupid given but is not greater than 0 !"
808     die "${egid} is not a valid GID"
809     fi
810     else
811     egid="next available"
812     fi
813     einfo " - Groupid: ${egid}"
814    
815     # handle extra
816     local eextra="$@"
817     opts="${opts} ${eextra}"
818    
819     # add the group
820 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
821 vapier 1.23 export SANDBOX_ON="0"
822 flameeyes 1.205 case ${CHOST} in
823     *-darwin*)
824 usata 1.91 if [ ! -z "${eextra}" ];
825     then
826 vapier 1.179 einfo "Extra options are not supported on Darwin/OS X yet"
827 usata 1.91 einfo "Please report the ebuild along with the info below"
828     einfo "eextra: ${eextra}"
829     die "Required function missing"
830     fi
831 mr_bones_ 1.100
832 usata 1.91 # If we need the next available
833     case ${egid} in
834 flameeyes 1.205 *[!0-9]*) # Non numeric
835 agriffis 1.256 for ((egid = 101; egid <= 999; egid++)); do
836     [[ -z $(egetent group ${egid}) ]] && break
837 usata 1.91 done
838     esac
839     dscl . create /groups/${egroup} gid ${egid}
840 mr_bones_ 1.100 dscl . create /groups/${egroup} passwd '*'
841 flameeyes 1.205 ;;
842    
843 flameeyes 1.220 *-freebsd*|*-dragonfly*)
844 ka0ttic 1.108 case ${egid} in
845     *[!0-9]*) # Non numeric
846 agriffis 1.256 for ((egid = 101; egid <= 999; egid++)); do
847     [[ -z $(egetent group ${egid}) ]] && break
848 ka0ttic 1.108 done
849     esac
850     pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
851 flameeyes 1.205 ;;
852 flameeyes 1.206
853     *-netbsd*)
854     case ${egid} in
855     *[!0-9]*) # Non numeric
856 agriffis 1.256 for ((egid = 101; egid <= 999; egid++)); do
857     [[ -z $(egetent group ${egid}) ]] && break
858 flameeyes 1.206 done
859     esac
860 flameeyes 1.207 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
861 flameeyes 1.206 ;;
862    
863 flameeyes 1.205 *)
864 cardoe 1.345 # We specify -r so that we get a GID in the system range from login.defs
865     groupadd -r ${opts} ${egroup} || die "enewgroup failed"
866 flameeyes 1.205 ;;
867     esac
868 vapier 1.23 export SANDBOX_ON="${oldsandbox}"
869 vapier 1.24 }
870    
871 vapier 1.283 # @FUNCTION: edos2unix
872     # @USAGE: <file> [more files ...]
873     # @DESCRIPTION:
874     # A handy replacement for dos2unix, recode, fixdos, etc... This allows you
875     # to remove all of these text utilities from DEPEND variables because this
876     # is a script based solution. Just give it a list of files to convert and
877     # they will all be changed from the DOS CRLF format to the UNIX LF format.
878 vapier 1.24 edos2unix() {
879 vapier 1.263 echo "$@" | xargs sed -i 's/\r$//'
880 vapier 1.39 }
881    
882     # Make a desktop file !
883     # Great for making those icons in kde/gnome startmenu !
884 flameeyes 1.266 # Amaze your friends ! Get the women ! Join today !
885 vapier 1.39 #
886 vapier 1.341 # make_desktop_entry(<command>, [name], [icon], [type], [fields])
887 vapier 1.39 #
888 tupone 1.238 # binary: what command does the app run with ?
889 vapier 1.39 # name: the name that will show up in the menu
890     # icon: give your little like a pretty little icon ...
891 vapier 1.118 # this can be relative (to /usr/share/pixmaps) or
892     # a full path to an icon
893 flameeyes 1.266 # type: what kind of application is this ? for categories:
894 vapier 1.284 # http://standards.freedesktop.org/menu-spec/latest/apa.html
895 vapier 1.341 # fields: extra fields to append to the desktop file; a printf string
896 vapier 1.39 make_desktop_entry() {
897 vapier 1.341 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
898 vapier 1.39
899 vapier 1.158 local exec=${1}
900     local name=${2:-${PN}}
901 wolf31o2 1.293 local icon=${3:-${PN}}
902 vapier 1.158 local type=${4}
903 vapier 1.341 local fields=${5}
904 vapier 1.158
905     if [[ -z ${type} ]] ; then
906     local catmaj=${CATEGORY%%-*}
907     local catmin=${CATEGORY##*-}
908     case ${catmaj} in
909     app)
910     case ${catmin} in
911 vapier 1.284 accessibility) type=Accessibility;;
912 vapier 1.338 admin) type=System;;
913     antivirus) type=System;;
914     arch) type=Archiving;;
915     backup) type=Archiving;;
916     cdr) type=DiscBurning;;
917     dicts) type=Dictionary;;
918     doc) type=Documentation;;
919     editors) type=TextEditor;;
920     emacs) type=TextEditor;;
921     emulation) type=Emulator;;
922     laptop) type=HardwareSettings;;
923     office) type=Office;;
924     pda) type=PDA;;
925     vim) type=TextEditor;;
926     xemacs) type=TextEditor;;
927 vapier 1.158 esac
928 azarah 1.59 ;;
929 vapier 1.158
930     dev)
931 vapier 1.159 type="Development"
932 vapier 1.158 ;;
933    
934     games)
935     case ${catmin} in
936 wolf31o2 1.265 action|fps) type=ActionGame;;
937 vapier 1.338 arcade) type=ArcadeGame;;
938     board) type=BoardGame;;
939     emulation) type=Emulator;;
940     kids) type=KidsGame;;
941     puzzle) type=LogicGame;;
942     roguelike) type=RolePlaying;;
943     rpg) type=RolePlaying;;
944 vapier 1.158 simulation) type=Simulation;;
945 vapier 1.338 sports) type=SportsGame;;
946     strategy) type=StrategyGame;;
947 vapier 1.158 esac
948 vapier 1.159 type="Game;${type}"
949 vapier 1.158 ;;
950    
951 vapier 1.284 gnome)
952     type="Gnome;GTK"
953     ;;
954    
955     kde)
956     type="KDE;Qt"
957     ;;
958    
959 vapier 1.158 mail)
960 vapier 1.159 type="Network;Email"
961 vapier 1.158 ;;
962    
963     media)
964     case ${catmin} in
965 vapier 1.339 gfx)
966     type=Graphics
967     ;;
968     *)
969     case ${catmin} in
970     radio) type=Tuner;;
971     sound) type=Audio;;
972     tv) type=TV;;
973     video) type=Video;;
974     esac
975     type="AudioVideo;${type}"
976     ;;
977 vapier 1.158 esac
978 wolf31o2 1.65 ;;
979 vapier 1.158
980     net)
981     case ${catmin} in
982     dialup) type=Dialup;;
983 vapier 1.338 ftp) type=FileTransfer;;
984     im) type=InstantMessaging;;
985     irc) type=IRCClient;;
986     mail) type=Email;;
987     news) type=News;;
988     nntp) type=News;;
989     p2p) type=FileTransfer;;
990     voip) type=Telephony;;
991 vapier 1.158 esac
992 vapier 1.159 type="Network;${type}"
993 vapier 1.158 ;;
994    
995     sci)
996     case ${catmin} in
997 vapier 1.284 astro*) type=Astronomy;;
998 vapier 1.338 bio*) type=Biology;;
999     calc*) type=Calculator;;
1000     chem*) type=Chemistry;;
1001 vapier 1.284 elec*) type=Electronics;;
1002 vapier 1.338 geo*) type=Geology;;
1003     math*) type=Math;;
1004 vapier 1.284 physics) type=Physics;;
1005     visual*) type=DataVisualization;;
1006 vapier 1.159 esac
1007 abcd 1.336 type="Education;Science;${type}"
1008 vapier 1.158 ;;
1009    
1010 vapier 1.284 sys)
1011     type="System"
1012     ;;
1013    
1014 vapier 1.158 www)
1015     case ${catmin} in
1016     client) type=WebBrowser;;
1017     esac
1018 abcd 1.336 type="Network;${type}"
1019 azarah 1.59 ;;
1020 vapier 1.158
1021 azarah 1.59 *)
1022     type=
1023     ;;
1024 vapier 1.39 esac
1025     fi
1026 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
1027     local desktop_name="${PN}"
1028     else
1029     local desktop_name="${PN}-${SLOT}"
1030     fi
1031 vapier 1.272 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
1032 vapier 1.271 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
1033 vapier 1.39
1034 abcd 1.336 # Don't append another ";" when a valid category value is provided.
1035     type=${type%;}${type:+;}
1036    
1037     eshopts_push -s extglob
1038     if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then
1039     ewarn "As described in the Icon Theme Specification, icon file extensions are not"
1040     ewarn "allowed in .desktop files if the value is not an absolute path."
1041     icon=${icon%.@(xpm|png|svg)}
1042     fi
1043     eshopts_pop
1044    
1045 vapier 1.271 cat <<-EOF > "${desktop}"
1046     [Desktop Entry]
1047     Name=${name}
1048     Type=Application
1049     Comment=${DESCRIPTION}
1050     Exec=${exec}
1051     TryExec=${exec%% *}
1052     Icon=${icon}
1053 abcd 1.336 Categories=${type}
1054 vapier 1.271 EOF
1055 vapier 1.39
1056 vapier 1.341 if [[ ${fields:-=} != *=* ]] ; then
1057     # 5th arg used to be value to Path=
1058     ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"
1059     fields="Path=${fields}"
1060     fi
1061 vapier 1.342 [[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}"
1062 wolf31o2 1.293
1063 vapier 1.204 (
1064     # wrap the env here so that the 'insinto' call
1065     # doesn't corrupt the env of the caller
1066     insinto /usr/share/applications
1067     doins "${desktop}"
1068 vapier 1.340 ) || die "installing desktop file failed"
1069 danarmak 1.32 }
1070    
1071 vapier 1.283 # @FUNCTION: validate_desktop_entries
1072     # @USAGE: [directories]
1073     # @MAINTAINER:
1074     # Carsten Lohrke <carlo@gentoo.org>
1075     # @DESCRIPTION:
1076 carlo 1.278 # Validate desktop entries using desktop-file-utils
1077 carlo 1.277 validate_desktop_entries() {
1078     if [[ -x /usr/bin/desktop-file-validate ]] ; then
1079     einfo "Checking desktop entry validity"
1080     local directories=""
1081 carlo 1.279 for d in /usr/share/applications $@ ; do
1082     [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"
1083 carlo 1.277 done
1084 carlo 1.279 if [[ -n ${directories} ]] ; then
1085     for FILE in $(find ${directories} -name "*\.desktop" \
1086     -not -path '*.hidden*' | sort -u 2>/dev/null)
1087     do
1088     local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | \
1089     sed -e "s|error: ||" -e "s|${FILE}:|--|g" )
1090     [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}
1091     done
1092     fi
1093 carlo 1.277 echo ""
1094     else
1095     einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
1096     fi
1097     }
1098    
1099 vapier 1.283 # @FUNCTION: make_session_desktop
1100 vapier 1.314 # @USAGE: <title> <command> [command args...]
1101 vapier 1.283 # @DESCRIPTION:
1102     # Make a GDM/KDM Session file. The title is the file to execute to start the
1103     # Window Manager. The command is the name of the Window Manager.
1104 vapier 1.314 #
1105     # You can set the name of the file via the ${wm} variable.
1106 lanius 1.133 make_session_desktop() {
1107 vapier 1.314 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
1108     [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
1109 lanius 1.133
1110 vapier 1.167 local title=$1
1111     local command=$2
1112 vapier 1.314 local desktop=${T}/${wm:-${PN}}.desktop
1113     shift 2
1114 lanius 1.133
1115 vapier 1.271 cat <<-EOF > "${desktop}"
1116     [Desktop Entry]
1117     Name=${title}
1118     Comment=This session logs you into ${title}
1119 vapier 1.314 Exec=${command} $*
1120 vapier 1.271 TryExec=${command}
1121 vapier 1.314 Type=XSession
1122 vapier 1.271 EOF
1123 lanius 1.133
1124 vapier 1.271 (
1125     # wrap the env here so that the 'insinto' call
1126     # doesn't corrupt the env of the caller
1127 lanius 1.133 insinto /usr/share/xsessions
1128     doins "${desktop}"
1129 vapier 1.271 )
1130 lanius 1.133 }
1131    
1132 vapier 1.283 # @FUNCTION: domenu
1133     # @USAGE: <menus>
1134     # @DESCRIPTION:
1135     # Install the list of .desktop menu files into the appropriate directory
1136     # (/usr/share/applications).
1137 lanius 1.133 domenu() {
1138 vapier 1.271 (
1139     # wrap the env here so that the 'insinto' call
1140     # doesn't corrupt the env of the caller
1141     local i j ret=0
1142 lanius 1.133 insinto /usr/share/applications
1143 vapier 1.167 for i in "$@" ; do
1144     if [[ -f ${i} ]] ; then
1145     doins "${i}"
1146 vapier 1.271 ((ret+=$?))
1147 vapier 1.167 elif [[ -d ${i} ]] ; then
1148     for j in "${i}"/*.desktop ; do
1149     doins "${j}"
1150 vapier 1.271 ((ret+=$?))
1151 lanius 1.133 done
1152 vapier 1.285 else
1153     ((++ret))
1154 swegener 1.190 fi
1155 lanius 1.133 done
1156 vapier 1.271 exit ${ret}
1157     )
1158 lanius 1.133 }
1159 vapier 1.283
1160     # @FUNCTION: newmenu
1161     # @USAGE: <menu> <newname>
1162     # @DESCRIPTION:
1163     # Like all other new* functions, install the specified menu as newname.
1164 vapier 1.167 newmenu() {
1165 vapier 1.271 (
1166     # wrap the env here so that the 'insinto' call
1167     # doesn't corrupt the env of the caller
1168 vapier 1.167 insinto /usr/share/applications
1169 vapier 1.271 newins "$@"
1170     )
1171 vapier 1.167 }
1172 lanius 1.133
1173 vapier 1.283 # @FUNCTION: doicon
1174     # @USAGE: <list of icons>
1175     # @DESCRIPTION:
1176     # Install the list of icons into the icon directory (/usr/share/pixmaps).
1177     # This is useful in conjunction with creating desktop/menu files.
1178 lanius 1.133 doicon() {
1179 vapier 1.271 (
1180     # wrap the env here so that the 'insinto' call
1181     # doesn't corrupt the env of the caller
1182     local i j ret
1183 lanius 1.133 insinto /usr/share/pixmaps
1184 vapier 1.167 for i in "$@" ; do
1185     if [[ -f ${i} ]] ; then
1186     doins "${i}"
1187 vapier 1.271 ((ret+=$?))
1188 vapier 1.167 elif [[ -d ${i} ]] ; then
1189     for j in "${i}"/*.png ; do
1190     doins "${j}"
1191 vapier 1.271 ((ret+=$?))
1192 lanius 1.133 done
1193 vapier 1.285 else
1194     ((++ret))
1195 swegener 1.190 fi
1196 lanius 1.133 done
1197 vapier 1.271 exit ${ret}
1198     )
1199 lanius 1.133 }
1200 vapier 1.283
1201     # @FUNCTION: newicon
1202     # @USAGE: <icon> <newname>
1203     # @DESCRIPTION:
1204     # Like all other new* functions, install the specified icon as newname.
1205 vapier 1.167 newicon() {
1206 vapier 1.271 (
1207     # wrap the env here so that the 'insinto' call
1208     # doesn't corrupt the env of the caller
1209 vapier 1.167 insinto /usr/share/pixmaps
1210 vapier 1.271 newins "$@"
1211     )
1212 vapier 1.167 }
1213 lanius 1.133
1214 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1215     find_unpackable_file() {
1216 vapier 1.196 local src=$1
1217     if [[ -z ${src} ]] ; then
1218     src=${DISTDIR}/${A}
1219 vapier 1.50 else
1220 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
1221     src=${DISTDIR}/${src}
1222     elif [[ -e ${PWD}/${src} ]] ; then
1223     src=${PWD}/${src}
1224     elif [[ -e ${src} ]] ; then
1225     src=${src}
1226 vapier 1.50 fi
1227     fi
1228 vapier 1.196 [[ ! -e ${src} ]] && return 1
1229 vapier 1.70 echo "${src}"
1230     }
1231    
1232 vapier 1.283 # @FUNCTION: unpack_pdv
1233     # @USAGE: <file to unpack> <size of off_t>
1234     # @DESCRIPTION:
1235 vapier 1.70 # Unpack those pesky pdv generated files ...
1236     # They're self-unpacking programs with the binary package stuffed in
1237     # the middle of the archive. Valve seems to use it a lot ... too bad
1238     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1239 swegener 1.286 #
1240 vapier 1.283 # You have to specify the off_t size ... I have no idea how to extract that
1241     # information out of the binary executable myself. Basically you pass in
1242     # the size of the off_t type (in bytes) on the machine that built the pdv
1243     # archive.
1244 vapier 1.70 #
1245 vapier 1.283 # One way to determine this is by running the following commands:
1246 ulm 1.288 #
1247     # @CODE
1248     # strings <pdv archive> | grep lseek
1249     # strace -elseek <pdv archive>
1250     # @CODE
1251     #
1252 vapier 1.283 # Basically look for the first lseek command (we do the strings/grep because
1253     # sometimes the function call is _llseek or something) and steal the 2nd
1254     # parameter. Here is an example:
1255 ulm 1.288 #
1256     # @CODE
1257     # vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1258     # lseek
1259     # vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1260     # lseek(3, -4, SEEK_END) = 2981250
1261     # @CODE
1262     #
1263 vapier 1.283 # Thus we would pass in the value of '4' as the second parameter.
1264 vapier 1.70 unpack_pdv() {
1265 vapier 1.271 local src=$(find_unpackable_file "$1")
1266 vapier 1.196 local sizeoff_t=$2
1267 vapier 1.70
1268 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1269     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1270 vapier 1.70
1271 vapier 1.212 local shrtsrc=$(basename "${src}")
1272 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1273 vapier 1.271 local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\")
1274     local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\")
1275 vapier 1.70
1276     # grab metadata for debug reasons
1277 vapier 1.271 local metafile=$(emktemp)
1278     tail -c +$((${metaskip}+1)) "${src}" > "${metafile}"
1279 vapier 1.70
1280     # rip out the final file name from the metadata
1281 vapier 1.271 local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1)
1282     datafile=$(basename "${datafile}")
1283 vapier 1.70
1284 vapier 1.71 # now lets uncompress/untar the file if need be
1285 vapier 1.271 local tmpfile=$(emktemp)
1286 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1287 vapier 1.71
1288 vapier 1.271 local iscompressed=$(file -b "${tmpfile}")
1289     if [[ ${iscompressed:0:8} == "compress" ]] ; then
1290 vapier 1.71 iscompressed=1
1291     mv ${tmpfile}{,.Z}
1292     gunzip ${tmpfile}
1293     else
1294     iscompressed=0
1295     fi
1296 vapier 1.271 local istar=$(file -b "${tmpfile}")
1297     if [[ ${istar:0:9} == "POSIX tar" ]] ; then
1298 vapier 1.71 istar=1
1299     else
1300     istar=0
1301     fi
1302    
1303     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1304     #dd if=${src} ibs=${metaskip} count=1 \
1305     # | dd ibs=${tailskip} skip=1 \
1306     # | gzip -dc \
1307     # > ${datafile}
1308     if [ ${iscompressed} -eq 1 ] ; then
1309     if [ ${istar} -eq 1 ] ; then
1310     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1311     | head -c $((${metaskip}-${tailskip})) \
1312     | tar -xzf -
1313     else
1314 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1315     | head -c $((${metaskip}-${tailskip})) \
1316     | gzip -dc \
1317     > ${datafile}
1318 vapier 1.71 fi
1319     else
1320     if [ ${istar} -eq 1 ] ; then
1321     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1322     | head -c $((${metaskip}-${tailskip})) \
1323 vapier 1.73 | tar --no-same-owner -xf -
1324 vapier 1.71 else
1325 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1326     | head -c $((${metaskip}-${tailskip})) \
1327     > ${datafile}
1328 vapier 1.71 fi
1329     fi
1330     true
1331     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1332 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1333     }
1334    
1335 vapier 1.283 # @FUNCTION: unpack_makeself
1336     # @USAGE: [file to unpack] [offset] [tail|dd]
1337     # @DESCRIPTION:
1338 vapier 1.70 # Unpack those pesky makeself generated files ...
1339     # They're shell scripts with the binary package tagged onto
1340     # the end of the archive. Loki utilized the format as does
1341     # many other game companies.
1342 swegener 1.286 #
1343 vapier 1.283 # If the file is not specified, then ${A} is used. If the
1344     # offset is not specified then we will attempt to extract
1345     # the proper offset from the script itself.
1346 vapier 1.70 unpack_makeself() {
1347 vapier 1.217 local src_input=${1:-${A}}
1348     local src=$(find_unpackable_file "${src_input}")
1349 vapier 1.196 local skip=$2
1350     local exe=$3
1351    
1352 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1353 vapier 1.50
1354 vapier 1.196 local shrtsrc=$(basename "${src}")
1355 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1356 vapier 1.212 if [[ -z ${skip} ]] ; then
1357 mr_bones_ 1.343 local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}')
1358 vapier 1.41 local skip=0
1359 vapier 1.112 exe=tail
1360 vapier 1.41 case ${ver} in
1361 wolf31o2 1.240 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1362 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1363 vapier 1.41 ;;
1364     2.0|2.0.1)
1365 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1366 vapier 1.41 ;;
1367 wolf31o2 1.48 2.1.1)
1368 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1369 vapier 1.344 (( skip++ ))
1370 wolf31o2 1.48 ;;
1371 vapier 1.49 2.1.2)
1372 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1373 vapier 1.344 (( skip++ ))
1374 vapier 1.49 ;;
1375 wolf31o2 1.48 2.1.3)
1376 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1377 vapier 1.344 (( skip++ ))
1378 vapier 1.41 ;;
1379 wolf31o2 1.211 2.1.4|2.1.5)
1380 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1381     skip=$(head -n ${skip} "${src}" | wc -c)
1382     exe="dd"
1383     ;;
1384 vapier 1.41 *)
1385     eerror "I'm sorry, but I was unable to support the Makeself file."
1386     eerror "The version I detected was '${ver}'."
1387     eerror "Please file a bug about the file ${shrtsrc} at"
1388     eerror "http://bugs.gentoo.org/ so that support can be added."
1389     die "makeself version '${ver}' not supported"
1390     ;;
1391     esac
1392     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1393     fi
1394 vapier 1.112 case ${exe} in
1395     tail) exe="tail -n +${skip} '${src}'";;
1396 vapier 1.344 dd) exe="dd ibs=${skip} skip=1 if='${src}'";;
1397 vapier 1.112 *) die "makeself cant handle exe '${exe}'"
1398     esac
1399 vapier 1.41
1400 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1401 vapier 1.356 local filetype tmpfile=$(emktemp)
1402 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1403 vapier 1.356 filetype=$(file -b "${tmpfile}") || die
1404 vapier 1.68 case ${filetype} in
1405 vapier 1.257 *tar\ archive*)
1406 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1407 vapier 1.68 ;;
1408     bzip2*)
1409 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1410 mr_bones_ 1.69 ;;
1411 vapier 1.68 gzip*)
1412 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1413 vapier 1.68 ;;
1414 vapier 1.93 compress*)
1415 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1416 vapier 1.93 ;;
1417 vapier 1.68 *)
1418 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1419 vapier 1.68 false
1420     ;;
1421     esac
1422     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1423 wolf31o2 1.56 }
1424    
1425 vapier 1.283 # @FUNCTION: check_license
1426     # @USAGE: [license]
1427     # @DESCRIPTION:
1428     # Display a license for user to accept. If no license is
1429     # specified, then ${LICENSE} is used.
1430 wolf31o2 1.56 check_license() {
1431 vapier 1.60 local lic=$1
1432     if [ -z "${lic}" ] ; then
1433     lic="${PORTDIR}/licenses/${LICENSE}"
1434 wolf31o2 1.56 else
1435 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1436     lic="${PORTDIR}/licenses/${lic}"
1437     elif [ -e "${PWD}/${lic}" ] ; then
1438     lic="${PWD}/${lic}"
1439     elif [ -e "${lic}" ] ; then
1440     lic="${lic}"
1441 wolf31o2 1.56 fi
1442     fi
1443 vapier 1.64 local l="`basename ${lic}`"
1444 wolf31o2 1.56
1445 vapier 1.60 # here is where we check for the licenses the user already
1446     # accepted ... if we don't find a match, we make the user accept
1447     local alic
1448 vapier 1.322 eshopts_push -o noglob # so that bash doesn't expand "*"
1449 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1450 wolf31o2 1.255 if [[ ${alic} == ${l} ]]; then
1451 vapier 1.322 eshopts_pop
1452 wolf31o2 1.106 return 0
1453     fi
1454 vapier 1.60 done
1455 vapier 1.322 eshopts_pop
1456 zmedico 1.324 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1457 vapier 1.60
1458 vapier 1.271 local licmsg=$(emktemp)
1459     cat <<-EOF > ${licmsg}
1460     **********************************************************
1461     The following license outlines the terms of use of this
1462     package. You MUST accept this license for installation to
1463     continue. When you are done viewing, hit 'q'. If you
1464     CTRL+C out of this, the install will not run!
1465     **********************************************************
1466 swegener 1.286
1467 vapier 1.271 EOF
1468 vapier 1.60 cat ${lic} >> ${licmsg}
1469     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1470 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1471 vapier 1.60 read alic
1472     case ${alic} in
1473     yes|Yes|y|Y)
1474     return 0
1475     ;;
1476     *)
1477     echo;echo;echo
1478     eerror "You MUST accept the license to continue! Exiting!"
1479     die "Failed to accept license"
1480     ;;
1481     esac
1482 vapier 1.23 }
1483 vapier 1.75
1484 vapier 1.283 # @FUNCTION: cdrom_get_cds
1485     # @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1486     # @DESCRIPTION:
1487 vapier 1.75 # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1488     # the whole 'non-interactive' policy, but damnit I want CD support !
1489 swegener 1.286 #
1490 vapier 1.283 # With these cdrom functions we handle all the user interaction and
1491     # standardize everything. All you have to do is call cdrom_get_cds()
1492 vapier 1.75 # and when the function returns, you can assume that the cd has been
1493     # found at CDROM_ROOT.
1494 swegener 1.286 #
1495 vapier 1.283 # The function will attempt to locate a cd based upon a file that is on
1496     # the cd. The more files you give this function, the more cds
1497     # the cdrom functions will handle.
1498 swegener 1.286 #
1499 vapier 1.283 # Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1500     # etc... If you want to give the cds better names, then just export
1501 vapier 1.243 # the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1502 vapier 1.283 # Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1503     # also use the CDROM_NAME_SET bash array.
1504 swegener 1.286 #
1505 vapier 1.283 # For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1506 vapier 1.75 cdrom_get_cds() {
1507     # first we figure out how many cds we're dealing with by
1508     # the # of files they gave us
1509     local cdcnt=0
1510     local f=
1511     for f in "$@" ; do
1512 vapier 1.214 ((++cdcnt))
1513 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1514     done
1515     export CDROM_TOTAL_CDS=${cdcnt}
1516     export CDROM_CURRENT_CD=1
1517    
1518     # now we see if the user gave use CD_ROOT ...
1519     # if they did, let's just believe them that it's correct
1520 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1521 vapier 1.75 local var=
1522     cdcnt=0
1523 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1524 vapier 1.214 ((++cdcnt))
1525 vapier 1.75 var="CD_ROOT_${cdcnt}"
1526 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1527 vapier 1.131 if [[ -z ${!var} ]] ; then
1528 vapier 1.75 eerror "You must either use just the CD_ROOT"
1529     eerror "or specify ALL the CD_ROOT_X variables."
1530     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1531     die "could not locate CD_ROOT_${cdcnt}"
1532     fi
1533     done
1534 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1535 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1536 vapier 1.215 export CDROM_SET=-1
1537     for f in ${CDROM_CHECK_1//:/ } ; do
1538     ((++CDROM_SET))
1539 cardoe 1.346 [[ -e ${CDROM_ROOT}/${f} ]] && break
1540 vapier 1.215 done
1541     export CDROM_MATCH=${f}
1542 vapier 1.75 return
1543     fi
1544    
1545 vapier 1.215 # User didn't help us out so lets make sure they know they can
1546     # simplify the whole process ...
1547 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1548 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1549 vapier 1.75 echo
1550     einfo "If you do not have the CD, but have the data files"
1551     einfo "mounted somewhere on your filesystem, just export"
1552     einfo "the variable CD_ROOT so that it points to the"
1553     einfo "directory containing the files."
1554     echo
1555 vapier 1.132 einfo "For example:"
1556     einfo "export CD_ROOT=/mnt/cdrom"
1557     echo
1558 vapier 1.75 else
1559 vapier 1.243 if [[ -n ${CDROM_NAME_SET} ]] ; then
1560     # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1561     cdcnt=0
1562     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1563     ((++cdcnt))
1564     export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1565     done
1566     fi
1567    
1568 vapier 1.75 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1569     cdcnt=0
1570 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1571 vapier 1.214 ((++cdcnt))
1572 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1573 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1574 vapier 1.75 done
1575     echo
1576     einfo "If you do not have the CDs, but have the data files"
1577     einfo "mounted somewhere on your filesystem, just export"
1578     einfo "the following variables so they point to the right place:"
1579 nyhm 1.347 einfon ""
1580 vapier 1.75 cdcnt=0
1581 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1582 vapier 1.214 ((++cdcnt))
1583 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1584     done
1585     echo
1586     einfo "Or, if you have all the files in the same place, or"
1587     einfo "you only have one cdrom, you can export CD_ROOT"
1588     einfo "and that place will be used as the same data source"
1589     einfo "for all the CDs."
1590     echo
1591 vapier 1.132 einfo "For example:"
1592     einfo "export CD_ROOT_1=/mnt/cdrom"
1593     echo
1594 vapier 1.75 fi
1595 vapier 1.215
1596 vapier 1.214 export CDROM_SET=""
1597 vapier 1.75 export CDROM_CURRENT_CD=0
1598     cdrom_load_next_cd
1599     }
1600    
1601 vapier 1.283 # @FUNCTION: cdrom_load_next_cd
1602     # @DESCRIPTION:
1603     # Some packages are so big they come on multiple CDs. When you're done reading
1604     # files off a CD and want access to the next one, just call this function.
1605     # Again, all the messy details of user interaction are taken care of for you.
1606     # Once this returns, just read the variable CDROM_ROOT for the location of the
1607     # mounted CD. Note that you can only go forward in the CD list, so make sure
1608     # you only call this function when you're done using the current CD.
1609 vapier 1.75 cdrom_load_next_cd() {
1610 vapier 1.215 local var
1611     ((++CDROM_CURRENT_CD))
1612 vapier 1.79
1613 vapier 1.75 unset CDROM_ROOT
1614 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1615     [[ -z ${!var} ]] && var="CD_ROOT"
1616 vapier 1.131 if [[ -z ${!var} ]] ; then
1617 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1618 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1619 vapier 1.75 else
1620 vapier 1.131 export CDROM_ROOT=${!var}
1621 vapier 1.75 fi
1622    
1623     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1624     }
1625    
1626     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1627     # functions. this should *never* be called from an ebuild.
1628     # all it does is try to locate a give file on a cd ... if the cd isn't
1629     # found, then a message asking for the user to insert the cdrom will be
1630     # displayed and we'll hang out here until:
1631     # (1) the file is found on a mounted cdrom
1632     # (2) the user hits CTRL+C
1633 vapier 1.215 _cdrom_locate_file_on_cd() {
1634 vapier 1.214 local mline=""
1635 wolf31o2 1.296 local showedmsg=0 showjolietmsg=0
1636 vapier 1.214
1637 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1638 vapier 1.214 local i=0
1639     local -a cdset=(${*//:/ })
1640     if [[ -n ${CDROM_SET} ]] ; then
1641     cdset=(${cdset[${CDROM_SET}]})
1642     fi
1643    
1644     while [[ -n ${cdset[${i}]} ]] ; do
1645     local dir=$(dirname ${cdset[${i}]})
1646     local file=$(basename ${cdset[${i}]})
1647    
1648 uberlord 1.259 local point= node= fs= foo=
1649     while read point node fs foo ; do
1650 nyhm 1.281 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1651 uberlord 1.264 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1652     && continue
1653 uberlord 1.259 point=${point//\040/ }
1654 vapier 1.292 [[ ! -d ${point}/${dir} ]] && continue
1655 uberlord 1.259 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1656     export CDROM_ROOT=${point}
1657     export CDROM_SET=${i}
1658     export CDROM_MATCH=${cdset[${i}]}
1659     return
1660 kanaka 1.262 done <<< "$(get_mounts)"
1661 vapier 1.214
1662     ((++i))
1663 vapier 1.75 done
1664    
1665 vapier 1.214 echo
1666     if [[ ${showedmsg} -eq 0 ]] ; then
1667     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1668     if [[ -z ${CDROM_NAME} ]] ; then
1669     einfo "Please insert+mount the cdrom for ${PN} now !"
1670     else
1671     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1672     fi
1673     else
1674     if [[ -z ${CDROM_NAME_1} ]] ; then
1675     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1676 vapier 1.75 else
1677 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1678     einfo "Please insert+mount the ${!var} cdrom now !"
1679 vapier 1.75 fi
1680     fi
1681 vapier 1.214 showedmsg=1
1682 vapier 1.75 fi
1683 vapier 1.214 einfo "Press return to scan for the cd again"
1684     einfo "or hit CTRL+C to abort the emerge."
1685     echo
1686 wolf31o2 1.296 if [[ ${showjolietmsg} -eq 0 ]] ; then
1687     showjolietmsg=1
1688     else
1689     ewarn "If you are having trouble with the detection"
1690     ewarn "of your CD, it is possible that you do not have"
1691     ewarn "Joliet support enabled in your kernel. Please"
1692     ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1693     ebeep 5
1694     fi
1695 vapier 1.222 read || die "something is screwed with your system"
1696 vapier 1.75 done
1697     }
1698 vapier 1.92
1699 vapier 1.287 # @FUNCTION: strip-linguas
1700     # @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1701     # @DESCRIPTION:
1702 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1703 vapier 1.287 # a package can support. The first form allows you to
1704     # specify a list of LINGUAS. The -i builds a list of po
1705     # files found in all the directories and uses the
1706     # intersection of the lists. The -u builds a list of po
1707     # files found in all the directories and uses the union
1708     # of the lists.
1709 vapier 1.92 strip-linguas() {
1710 vapier 1.242 local ls newls nols
1711 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1712     local op=$1; shift
1713 vapier 1.315 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1714 vapier 1.92 local d f
1715     for d in "$@" ; do
1716 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1717     newls=${ls}
1718 vapier 1.92 else
1719     newls=""
1720     fi
1721 vapier 1.315 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1722 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1723 ssuominen 1.358 has ${f} ${ls} && newls="${newls} ${f}"
1724 vapier 1.92 else
1725 ssuominen 1.358 has ${f} ${ls} || newls="${newls} ${f}"
1726 vapier 1.92 fi
1727     done
1728 vapier 1.154 ls=${newls}
1729 vapier 1.92 done
1730     else
1731 vapier 1.236 ls="$@"
1732 vapier 1.92 fi
1733    
1734 vapier 1.242 nols=""
1735 vapier 1.92 newls=""
1736     for f in ${LINGUAS} ; do
1737 ssuominen 1.358 if has ${f} ${ls} ; then
1738 vapier 1.120 newls="${newls} ${f}"
1739 vapier 1.92 else
1740 vapier 1.242 nols="${nols} ${f}"
1741 vapier 1.92 fi
1742     done
1743 vapier 1.244 [[ -n ${nols} ]] \
1744 vapier 1.316 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1745 vapier 1.237 export LINGUAS=${newls:1}
1746 vapier 1.92 }
1747 iggy 1.110
1748 vapier 1.283 # @FUNCTION: preserve_old_lib
1749     # @USAGE: <libs to preserve> [more libs]
1750     # @DESCRIPTION:
1751     # These functions are useful when a lib in your package changes ABI SONAME.
1752     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1753 eradicator 1.111 # would break packages that link against it. Most people get around this
1754     # by using the portage SLOT mechanism, but that is not always a relevant
1755 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1756     # preserve_old_lib_notify function.
1757 eradicator 1.111 preserve_old_lib() {
1758 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1759 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1760 vapier 1.276 die "Invalid preserve_old_lib() usage"
1761 vapier 1.267 fi
1762     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1763    
1764 vapier 1.297 # let portage worry about it
1765     has preserve-libs ${FEATURES} && return 0
1766    
1767 vapier 1.267 local lib dir
1768     for lib in "$@" ; do
1769     [[ -e ${ROOT}/${lib} ]] || continue
1770     dir=${lib%/*}
1771     dodir ${dir} || die "dodir ${dir} failed"
1772     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1773     touch "${D}"/${lib}
1774     done
1775 eradicator 1.111 }
1776    
1777 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1778     # @USAGE: <libs to notify> [more libs]
1779     # @DESCRIPTION:
1780     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1781 eradicator 1.111 preserve_old_lib_notify() {
1782 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1783 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1784 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1785 vapier 1.267 fi
1786    
1787 vapier 1.297 # let portage worry about it
1788     has preserve-libs ${FEATURES} && return 0
1789    
1790 vapier 1.267 local lib notice=0
1791     for lib in "$@" ; do
1792     [[ -e ${ROOT}/${lib} ]] || continue
1793     if [[ ${notice} -eq 0 ]] ; then
1794     notice=1
1795     ewarn "Old versions of installed libraries were detected on your system."
1796     ewarn "In order to avoid breaking packages that depend on these old libs,"
1797     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1798     ewarn "in order to remove these old dependencies. If you do not have this"
1799     ewarn "helper program, simply emerge the 'gentoolkit' package."
1800     ewarn
1801     fi
1802 vapier 1.355 # temp hack for #348634 #357225
1803     [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1804 vapier 1.352 ewarn " # revdep-rebuild --library '${lib}'"
1805 vapier 1.267 done
1806 vapier 1.291 if [[ ${notice} -eq 1 ]] ; then
1807     ewarn
1808     ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1809 vapier 1.300 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1810     for lib in "$@" ; do
1811     ewarn " # rm '${lib}'"
1812     done
1813 vapier 1.291 fi
1814 eradicator 1.111 }
1815 vapier 1.125
1816 vapier 1.283 # @FUNCTION: built_with_use
1817     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1818     # @DESCRIPTION:
1819 betelgeuse 1.329 #
1820     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1821     #
1822 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1823     # flags being enabled in packages. This will check to see if the specified
1824     # DEPEND atom was built with the specified list of USE flags. The
1825     # --missing option controls the behavior if called on a package that does
1826     # not actually support the defined USE flags (aka listed in IUSE).
1827     # The default is to abort (call die). The -a and -o flags control
1828     # the requirements of the USE flags. They correspond to "and" and "or"
1829     # logic. So the -a flag means all listed USE flags must be enabled
1830 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1831 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1832     # means the USE flag we're checking is hidden expanded, so it won't be found
1833     # in IUSE like normal USE flags.
1834 swegener 1.286 #
1835 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1836     # flags matter.
1837 vapier 1.125 built_with_use() {
1838 vapier 1.275 local hidden="no"
1839     if [[ $1 == "--hidden" ]] ; then
1840     hidden="yes"
1841     shift
1842     fi
1843    
1844 vapier 1.269 local missing_action="die"
1845     if [[ $1 == "--missing" ]] ; then
1846     missing_action=$2
1847     shift ; shift
1848     case ${missing_action} in
1849     true|false|die) ;;
1850     *) die "unknown action '${missing_action}'";;
1851     esac
1852     fi
1853    
1854 vapier 1.130 local opt=$1
1855     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1856    
1857     local PKG=$(best_version $1)
1858 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1859 vapier 1.130 shift
1860    
1861 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1862 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1863 vapier 1.213
1864 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1865     # this gracefully
1866 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1867 cardoe 1.273 case ${missing_action} in
1868     true) return 0;;
1869     false) return 1;;
1870     die) die "Unable to determine what USE flags $PKG was built with";;
1871     esac
1872     fi
1873    
1874 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1875 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1876 vapier 1.275 # Don't check USE_EXPAND #147237
1877     local expand
1878     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1879     if [[ $1 == ${expand}_* ]] ; then
1880     expand=""
1881     break
1882     fi
1883     done
1884     if [[ -n ${expand} ]] ; then
1885 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1886 vapier 1.275 case ${missing_action} in
1887     true) return 0;;
1888     false) return 1;;
1889     die) die "$PKG does not actually support the $1 USE flag!";;
1890     esac
1891     fi
1892 vapier 1.269 fi
1893 vapier 1.250 fi
1894 vapier 1.249
1895 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1896 vapier 1.130 while [[ $# -gt 0 ]] ; do
1897     if [[ ${opt} = "-o" ]] ; then
1898     has $1 ${USE_BUILT} && return 0
1899     else
1900     has $1 ${USE_BUILT} || return 1
1901     fi
1902 vapier 1.125 shift
1903     done
1904 vapier 1.130 [[ ${opt} = "-a" ]]
1905 vapier 1.125 }
1906 vapier 1.126
1907 vapier 1.289 # @FUNCTION: epunt_cxx
1908 vapier 1.283 # @USAGE: [dir to scan]
1909     # @DESCRIPTION:
1910     # Many configure scripts wrongly bail when a C++ compiler could not be
1911     # detected. If dir is not specified, then it defaults to ${S}.
1912     #
1913     # http://bugs.gentoo.org/73450
1914 vapier 1.126 epunt_cxx() {
1915 vapier 1.127 local dir=$1
1916     [[ -z ${dir} ]] && dir=${S}
1917     ebegin "Removing useless C++ checks"
1918     local f
1919 vapier 1.294 find "${dir}" -name configure | while read f ; do
1920     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1921 vapier 1.127 done
1922     eend 0
1923 vapier 1.126 }
1924 ka0ttic 1.143
1925 vapier 1.283 # @FUNCTION: make_wrapper
1926 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1927 vapier 1.283 # @DESCRIPTION:
1928     # Create a shell wrapper script named wrapper in installpath
1929     # (defaults to the bindir) to execute target (default of wrapper) by
1930     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1931     # libpaths followed by optionally changing directory to chdir.
1932 wolf31o2 1.160 make_wrapper() {
1933 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1934 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1935 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1936     # things as $bin ... "./someprog --args"
1937 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1938     #!/bin/sh
1939 vapier 1.201 cd "${chdir:-.}"
1940 vapier 1.210 if [ -n "${libdir}" ] ; then
1941     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1942     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1943     else
1944     export LD_LIBRARY_PATH="${libdir}"
1945     fi
1946 vapier 1.201 fi
1947 vapier 1.202 exec ${bin} "\$@"
1948 wolf31o2 1.160 EOF
1949     chmod go+rx "${tmpwrapper}"
1950 vapier 1.201 if [[ -n ${path} ]] ; then
1951 vapier 1.283 (
1952 vapier 1.201 exeinto "${path}"
1953 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1954 vapier 1.283 ) || die
1955 wolf31o2 1.164 else
1956 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1957 wolf31o2 1.164 fi
1958 wolf31o2 1.160 }
1959 mr_bones_ 1.311
1960 vapier 1.351 # @FUNCTION: path_exists
1961     # @USAGE: [-a|-o] <paths>
1962     # @DESCRIPTION:
1963     # Check if the specified paths exist. Works for all types of paths
1964     # (files/dirs/etc...). The -a and -o flags control the requirements
1965     # of the paths. They correspond to "and" and "or" logic. So the -a
1966     # flag means all the paths must exist while the -o flag means at least
1967     # one of the paths must exist. The default behavior is "and". If no
1968     # paths are specified, then the return value is "false".
1969     path_exists() {
1970     local opt=$1
1971     [[ ${opt} == -[ao] ]] && shift || opt="-a"
1972    
1973     # no paths -> return false
1974     # same behavior as: [[ -e "" ]]
1975     [[ $# -eq 0 ]] && return 1
1976    
1977     local p r=0
1978     for p in "$@" ; do
1979     [[ -e ${p} ]]
1980     : $(( r += $? ))
1981     done
1982    
1983     case ${opt} in
1984     -a) return $(( r != 0 )) ;;
1985     -o) return $(( r == $# )) ;;
1986     esac
1987     }

  ViewVC Help
Powered by ViewVC 1.1.20