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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.91 - (hide annotations) (download)
Thu Jun 9 15:53:04 2011 UTC (3 years, 2 months ago) by flameeyes
Branch: MAIN
Changes since 1.90: +21 -9 lines
Add a gold-specific patch when gold is used as linker, as only libtool 2.2.7 and later actually report it properly. Check two parents directories for configure as sometimes it would otherwise fail (libarchive), and make the debug log a bit more useful by appending rather than replacing and adding the name of the patch/file it gets tested on.

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

  ViewVC Help
Powered by ViewVC 1.1.20