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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.92 - (hide annotations) (download)
Fri Jun 10 10:14:21 2011 UTC (3 years, 6 months ago) by flameeyes
Branch: MAIN
Changes since 1.91: +3 -5 lines
Use a safer syntax for libtool.eclass (bug #370983).

1 vapier 1.90 # Copyright 1999-2010 Gentoo Foundation
2 vapier 1.15 # Distributed under the terms of the GNU General Public License v2
3 flameeyes 1.92 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.91 2011/06/09 15:53:04 flameeyes Exp $
4 vapier 1.90
5     # @ECLASS: libtool.eclass
6     # @MAINTAINER:
7     # base-system@gentoo.org
8     # @BLURB: quickly update bundled libtool code
9     # @DESCRIPTION:
10 azarah 1.1 # This eclass patches ltmain.sh distributed with libtoolized packages with the
11 azarah 1.24 # relink and portage patch among others
12 vapier 1.75 #
13     # Note, this eclass does not require libtool as it only applies patches to
14     # generated libtool files. We do not run the libtoolize program because that
15     # requires a regeneration of the main autotool files in order to work properly.
16 rac 1.34
17 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
18 azarah 1.1
19 vapier 1.82 inherit toolchain-funcs
20    
21 azarah 1.67 ELT_PATCH_DIR="${ECLASSDIR}/ELT-patches"
22 azarah 1.24
23     #
24     # See if we can apply $2 on $1, and if so, do it
25     #
26     ELT_try_and_apply_patch() {
27     local ret=0
28 azarah 1.57 local file=$1
29     local patch=$2
30 azarah 1.24
31 flameeyes 1.92 echo -e "\nTrying $(basename "$(dirname "${patch}")")-${patch##*/}.patch on ${file}" \
32     &>> "${T}/elibtool.log"
33 flameeyes 1.91
34 azarah 1.24 # We only support patchlevel of 0 - why worry if its static patches?
35 flameeyes 1.91 if patch -p0 --dry-run "${file}" "${patch}" &>> "${T}/elibtool.log" ; then
36 vapier 1.37 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
37 azarah 1.62 patch -p0 -g0 --no-backup-if-mismatch "${file}" "${patch}" \
38 flameeyes 1.91 &>> "${T}/elibtool.log"
39 azarah 1.24 ret=$?
40     export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
41     else
42     ret=1
43     fi
44    
45 azarah 1.57 return "${ret}"
46 azarah 1.24 }
47    
48     #
49 azarah 1.59 # Get string version of ltmain.sh or ltconfig (passed as $1)
50     #
51     ELT_libtool_version() {
52 vapier 1.90 (
53     unset VERSION
54     eval $(grep -e '^[[:space:]]*VERSION=' "$1")
55     echo "${VERSION:-0}"
56     )
57 azarah 1.59 }
58    
59     #
60 azarah 1.24 # Run through the patches in $2 and see if any
61     # apply to $1 ...
62     #
63     ELT_walk_patches() {
64 vapier 1.86 local patch
65 azarah 1.24 local ret=1
66 azarah 1.57 local file=$1
67     local patch_set=$2
68 vapier 1.86 local patch_dir="${ELT_PATCH_DIR}/${patch_set}"
69 azarah 1.57 local rem_int_dep=$3
70 azarah 1.2
71 vapier 1.86 [[ -z ${patch_set} ]] && return 1
72     [[ ! -d ${patch_dir} ]] && return 1
73 mr_bones_ 1.27
74 vapier 1.86 pushd "${ELT_PATCH_DIR}" >/dev/null
75 azarah 1.43
76 vapier 1.86 # Go through the patches in reverse order (newer version to older)
77     for patch in $(find "${patch_set}" -maxdepth 1 -type f | LC_ALL=C sort -r) ; do
78     # For --remove-internal-dep ...
79     if [[ -n ${rem_int_dep} ]] ; then
80     # For replace @REM_INT_DEP@ with what was passed
81     # to --remove-internal-dep
82     local tmp="${T}/$$.rem_int_deps.patch"
83     sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" "${patch}" > "${tmp}"
84     patch=${tmp}
85     fi
86 azarah 1.43
87 vapier 1.86 if ELT_try_and_apply_patch "${file}" "${patch}" ; then
88     # Break to unwind w/popd rather than return directly
89     ret=0
90     break
91     fi
92     done
93 azarah 1.24
94 vapier 1.87 popd >/dev/null
95 vapier 1.86 return ${ret}
96 azarah 1.24 }
97    
98 vapier 1.90 # @FUNCTION: elibtoolize
99     # @USAGE: [dirs] [--portage] [--reverse-deps] [--patch-only] [--remove-internal-dep=xxx] [--shallow] [--no-uclibc]
100     # @DESCRIPTION:
101     # Apply a smorgasbord of patches to bundled libtool files. This function
102     # should always be safe to run. If no directories are specified, then
103     # ${S} will be searched for appropriate files.
104     #
105     # If the --shallow option is used, then only ${S}/ltmain.sh will be patched.
106     #
107     # The other options should be avoided in general unless you know what's going on.
108 azarah 1.24 elibtoolize() {
109 vapier 1.90 local x
110 azarah 1.24 local do_portage="no"
111     local do_reversedeps="no"
112     local do_only_patches="no"
113 azarah 1.56 local do_uclibc="yes"
114 azarah 1.24 local deptoremove=
115 vapier 1.90 local do_shallow="no"
116 loki_val 1.83 local elt_patches="install-sh ltmain portage relink max_cmd_len sed test tmp cross as-needed"
117 mr_bones_ 1.27
118 vapier 1.42 for x in "$@" ; do
119 vapier 1.90 case ${x} in
120     --portage)
121 azarah 1.24 # Only apply portage patch, and don't
122     # 'libtoolize --copy --force' if all patches fail.
123     do_portage="yes"
124     ;;
125 vapier 1.90 --reverse-deps)
126 azarah 1.24 # Apply the reverse-deps patch
127     # http://bugzilla.gnome.org/show_bug.cgi?id=75635
128     do_reversedeps="yes"
129 vapier 1.90 elt_patches+=" fix-relink"
130 azarah 1.24 ;;
131 vapier 1.90 --patch-only)
132 azarah 1.24 # Do not run libtoolize if none of the patches apply ..
133     do_only_patches="yes"
134     ;;
135 vapier 1.90 --remove-internal-dep=*)
136 azarah 1.24 # We will replace @REM_INT_DEP@ with what is needed
137     # in ELT_walk_patches() ...
138 vapier 1.90 deptoremove=${x#--remove-internal-dep=}
139 azarah 1.24
140     # Add the patch for this ...
141 vapier 1.90 [[ -n ${deptoremove} ]] && elt_patches+=" rem-int-dep"
142 azarah 1.24 ;;
143 vapier 1.90 --shallow)
144 azarah 1.24 # Only patch the ltmain.sh in ${S}
145 vapier 1.90 do_shallow="yes"
146 azarah 1.24 ;;
147 vapier 1.90 --no-uclibc)
148 azarah 1.56 do_uclibc="no"
149 vapier 1.40 ;;
150 vapier 1.42 *)
151 azarah 1.57 eerror "Invalid elibtoolize option: ${x}"
152     die "elibtoolize called with ${x} ??"
153 azarah 1.24 esac
154 azarah 1.4 done
155 azarah 1.1
156 vapier 1.90 [[ ${do_uclibc} == "yes" ]] && elt_patches+=" uclibc-conf uclibc-ltconf"
157 azarah 1.56
158 vapier 1.90 case ${CHOST} in
159     *-aix*) elt_patches+=" hardcode aixrtl aix-noundef" ;; #213277
160     *-darwin*) elt_patches+=" darwin-ltconf darwin-ltmain darwin-conf" ;;
161     *-freebsd*) elt_patches+=" fbsd-conf fbsd-ltconf" ;;
162     *-hpux*) elt_patches+=" hpux-conf deplibs hc-flag-ld hardcode hardcode-relink relink-prog no-lc" ;;
163     *-irix*) elt_patches+=" irix-ltmain" ;;
164     *-mint*) elt_patches+=" mint-conf" ;;
165 grobian 1.84 esac
166 usata 1.36
167 flameeyes 1.91 if $(tc-getLD) --version 2>&1 | grep -qs 'GNU gold'; then
168     elt_patches+=" gold-conf"
169     fi
170    
171 vapier 1.90 # Reuse "$@" for dirs to patch
172     set --
173     if [[ ${do_shallow} == "yes" ]] ; then
174     [[ -f ${S}/ltmain.sh ]] && set -- "${S}"
175     else
176     set -- $(find "${S}" -name ltmain.sh -printf '%h ')
177     fi
178    
179     local d p
180     for d in "$@" ; do
181 azarah 1.24 export ELT_APPLIED_PATCHES=
182 mr_bones_ 1.27
183 vapier 1.90 [[ -f ${d}/.elibtoolized ]] && continue
184 azarah 1.52
185 vapier 1.90 einfo "Running elibtoolize in: ${d#${WORKDIR}/}/"
186 azarah 1.2
187 vapier 1.90 for p in ${elt_patches} ; do
188 azarah 1.24 local ret=0
189    
190 vapier 1.90 case ${p} in
191     portage)
192 azarah 1.64 # Stupid test to see if its already applied ...
193 vapier 1.90 if ! grep -qs 'We do not want portage' "${d}/ltmain.sh" ; then
194     ELT_walk_patches "${d}/ltmain.sh" "${p}"
195 azarah 1.64 ret=$?
196     fi
197     ;;
198 vapier 1.90 rem-int-dep)
199     ELT_walk_patches "${d}/ltmain.sh" "${p}" "${deptoremove}"
200 azarah 1.24 ret=$?
201     ;;
202 vapier 1.90 fix-relink)
203 azarah 1.24 # Do not apply if we do not have the relink patch applied ...
204 vapier 1.90 if grep -qs 'inst_prefix_dir' "${d}/ltmain.sh" ; then
205     ELT_walk_patches "${d}/ltmain.sh" "${p}"
206 azarah 1.24 ret=$?
207     fi
208     ;;
209 vapier 1.90 max_cmd_len)
210 azarah 1.25 # Do not apply if $max_cmd_len is not used ...
211 vapier 1.90 if grep -qs 'max_cmd_len' "${d}/ltmain.sh" ; then
212     ELT_walk_patches "${d}/ltmain.sh" "${p}"
213 azarah 1.25 ret=$?
214     fi
215     ;;
216 vapier 1.90 as-needed)
217     ELT_walk_patches "${d}/ltmain.sh" "${p}"
218 loki_val 1.83 ret=$?
219     ;;
220 vapier 1.90 uclibc-conf)
221     if grep -qs 'Transform linux' "${d}/configure" ; then
222     ELT_walk_patches "${d}/configure" "${p}"
223 azarah 1.53 ret=$?
224     # ltmain.sh and co might be in a subdirectory ...
225 vapier 1.90 elif [[ ! -e ${d}/configure ]] && \
226 flameeyes 1.91 grep -qs 'Transform linux' "${d}/../configure" ; then
227 vapier 1.90 ELT_walk_patches "${d}/../configure" "${p}"
228 azarah 1.53 ret=$?
229     fi
230     ;;
231 vapier 1.90 uclibc-ltconf)
232 azarah 1.60 # Newer libtoolize clears ltconfig, as not used anymore
233 vapier 1.90 if [[ -s ${d}/ltconfig ]] ; then
234     ELT_walk_patches "${d}/ltconfig" "${p}"
235 azarah 1.53 ret=$?
236     fi
237     ;;
238 vapier 1.90 fbsd-conf)
239     if grep -qs 'version_type=freebsd-' "${d}/configure" ; then
240     ELT_walk_patches "${d}/configure" "${p}"
241 flameeyes 1.55 ret=$?
242     # ltmain.sh and co might be in a subdirectory ...
243 vapier 1.90 elif [[ ! -e ${d}/configure ]] && \
244 flameeyes 1.91 grep -qs 'version_type=freebsd-' "${d}/../configure" ; then
245 vapier 1.90 ELT_walk_patches "${d}/../configure" "${p}"
246 flameeyes 1.55 ret=$?
247     fi
248     ;;
249 vapier 1.90 fbsd-ltconf)
250     if [[ -s ${d}/ltconfig ]] ; then
251     ELT_walk_patches "${d}/ltconfig" "${p}"
252 flameeyes 1.68 ret=$?
253     fi
254     ;;
255 vapier 1.90 darwin-conf)
256     if grep -qs '&& echo \.so ||' "${d}/configure" ; then
257     ELT_walk_patches "${d}/configure" "${p}"
258 grobian 1.84 ret=$?
259     # ltmain.sh and co might be in a subdirectory ...
260 vapier 1.90 elif [[ ! -e ${d}/configure ]] && \
261 flameeyes 1.91 grep -qs '&& echo \.so ||' "${d}/../configure" ; then
262 vapier 1.90 ELT_walk_patches "${d}/../configure" "${p}"
263 grobian 1.84 ret=$?
264     fi
265     ;;
266 vapier 1.90 darwin-ltconf)
267 azarah 1.60 # Newer libtoolize clears ltconfig, as not used anymore
268 vapier 1.90 if [[ -s ${d}/ltconfig ]] ; then
269     ELT_walk_patches "${d}/ltconfig" "${p}"
270 azarah 1.60 ret=$?
271     fi
272     ;;
273 vapier 1.90 darwin-ltmain)
274 grobian 1.84 # special case to avoid false positives (failing to apply
275     # ltmain.sh path message), newer libtools have this patch
276     # built in, so not much to patch around then
277 vapier 1.90 if [[ -e ${d}/ltmain.sh ]] && \
278     ! grep -qs 'verstring="-compatibility_version' "${d}/ltmain.sh" ; then
279     ELT_walk_patches "${d}/ltmain.sh" "${p}"
280 grobian 1.84 ret=$?
281     fi
282     ;;
283 vapier 1.90 aixrtl|hpux-conf)
284 haubi 1.85 ret=1
285     local subret=0
286     # apply multiple patches as often as they match
287     while [[ $subret -eq 0 ]]; do
288     subret=1
289 vapier 1.90 if [[ -e ${d}/configure ]]; then
290     ELT_walk_patches "${d}/configure" "${p}"
291 haubi 1.85 subret=$?
292     # ltmain.sh and co might be in a subdirectory ...
293 vapier 1.90 elif [[ ! -e ${d}/configure && -e ${d}/../configure ]] ; then
294     ELT_walk_patches "${d}/../configure" "${p}"
295 haubi 1.85 subret=$?
296     fi
297     if [[ $subret -eq 0 ]]; then
298     # have at least one patch succeeded.
299     ret=0
300     fi
301     done
302     ;;
303 flameeyes 1.91 mint-conf|gold-conf)
304 grobian 1.84 ret=1
305     local subret=1
306 vapier 1.90 if [[ -e ${d}/configure ]]; then
307     ELT_walk_patches "${d}/configure" "${p}"
308 grobian 1.84 subret=$?
309     # ltmain.sh and co might be in a subdirectory ...
310 flameeyes 1.91 elif [[ -e ${d}/../configure ]] ; then
311 vapier 1.90 ELT_walk_patches "${d}/../configure" "${p}"
312 grobian 1.84 subret=$?
313 flameeyes 1.91 elif [[ -e ${d}/../../configure ]] ; then
314     ELT_walk_patches "${d}/../../configure" "${p}"
315     subret=$?
316 grobian 1.84 fi
317     if [[ $subret -eq 0 ]]; then
318     # have at least one patch succeeded.
319     ret=0
320     fi
321     ;;
322 vapier 1.90 install-sh)
323     ELT_walk_patches "${d}/install-sh" "${p}"
324 uberlord 1.78 ret=$?
325     ;;
326 vapier 1.90 cross)
327 vapier 1.82 if tc-is-cross-compiler ; then
328 vapier 1.90 ELT_walk_patches "${d}/ltmain.sh" "${p}"
329 vapier 1.82 ret=$?
330     fi
331     ;;
332 azarah 1.24 *)
333 vapier 1.90 ELT_walk_patches "${d}/ltmain.sh" "${p}"
334 azarah 1.24 ret=$?
335     ;;
336     esac
337 mr_bones_ 1.27
338 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
339 vapier 1.90 case ${p} in
340     relink)
341     local version=$(ELT_libtool_version "${d}/ltmain.sh")
342 azarah 1.24 # Critical patch, but could be applied ...
343 azarah 1.59 # FIXME: Still need a patch for ltmain.sh > 1.4.0
344 vapier 1.90 if ! grep -qs 'inst_prefix_dir' "${d}/ltmain.sh" && \
345     [[ $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
346 azarah 1.24 ewarn " Could not apply relink.patch!"
347     fi
348     ;;
349 vapier 1.90 portage)
350 azarah 1.24 # Critical patch - for this one we abort, as it can really
351     # cause breakage without it applied!
352 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
353 azarah 1.24 # Stupid test to see if its already applied ...
354 vapier 1.90 if ! grep -qs 'We do not want portage' "${d}/ltmain.sh" ; then
355 azarah 1.24 echo
356     eerror "Portage patch requested, but failed to apply!"
357 vapier 1.88 eerror "Please file a bug report to add a proper patch."
358 azarah 1.24 die "Portage patch requested, but failed to apply!"
359     fi
360     else
361 vapier 1.90 if grep -qs 'We do not want portage' "${d}/ltmain.sh" ; then
362 azarah 1.51 # ewarn " Portage patch seems to be already applied."
363     # ewarn " Please verify that it is not needed."
364     :
365 azarah 1.45 else
366 flameeyes 1.91 local version=$(ELT_libtool_version "${d}"/ltmain.sh)
367 azarah 1.45 echo
368 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
369 vapier 1.88 eerror "Please file a bug report to add a proper patch."
370 azarah 1.45 die "Portage patch failed to apply!"
371     fi
372     # We do not want to run libtoolize ...
373     ELT_APPLIED_PATCHES="portage"
374 azarah 1.3 fi
375     ;;
376 vapier 1.90 uclibc-*)
377     [[ ${CHOST} == *-uclibc ]] && ewarn " uClibc patch set '${p}' failed to apply!"
378 azarah 1.53 ;;
379 vapier 1.90 fbsd-*)
380     if [[ ${CHOST} == *-freebsd* ]] ; then
381 flameeyes 1.65 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
382 vapier 1.90 "${d}/configure" "${d}/../configure" 2>/dev/null) ]]; then
383     eerror " FreeBSD patch set '${p}' failed to apply!"
384     die "FreeBSD patch set '${p}' failed to apply!"
385 flameeyes 1.61 fi
386 azarah 1.60 fi
387     ;;
388 vapier 1.90 darwin-*)
389     [[ ${CHOST} == *"-darwin"* ]] && ewarn " Darwin patch set '${p}' failed to apply!"
390 flameeyes 1.55 ;;
391 azarah 1.3 esac
392 azarah 1.1 fi
393 azarah 1.52 done
394 azarah 1.11
395 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
396     if [[ ${do_portage} == "no" && \
397     ${do_reversedeps} == "no" && \
398     ${do_only_patches} == "no" && \
399     ${deptoremove} == "" ]]
400     then
401     ewarn "Cannot apply any patches, please file a bug about this"
402 vapier 1.75 die
403 azarah 1.1 fi
404 azarah 1.52 fi
405    
406 vapier 1.90 rm -f "${d}/libtool"
407 azarah 1.52
408 vapier 1.90 > "${d}/.elibtoolized"
409 azarah 1.1 done
410 vapier 1.30 }
411    
412 vapier 1.90 uclibctoolize() { die "Use elibtoolize"; }
413     darwintoolize() { die "Use elibtoolize"; }
414 azarah 1.44
415     # char *VER_major(string)
416     #
417     # Return the Major (X of X.Y.Z) version
418     #
419     VER_major() {
420     [[ -z $1 ]] && return 1
421    
422     local VER=$@
423 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
424 azarah 1.44 }
425    
426     # char *VER_minor(string)
427     #
428     # Return the Minor (Y of X.Y.Z) version
429     #
430     VER_minor() {
431     [[ -z $1 ]] && return 1
432    
433     local VER=$@
434     VER=${VER#*.}
435 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
436 azarah 1.44 }
437    
438     # char *VER_micro(string)
439     #
440     # Return the Micro (Z of X.Y.Z) version.
441     #
442     VER_micro() {
443     [[ -z $1 ]] && return 1
444    
445     local VER=$@
446     VER=${VER#*.*.}
447 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
448 azarah 1.44 }
449    
450     # int VER_to_int(string)
451     #
452     # Convert a string type version (2.4.0) to an int (132096)
453     # for easy compairing or versions ...
454     #
455     VER_to_int() {
456     [[ -z $1 ]] && return 1
457    
458     local VER_MAJOR=$(VER_major "$1")
459     local VER_MINOR=$(VER_minor "$1")
460     local VER_MICRO=$(VER_micro "$1")
461     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
462    
463     # We make version 1.0.0 the minimum version we will handle as
464     # a sanity check ... if its less, we fail ...
465     if [[ ${VER_int} -ge 65536 ]] ; then
466     echo "${VER_int}"
467     return 0
468     fi
469    
470     echo 1
471     return 1
472     }

  ViewVC Help
Powered by ViewVC 1.1.20