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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.85 - (hide annotations) (download)
Fri Mar 12 08:17:40 2010 UTC (4 years, 5 months ago) by haubi
Branch: MAIN
Changes since 1.84: +22 -2 lines
aixrtl and hpux-conf _need_ to apply in a loop, mint-conf does not,
(loop dropped in http://overlays.gentoo.org/proj/alt/changeset/55797)

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 haubi 1.85 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.84 2010/01/27 20:41:27 grobian 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 haubi 1.85 "aixrtl" | "hpux-conf")
308     ret=1
309     local subret=0
310     # apply multiple patches as often as they match
311     while [[ $subret -eq 0 ]]; do
312     subret=1
313     if [[ -e ${x}/configure ]]; then
314     ELT_walk_patches "${x}/configure" "${y}"
315     subret=$?
316     # ltmain.sh and co might be in a subdirectory ...
317     elif [[ ! -e ${x}/configure && -e ${x}/../configure ]] ; then
318     ELT_walk_patches "${x}/../configure" "${y}"
319     subret=$?
320     fi
321     if [[ $subret -eq 0 ]]; then
322     # have at least one patch succeeded.
323     ret=0
324     fi
325     done
326     ;;
327     "mint-conf")
328 grobian 1.84 ret=1
329     local subret=1
330     if [[ -e ${x}/configure ]]; then
331     ELT_walk_patches "${x}/configure" "${y}"
332     subret=$?
333     # ltmain.sh and co might be in a subdirectory ...
334     elif [[ ! -e ${x}/configure && -e ${x}/../configure ]] ; then
335     ELT_walk_patches "${x}/../configure" "${y}"
336     subret=$?
337     fi
338     if [[ $subret -eq 0 ]]; then
339     # have at least one patch succeeded.
340     ret=0
341     fi
342     ;;
343 uberlord 1.78 "install-sh")
344     ELT_walk_patches "${x}/install-sh" "${y}"
345     ret=$?
346     ;;
347 vapier 1.82 "cross")
348     if tc-is-cross-compiler ; then
349     ELT_walk_patches "${x}/ltmain.sh" "${y}"
350     ret=$?
351     fi
352     ;;
353 azarah 1.24 *)
354     ELT_walk_patches "${x}/ltmain.sh" "${y}"
355     ret=$?
356     ;;
357     esac
358 mr_bones_ 1.27
359 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
360 azarah 1.3 case ${y} in
361 azarah 1.24 "relink")
362 azarah 1.59 local version=$(ELT_libtool_version "${x}/ltmain.sh")
363 azarah 1.24 # Critical patch, but could be applied ...
364 azarah 1.59 # FIXME: Still need a patch for ltmain.sh > 1.4.0
365     if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
366     $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
367 azarah 1.24 ewarn " Could not apply relink.patch!"
368     fi
369     ;;
370     "portage")
371     # Critical patch - for this one we abort, as it can really
372     # cause breakage without it applied!
373 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
374 azarah 1.24 # Stupid test to see if its already applied ...
375 vapier 1.42 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
376 azarah 1.24 echo
377     eerror "Portage patch requested, but failed to apply!"
378 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
379 azarah 1.24 die "Portage patch requested, but failed to apply!"
380     fi
381     else
382 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
383 azarah 1.51 # ewarn " Portage patch seems to be already applied."
384     # ewarn " Please verify that it is not needed."
385     :
386 azarah 1.45 else
387 azarah 1.46 local version=$( \
388     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
389     echo "${VERSION}")
390    
391 azarah 1.45 echo
392 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
393 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
394 azarah 1.45 die "Portage patch failed to apply!"
395     fi
396     # We do not want to run libtoolize ...
397     ELT_APPLIED_PATCHES="portage"
398 azarah 1.3 fi
399     ;;
400 azarah 1.53 "uclibc-"*)
401     [[ ${CHOST} == *"-uclibc" ]] && \
402     ewarn " uClibc patch set '${y}' failed to apply!"
403     ;;
404 flameeyes 1.55 "fbsd-"*)
405 azarah 1.60 if [[ ${CHOST} == *"-freebsd"* ]] ; then
406 flameeyes 1.65 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
407     "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
408 flameeyes 1.61 eerror " FreeBSD patch set '${y}' failed to apply!"
409     die "FreeBSD patch set '${y}' failed to apply!"
410     fi
411 azarah 1.60 fi
412     ;;
413     "darwin-"*)
414 grobian 1.74 [[ ${CHOST} == *"-darwin"* ]] && \
415 azarah 1.60 ewarn " Darwin patch set '${y}' failed to apply!"
416 flameeyes 1.55 ;;
417 azarah 1.3 esac
418 azarah 1.1 fi
419 azarah 1.52 done
420 azarah 1.11
421 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
422     if [[ ${do_portage} == "no" && \
423     ${do_reversedeps} == "no" && \
424     ${do_only_patches} == "no" && \
425     ${deptoremove} == "" ]]
426     then
427     ewarn "Cannot apply any patches, please file a bug about this"
428 vapier 1.75 die
429 azarah 1.1 fi
430 azarah 1.52 fi
431    
432     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
433    
434 drac 1.81 >> "${x}/.elibtoolized"
435 azarah 1.1 done
436 azarah 1.6
437 vapier 1.29 cd "${start_dir}"
438 vapier 1.30 }
439    
440     uclibctoolize() {
441 cardoe 1.76 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
442 azarah 1.53 elibtoolize
443 azarah 1.1 }
444 usata 1.36
445     darwintoolize() {
446 cardoe 1.76 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
447 azarah 1.60 elibtoolize
448 usata 1.36 }
449 azarah 1.44
450     # char *VER_major(string)
451     #
452     # Return the Major (X of X.Y.Z) version
453     #
454     VER_major() {
455     [[ -z $1 ]] && return 1
456    
457     local VER=$@
458 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
459 azarah 1.44 }
460    
461     # char *VER_minor(string)
462     #
463     # Return the Minor (Y of X.Y.Z) version
464     #
465     VER_minor() {
466     [[ -z $1 ]] && return 1
467    
468     local VER=$@
469     VER=${VER#*.}
470 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
471 azarah 1.44 }
472    
473     # char *VER_micro(string)
474     #
475     # Return the Micro (Z of X.Y.Z) version.
476     #
477     VER_micro() {
478     [[ -z $1 ]] && return 1
479    
480     local VER=$@
481     VER=${VER#*.*.}
482 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
483 azarah 1.44 }
484    
485     # int VER_to_int(string)
486     #
487     # Convert a string type version (2.4.0) to an int (132096)
488     # for easy compairing or versions ...
489     #
490     VER_to_int() {
491     [[ -z $1 ]] && return 1
492    
493     local VER_MAJOR=$(VER_major "$1")
494     local VER_MINOR=$(VER_minor "$1")
495     local VER_MICRO=$(VER_micro "$1")
496     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
497    
498     # We make version 1.0.0 the minimum version we will handle as
499     # a sanity check ... if its less, we fail ...
500     if [[ ${VER_int} -ge 65536 ]] ; then
501     echo "${VER_int}"
502     return 0
503     fi
504    
505     echo 1
506     return 1
507     }

  ViewVC Help
Powered by ViewVC 1.1.20