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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.84 - (hide annotations) (download)
Wed Jan 27 20:41:27 2010 UTC (4 years, 10 months ago) by grobian
Branch: MAIN
Changes since 1.83: +59 -6 lines
Activate Prefix ELT-patches when and where necessary, acked by base-system, bug #301190

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

  ViewVC Help
Powered by ViewVC 1.1.20