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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.91 - (show annotations) (download)
Thu Jun 9 15:53:04 2011 UTC (3 years, 3 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 # Copyright 1999-2010 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.90 2010/08/22 22:44:45 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 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
31 (
32 echo ""
33 echo "Trying $(basename "$(dirname "${patch}")")-${patch##*/}.patch on ${file}"
34 ) &>> "${T}/elibtool.log"
35
36 # We only support patchlevel of 0 - why worry if its static patches?
37 if patch -p0 --dry-run "${file}" "${patch}" &>> "${T}/elibtool.log" ; then
38 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
39 patch -p0 -g0 --no-backup-if-mismatch "${file}" "${patch}" \
40 &>> "${T}/elibtool.log"
41 ret=$?
42 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
43 else
44 ret=1
45 fi
46
47 return "${ret}"
48 }
49
50 #
51 # Get string version of ltmain.sh or ltconfig (passed as $1)
52 #
53 ELT_libtool_version() {
54 (
55 unset VERSION
56 eval $(grep -e '^[[:space:]]*VERSION=' "$1")
57 echo "${VERSION:-0}"
58 )
59 }
60
61 #
62 # Run through the patches in $2 and see if any
63 # apply to $1 ...
64 #
65 ELT_walk_patches() {
66 local patch
67 local ret=1
68 local file=$1
69 local patch_set=$2
70 local patch_dir="${ELT_PATCH_DIR}/${patch_set}"
71 local rem_int_dep=$3
72
73 [[ -z ${patch_set} ]] && return 1
74 [[ ! -d ${patch_dir} ]] && return 1
75
76 pushd "${ELT_PATCH_DIR}" >/dev/null
77
78 # 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
89 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
96 popd >/dev/null
97 return ${ret}
98 }
99
100 # @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 elibtoolize() {
111 local x
112 local do_portage="no"
113 local do_reversedeps="no"
114 local do_only_patches="no"
115 local do_uclibc="yes"
116 local deptoremove=
117 local do_shallow="no"
118 local elt_patches="install-sh ltmain portage relink max_cmd_len sed test tmp cross as-needed"
119
120 for x in "$@" ; do
121 case ${x} in
122 --portage)
123 # Only apply portage patch, and don't
124 # 'libtoolize --copy --force' if all patches fail.
125 do_portage="yes"
126 ;;
127 --reverse-deps)
128 # Apply the reverse-deps patch
129 # http://bugzilla.gnome.org/show_bug.cgi?id=75635
130 do_reversedeps="yes"
131 elt_patches+=" fix-relink"
132 ;;
133 --patch-only)
134 # Do not run libtoolize if none of the patches apply ..
135 do_only_patches="yes"
136 ;;
137 --remove-internal-dep=*)
138 # We will replace @REM_INT_DEP@ with what is needed
139 # in ELT_walk_patches() ...
140 deptoremove=${x#--remove-internal-dep=}
141
142 # Add the patch for this ...
143 [[ -n ${deptoremove} ]] && elt_patches+=" rem-int-dep"
144 ;;
145 --shallow)
146 # Only patch the ltmain.sh in ${S}
147 do_shallow="yes"
148 ;;
149 --no-uclibc)
150 do_uclibc="no"
151 ;;
152 *)
153 eerror "Invalid elibtoolize option: ${x}"
154 die "elibtoolize called with ${x} ??"
155 esac
156 done
157
158 [[ ${do_uclibc} == "yes" ]] && elt_patches+=" uclibc-conf uclibc-ltconf"
159
160 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 esac
168
169 if $(tc-getLD) --version 2>&1 | grep -qs 'GNU gold'; then
170 elt_patches+=" gold-conf"
171 fi
172
173 # 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 export ELT_APPLIED_PATCHES=
184
185 [[ -f ${d}/.elibtoolized ]] && continue
186
187 einfo "Running elibtoolize in: ${d#${WORKDIR}/}/"
188
189 for p in ${elt_patches} ; do
190 local ret=0
191
192 case ${p} in
193 portage)
194 # Stupid test to see if its already applied ...
195 if ! grep -qs 'We do not want portage' "${d}/ltmain.sh" ; then
196 ELT_walk_patches "${d}/ltmain.sh" "${p}"
197 ret=$?
198 fi
199 ;;
200 rem-int-dep)
201 ELT_walk_patches "${d}/ltmain.sh" "${p}" "${deptoremove}"
202 ret=$?
203 ;;
204 fix-relink)
205 # Do not apply if we do not have the relink patch applied ...
206 if grep -qs 'inst_prefix_dir' "${d}/ltmain.sh" ; then
207 ELT_walk_patches "${d}/ltmain.sh" "${p}"
208 ret=$?
209 fi
210 ;;
211 max_cmd_len)
212 # Do not apply if $max_cmd_len is not used ...
213 if grep -qs 'max_cmd_len' "${d}/ltmain.sh" ; then
214 ELT_walk_patches "${d}/ltmain.sh" "${p}"
215 ret=$?
216 fi
217 ;;
218 as-needed)
219 ELT_walk_patches "${d}/ltmain.sh" "${p}"
220 ret=$?
221 ;;
222 uclibc-conf)
223 if grep -qs 'Transform linux' "${d}/configure" ; then
224 ELT_walk_patches "${d}/configure" "${p}"
225 ret=$?
226 # ltmain.sh and co might be in a subdirectory ...
227 elif [[ ! -e ${d}/configure ]] && \
228 grep -qs 'Transform linux' "${d}/../configure" ; then
229 ELT_walk_patches "${d}/../configure" "${p}"
230 ret=$?
231 fi
232 ;;
233 uclibc-ltconf)
234 # Newer libtoolize clears ltconfig, as not used anymore
235 if [[ -s ${d}/ltconfig ]] ; then
236 ELT_walk_patches "${d}/ltconfig" "${p}"
237 ret=$?
238 fi
239 ;;
240 fbsd-conf)
241 if grep -qs 'version_type=freebsd-' "${d}/configure" ; then
242 ELT_walk_patches "${d}/configure" "${p}"
243 ret=$?
244 # ltmain.sh and co might be in a subdirectory ...
245 elif [[ ! -e ${d}/configure ]] && \
246 grep -qs 'version_type=freebsd-' "${d}/../configure" ; then
247 ELT_walk_patches "${d}/../configure" "${p}"
248 ret=$?
249 fi
250 ;;
251 fbsd-ltconf)
252 if [[ -s ${d}/ltconfig ]] ; then
253 ELT_walk_patches "${d}/ltconfig" "${p}"
254 ret=$?
255 fi
256 ;;
257 darwin-conf)
258 if grep -qs '&& echo \.so ||' "${d}/configure" ; then
259 ELT_walk_patches "${d}/configure" "${p}"
260 ret=$?
261 # ltmain.sh and co might be in a subdirectory ...
262 elif [[ ! -e ${d}/configure ]] && \
263 grep -qs '&& echo \.so ||' "${d}/../configure" ; then
264 ELT_walk_patches "${d}/../configure" "${p}"
265 ret=$?
266 fi
267 ;;
268 darwin-ltconf)
269 # Newer libtoolize clears ltconfig, as not used anymore
270 if [[ -s ${d}/ltconfig ]] ; then
271 ELT_walk_patches "${d}/ltconfig" "${p}"
272 ret=$?
273 fi
274 ;;
275 darwin-ltmain)
276 # 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 if [[ -e ${d}/ltmain.sh ]] && \
280 ! grep -qs 'verstring="-compatibility_version' "${d}/ltmain.sh" ; then
281 ELT_walk_patches "${d}/ltmain.sh" "${p}"
282 ret=$?
283 fi
284 ;;
285 aixrtl|hpux-conf)
286 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 if [[ -e ${d}/configure ]]; then
292 ELT_walk_patches "${d}/configure" "${p}"
293 subret=$?
294 # ltmain.sh and co might be in a subdirectory ...
295 elif [[ ! -e ${d}/configure && -e ${d}/../configure ]] ; then
296 ELT_walk_patches "${d}/../configure" "${p}"
297 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 mint-conf|gold-conf)
306 ret=1
307 local subret=1
308 if [[ -e ${d}/configure ]]; then
309 ELT_walk_patches "${d}/configure" "${p}"
310 subret=$?
311 # ltmain.sh and co might be in a subdirectory ...
312 elif [[ -e ${d}/../configure ]] ; then
313 ELT_walk_patches "${d}/../configure" "${p}"
314 subret=$?
315 elif [[ -e ${d}/../../configure ]] ; then
316 ELT_walk_patches "${d}/../../configure" "${p}"
317 subret=$?
318 fi
319 if [[ $subret -eq 0 ]]; then
320 # have at least one patch succeeded.
321 ret=0
322 fi
323 ;;
324 install-sh)
325 ELT_walk_patches "${d}/install-sh" "${p}"
326 ret=$?
327 ;;
328 cross)
329 if tc-is-cross-compiler ; then
330 ELT_walk_patches "${d}/ltmain.sh" "${p}"
331 ret=$?
332 fi
333 ;;
334 *)
335 ELT_walk_patches "${d}/ltmain.sh" "${p}"
336 ret=$?
337 ;;
338 esac
339
340 if [[ ${ret} -ne 0 ]] ; then
341 case ${p} in
342 relink)
343 local version=$(ELT_libtool_version "${d}/ltmain.sh")
344 # Critical patch, but could be applied ...
345 # FIXME: Still need a patch for ltmain.sh > 1.4.0
346 if ! grep -qs 'inst_prefix_dir' "${d}/ltmain.sh" && \
347 [[ $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
348 ewarn " Could not apply relink.patch!"
349 fi
350 ;;
351 portage)
352 # Critical patch - for this one we abort, as it can really
353 # cause breakage without it applied!
354 if [[ ${do_portage} == "yes" ]] ; then
355 # Stupid test to see if its already applied ...
356 if ! grep -qs 'We do not want portage' "${d}/ltmain.sh" ; then
357 echo
358 eerror "Portage patch requested, but failed to apply!"
359 eerror "Please file a bug report to add a proper patch."
360 die "Portage patch requested, but failed to apply!"
361 fi
362 else
363 if grep -qs 'We do not want portage' "${d}/ltmain.sh" ; then
364 # ewarn " Portage patch seems to be already applied."
365 # ewarn " Please verify that it is not needed."
366 :
367 else
368 local version=$(ELT_libtool_version "${d}"/ltmain.sh)
369 echo
370 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
371 eerror "Please file a bug report to add a proper patch."
372 die "Portage patch failed to apply!"
373 fi
374 # We do not want to run libtoolize ...
375 ELT_APPLIED_PATCHES="portage"
376 fi
377 ;;
378 uclibc-*)
379 [[ ${CHOST} == *-uclibc ]] && ewarn " uClibc patch set '${p}' failed to apply!"
380 ;;
381 fbsd-*)
382 if [[ ${CHOST} == *-freebsd* ]] ; then
383 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
384 "${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 fi
388 fi
389 ;;
390 darwin-*)
391 [[ ${CHOST} == *"-darwin"* ]] && ewarn " Darwin patch set '${p}' failed to apply!"
392 ;;
393 esac
394 fi
395 done
396
397 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 die
405 fi
406 fi
407
408 rm -f "${d}/libtool"
409
410 > "${d}/.elibtoolized"
411 done
412 }
413
414 uclibctoolize() { die "Use elibtoolize"; }
415 darwintoolize() { die "Use elibtoolize"; }
416
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 echo "${VER%%[^[:digit:]]*}"
426 }
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 echo "${VER%%[^[:digit:]]*}"
438 }
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 echo "${VER%%[^[:digit:]]*}"
450 }
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