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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.89 - (show annotations) (download)
Thu May 20 08:22:15 2010 UTC (4 years, 6 months ago) by haubi
Branch: MAIN
Changes since 1.88: +3 -3 lines
Change ELT-patches for AIX to use import files as soname-emulator (bug#213277).
This requires switching libtool to force -no-undefined behaviour on AIX.
Additionally, get_libname() now does return .so and versions like Linux.

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

  ViewVC Help
Powered by ViewVC 1.1.20