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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.83 - (hide annotations) (download)
Sun May 3 20:03:10 2009 UTC (5 years, 4 months ago) by loki_val
Branch: MAIN
Changes since 1.82: +6 -2 lines
Import patch from Debian http://bugs.debian.org/347650 which hacks around libtool deplib re-ordering, which inhibits -Wl,--as-needed. You have to set -Wl,--as-needed seperately in LDFLAGS for this to do any good, -Wl,--as-needed,--something-else will not do, but you can set -Wl,--something-else afterwards. Also make sure eclasses I 'own' run elibtoolize so they can reap the benefit.

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 loki_val 1.83 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.82 2009/03/14 13:02:08 vapier 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     [[ ${CHOST} == *"-freebsd"* ]] && \
178 flameeyes 1.68 elt_patches="${elt_patches} fbsd-conf fbsd-ltconf"
179 azarah 1.56
180 grobian 1.74 [[ ${CHOST} == *"-darwin"* ]] && \
181     elt_patches="${elt_patches} darwin-ltconf darwin-ltmain"
182 usata 1.36
183 vapier 1.42 for x in ${my_dirlist} ; do
184 azarah 1.51 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
185 azarah 1.24 export ELT_APPLIED_PATCHES=
186 azarah 1.53 export ELT_LTMAIN_SH="${x}/ltmain.sh"
187 mr_bones_ 1.27
188 azarah 1.52 [[ -f ${x}/.elibtoolized ]] && continue
189    
190 azarah 1.1 cd ${x}
191 azarah 1.51 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
192 azarah 1.2
193 vapier 1.42 for y in ${elt_patches} ; do
194 azarah 1.24 local ret=0
195    
196     case "${y}" in
197 azarah 1.64 "portage")
198     # Stupid test to see if its already applied ...
199     if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
200     ELT_walk_patches "${x}/ltmain.sh" "${y}"
201     ret=$?
202     fi
203     ;;
204 azarah 1.24 "rem-int-dep")
205     ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
206     ret=$?
207     ;;
208     "fix-relink")
209     # Do not apply if we do not have the relink patch applied ...
210 vapier 1.42 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
211 azarah 1.24 ELT_walk_patches "${x}/ltmain.sh" "${y}"
212     ret=$?
213     fi
214     ;;
215 azarah 1.25 "max_cmd_len")
216     # Do not apply if $max_cmd_len is not used ...
217 vapier 1.42 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
218 azarah 1.25 ELT_walk_patches "${x}/ltmain.sh" "${y}"
219     ret=$?
220     fi
221     ;;
222 loki_val 1.83 "as-needed")
223     ELT_walk_patches "${x}/ltmain.sh" "${y}"
224     ret=$?
225     ;;
226 azarah 1.53 "uclibc-conf")
227 azarah 1.58 if [[ -e ${x}/configure && \
228     -n $(grep 'Transform linux' "${x}/configure") ]] ; then
229 azarah 1.53 ELT_walk_patches "${x}/configure" "${y}"
230     ret=$?
231     # ltmain.sh and co might be in a subdirectory ...
232 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
233     -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
234 azarah 1.53 ELT_walk_patches "${x}/../configure" "${y}"
235     ret=$?
236     fi
237     ;;
238     "uclibc-ltconf")
239 azarah 1.60 # Newer libtoolize clears ltconfig, as not used anymore
240     if [[ -s ${x}/ltconfig ]] ; then
241 azarah 1.53 ELT_walk_patches "${x}/ltconfig" "${y}"
242     ret=$?
243     fi
244     ;;
245 flameeyes 1.55 "fbsd-conf")
246 azarah 1.58 if [[ -e ${x}/configure && \
247     -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
248 flameeyes 1.55 ELT_walk_patches "${x}/configure" "${y}"
249     ret=$?
250     # ltmain.sh and co might be in a subdirectory ...
251 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
252     -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
253 flameeyes 1.55 ELT_walk_patches "${x}/../configure" "${y}"
254     ret=$?
255     fi
256     ;;
257 flameeyes 1.68 "fbsd-ltconf")
258     if [[ -s ${x}/ltconfig ]] ; then
259     ELT_walk_patches "${x}/ltconfig" "${y}"
260     ret=$?
261     fi
262     ;;
263 azarah 1.60 "darwin-ltconf")
264     # Newer libtoolize clears ltconfig, as not used anymore
265     if [[ -s ${x}/ltconfig ]] ; then
266     ELT_walk_patches "${x}/ltconfig" "${y}"
267     ret=$?
268     fi
269     ;;
270 uberlord 1.78 "install-sh")
271     ELT_walk_patches "${x}/install-sh" "${y}"
272     ret=$?
273     ;;
274 vapier 1.82 "cross")
275     if tc-is-cross-compiler ; then
276     ELT_walk_patches "${x}/ltmain.sh" "${y}"
277     ret=$?
278     fi
279     ;;
280 azarah 1.24 *)
281     ELT_walk_patches "${x}/ltmain.sh" "${y}"
282     ret=$?
283     ;;
284     esac
285 mr_bones_ 1.27
286 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
287 azarah 1.3 case ${y} in
288 azarah 1.24 "relink")
289 azarah 1.59 local version=$(ELT_libtool_version "${x}/ltmain.sh")
290 azarah 1.24 # Critical patch, but could be applied ...
291 azarah 1.59 # FIXME: Still need a patch for ltmain.sh > 1.4.0
292     if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
293     $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
294 azarah 1.24 ewarn " Could not apply relink.patch!"
295     fi
296     ;;
297     "portage")
298     # Critical patch - for this one we abort, as it can really
299     # cause breakage without it applied!
300 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
301 azarah 1.24 # Stupid test to see if its already applied ...
302 vapier 1.42 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
303 azarah 1.24 echo
304     eerror "Portage patch requested, but failed to apply!"
305 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
306 azarah 1.24 die "Portage patch requested, but failed to apply!"
307     fi
308     else
309 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
310 azarah 1.51 # ewarn " Portage patch seems to be already applied."
311     # ewarn " Please verify that it is not needed."
312     :
313 azarah 1.45 else
314 azarah 1.46 local version=$( \
315     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
316     echo "${VERSION}")
317    
318 azarah 1.45 echo
319 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
320 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
321 azarah 1.45 die "Portage patch failed to apply!"
322     fi
323     # We do not want to run libtoolize ...
324     ELT_APPLIED_PATCHES="portage"
325 azarah 1.3 fi
326     ;;
327 azarah 1.53 "uclibc-"*)
328     [[ ${CHOST} == *"-uclibc" ]] && \
329     ewarn " uClibc patch set '${y}' failed to apply!"
330     ;;
331 flameeyes 1.55 "fbsd-"*)
332 azarah 1.60 if [[ ${CHOST} == *"-freebsd"* ]] ; then
333 flameeyes 1.65 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
334     "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
335 flameeyes 1.61 eerror " FreeBSD patch set '${y}' failed to apply!"
336     die "FreeBSD patch set '${y}' failed to apply!"
337     fi
338 azarah 1.60 fi
339     ;;
340     "darwin-"*)
341 grobian 1.74 [[ ${CHOST} == *"-darwin"* ]] && \
342 azarah 1.60 ewarn " Darwin patch set '${y}' failed to apply!"
343 flameeyes 1.55 ;;
344 azarah 1.3 esac
345 azarah 1.1 fi
346 azarah 1.52 done
347 azarah 1.11
348 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
349     if [[ ${do_portage} == "no" && \
350     ${do_reversedeps} == "no" && \
351     ${do_only_patches} == "no" && \
352     ${deptoremove} == "" ]]
353     then
354     ewarn "Cannot apply any patches, please file a bug about this"
355 vapier 1.75 die
356 azarah 1.1 fi
357 azarah 1.52 fi
358    
359     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
360    
361 drac 1.81 >> "${x}/.elibtoolized"
362 azarah 1.1 done
363 azarah 1.6
364 vapier 1.29 cd "${start_dir}"
365 vapier 1.30 }
366    
367     uclibctoolize() {
368 cardoe 1.76 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
369 azarah 1.53 elibtoolize
370 azarah 1.1 }
371 usata 1.36
372     darwintoolize() {
373 cardoe 1.76 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
374 azarah 1.60 elibtoolize
375 usata 1.36 }
376 azarah 1.44
377     # char *VER_major(string)
378     #
379     # Return the Major (X of X.Y.Z) version
380     #
381     VER_major() {
382     [[ -z $1 ]] && return 1
383    
384     local VER=$@
385 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
386 azarah 1.44 }
387    
388     # char *VER_minor(string)
389     #
390     # Return the Minor (Y of X.Y.Z) version
391     #
392     VER_minor() {
393     [[ -z $1 ]] && return 1
394    
395     local VER=$@
396     VER=${VER#*.}
397 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
398 azarah 1.44 }
399    
400     # char *VER_micro(string)
401     #
402     # Return the Micro (Z of X.Y.Z) version.
403     #
404     VER_micro() {
405     [[ -z $1 ]] && return 1
406    
407     local VER=$@
408     VER=${VER#*.*.}
409 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
410 azarah 1.44 }
411    
412     # int VER_to_int(string)
413     #
414     # Convert a string type version (2.4.0) to an int (132096)
415     # for easy compairing or versions ...
416     #
417     VER_to_int() {
418     [[ -z $1 ]] && return 1
419    
420     local VER_MAJOR=$(VER_major "$1")
421     local VER_MINOR=$(VER_minor "$1")
422     local VER_MICRO=$(VER_micro "$1")
423     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
424    
425     # We make version 1.0.0 the minimum version we will handle as
426     # a sanity check ... if its less, we fail ...
427     if [[ ${VER_int} -ge 65536 ]] ; then
428     echo "${VER_int}"
429     return 0
430     fi
431    
432     echo 1
433     return 1
434     }

  ViewVC Help
Powered by ViewVC 1.1.20