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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.95 - (show annotations) (download)
Mon Nov 14 17:08:49 2011 UTC (2 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.94: +12 -2 lines
add a --force flag to elibtoolize so that eautoreconf can make sure it runs even in face of poor interactions with earlier ebuilds/eclasses code #232820

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

  ViewVC Help
Powered by ViewVC 1.1.20