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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (download) (vendor branch)
Wed Nov 30 09:59:18 2005 UTC (8 years, 4 months ago) by chriswhite
Changes since 1.1: +405 -550 lines
*** empty log message ***

1 chriswhite 1.1.1.1 # Copyright 1999-2005 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.61 2005/10/09 13:01:41 flameeyes Exp $
4     #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@gentoo.org>
6 chriswhite 1.1.1.1 #
7 azarah 1.1 # This eclass patches ltmain.sh distributed with libtoolized packages with the
8 chriswhite 1.1.1.1 # relink and portage patch among others
9 azarah 1.1
10    
11 chriswhite 1.1.1.1 # 2004.09.25 rac
12     # i have verified that at least one package can use this eclass and
13     # build properly even without libtool installed yet, probably using
14     # the files in the distribution. eliminating this dependency fixes
15     # bug 65209, which is a showstopper for people doing installs using
16     # stageballs <3. if anybody decides to revert this, please attempt
17     # to find an alternate way of resolving that bug at the same time.
18 azarah 1.1
19 chriswhite 1.1.1.1 DESCRIPTION="Based on the ${ECLASS} eclass"
20 azarah 1.1
21 chriswhite 1.1.1.1 ELIBTOOL_VERSION="2.0.2"
22 azarah 1.1
23 chriswhite 1.1.1.1 ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
24     ELT_APPLIED_PATCHES=
25     ELT_LTMAIN_SH=
26 azarah 1.1
27     #
28     # Returns all the directories containing ltmain.sh
29     #
30 chriswhite 1.1.1.1 ELT_find_ltmain_sh() {
31     local x=
32     local dirlist=
33 azarah 1.1
34 chriswhite 1.1.1.1 for x in $(find "${S}" -name 'ltmain.sh') ; do
35 azarah 1.1 dirlist="${dirlist} ${x%/*}"
36     done
37    
38     echo "${dirlist}"
39     }
40    
41     #
42 chriswhite 1.1.1.1 # See if we can apply $2 on $1, and if so, do it
43 azarah 1.1 #
44 chriswhite 1.1.1.1 ELT_try_and_apply_patch() {
45     local ret=0
46     local file=$1
47     local patch=$2
48    
49     # We only support patchlevel of 0 - why worry if its static patches?
50     if patch -p0 --dry-run "${file}" < "${patch}" &> "${T}/elibtool.log" ; then
51     einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
52     patch -p0 "${file}" < "${patch}" &> "${T}/elibtool.log"
53     ret=$?
54     export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
55     else
56     ret=1
57     fi
58    
59     return "${ret}"
60     }
61    
62     #
63     # Get string version of ltmain.sh or ltconfig (passed as $1)
64 azarah 1.1 #
65 chriswhite 1.1.1.1 ELT_libtool_version() {
66     local ltmain_sh=$1
67     local version=
68    
69     version=$(eval $(grep -e '^[[:space:]]*VERSION=' "${ltmain_sh}"); \
70     echo "${VERSION}")
71     [[ -z ${version} ]] && version="0"
72 azarah 1.1
73 chriswhite 1.1.1.1 echo "${version}"
74     }
75 azarah 1.1
76 chriswhite 1.1.1.1 #
77     # Run through the patches in $2 and see if any
78     # apply to $1 ...
79     #
80     ELT_walk_patches() {
81     local x=
82     local y=
83     local ret=1
84     local file=$1
85     local patch_set=$2
86     local patch_dir=
87     local rem_int_dep=$3
88     local version=
89     local ltmain_sh=$1
90    
91     [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH}
92     version=$(ELT_libtool_version "${ltmain_sh}")
93    
94     if [[ -n ${patch_set} ]] ; then
95     if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
96     patch_dir="${ELT_PATCH_DIR}/${patch_set}"
97     else
98     return "${ret}"
99     fi
100    
101     if [[ ${version} == "0" ]] ; then
102     eerror "Could not get VERSION for ${file##*/}!"
103     die "Could not get VERSION for ${file##*/}!"
104     fi
105    
106     # Go through the patches in reverse order (large to small)
107     for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
108     if [[ -n ${x} && -f ${x} ]] ; then
109     local ltver=$(VER_to_int "${version}")
110     local ptver=$(VER_to_int "${x##*/}")
111    
112     # If libtool version smaller than patch version, skip patch.
113     [[ ${ltver} -lt ${ptver} ]] && continue
114     # For --remove-internal-dep ...
115     if [[ -n ${rem_int_dep} ]] ; then
116     # For replace @REM_INT_DEP@ with what was passed
117     # to --remove-internal-dep
118     sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
119     "${T}/$$.rem_int_deps.patch"
120    
121     x="${T}/$$.rem_int_deps.patch"
122     fi
123    
124     if ELT_try_and_apply_patch "${file}" "${x}" ; then
125     ret=0
126     break
127     fi
128     fi
129     done
130 azarah 1.1 fi
131    
132 chriswhite 1.1.1.1 return "${ret}"
133     }
134    
135     elibtoolize() {
136     local x=
137     local y=
138     local do_portage="no"
139     local do_reversedeps="no"
140     local do_only_patches="no"
141     local do_uclibc="yes"
142     local deptoremove=
143     local my_dirlist=
144     local elt_patches="portage relink max_cmd_len sed test tmp"
145     local start_dir=${PWD}
146    
147     my_dirlist=$(ELT_find_ltmain_sh)
148    
149     for x in "$@" ; do
150     case "${x}" in
151     "--portage")
152     # Only apply portage patch, and don't
153     # 'libtoolize --copy --force' if all patches fail.
154     do_portage="yes"
155     ;;
156     "--reverse-deps")
157     # Apply the reverse-deps patch
158     # http://bugzilla.gnome.org/show_bug.cgi?id=75635
159     do_reversedeps="yes"
160     elt_patches="${elt_patches} fix-relink"
161     ;;
162     "--patch-only")
163     # Do not run libtoolize if none of the patches apply ..
164     do_only_patches="yes"
165     ;;
166     "^--remove-internal-dep="*)
167     # We will replace @REM_INT_DEP@ with what is needed
168     # in ELT_walk_patches() ...
169     deptoremove=$(echo "${x}" | sed -e 's|--remove-internal-dep=||')
170    
171     # Add the patch for this ...
172     [[ -n ${deptoremove} ]] && elt_patches="${elt_patches} rem-int-dep"
173     ;;
174     "--shallow")
175     # Only patch the ltmain.sh in ${S}
176     if [[ -f ${S}/ltmain.sh ]] ; then
177     my_dirlist=${S}
178     else
179     my_dirlist=
180     fi
181     ;;
182     "--no-uclibc")
183     do_uclibc="no"
184     ;;
185     *)
186     eerror "Invalid elibtoolize option: ${x}"
187     die "elibtoolize called with ${x} ??"
188     esac
189     done
190    
191     [[ ${do_uclibc} == "yes" ]] && \
192     elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
193 azarah 1.1
194 chriswhite 1.1.1.1 [[ ${CHOST} == *"-freebsd"* ]] && \
195     elt_patches="${elt_patches} fbsd-conf"
196    
197     if useq ppc-macos ; then
198     local opts
199     [[ -f Makefile.am ]] && opts="--automake"
200     glibtoolize --copy --force ${opts}
201    
202     elt_patches="${elt_patches} darwin-ltconf darwin-ltmain"
203 azarah 1.1 fi
204    
205 chriswhite 1.1.1.1 for x in ${my_dirlist} ; do
206     local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
207     export ELT_APPLIED_PATCHES=
208     export ELT_LTMAIN_SH="${x}/ltmain.sh"
209    
210     [[ -f ${x}/.elibtoolized ]] && continue
211    
212     cd ${x}
213     einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
214    
215     for y in ${elt_patches} ; do
216     local ret=0
217    
218     case "${y}" in
219     "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     if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
226     ELT_walk_patches "${x}/ltmain.sh" "${y}"
227     ret=$?
228     fi
229     ;;
230     "max_cmd_len")
231     # Do not apply if $max_cmd_len is not used ...
232     if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
233     ELT_walk_patches "${x}/ltmain.sh" "${y}"
234     ret=$?
235     fi
236     ;;
237     "uclibc-conf")
238     if [[ -e ${x}/configure && \
239     -n $(grep 'Transform linux' "${x}/configure") ]] ; then
240     ELT_walk_patches "${x}/configure" "${y}"
241     ret=$?
242     # ltmain.sh and co might be in a subdirectory ...
243     elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
244     -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
245     ELT_walk_patches "${x}/../configure" "${y}"
246     ret=$?
247     fi
248     ;;
249     "uclibc-ltconf")
250     # Newer libtoolize clears ltconfig, as not used anymore
251     if [[ -s ${x}/ltconfig ]] ; then
252     ELT_walk_patches "${x}/ltconfig" "${y}"
253     ret=$?
254     fi
255     ;;
256     "fbsd-conf")
257     if [[ -e ${x}/configure && \
258     -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
259     ELT_walk_patches "${x}/configure" "${y}"
260     ret=$?
261     # ltmain.sh and co might be in a subdirectory ...
262     elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
263     -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
264     ELT_walk_patches "${x}/../configure" "${y}"
265     ret=$?
266     fi
267     ;;
268     "darwin-ltconf")
269     # Newer libtoolize clears ltconfig, as not used anymore
270     if [[ -s ${x}/ltconfig ]] ; then
271     ELT_walk_patches "${x}/ltconfig" "${y}"
272     ret=$?
273     fi
274     ;;
275     *)
276     ELT_walk_patches "${x}/ltmain.sh" "${y}"
277     ret=$?
278     ;;
279     esac
280    
281     if [[ ${ret} -ne 0 ]] ; then
282     case ${y} in
283     "relink")
284     local version=$(ELT_libtool_version "${x}/ltmain.sh")
285     # Critical patch, but could be applied ...
286     # FIXME: Still need a patch for ltmain.sh > 1.4.0
287     if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
288     $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
289     ewarn " Could not apply relink.patch!"
290     fi
291     ;;
292     "portage")
293     # Critical patch - for this one we abort, as it can really
294     # cause breakage without it applied!
295     if [[ ${do_portage} == "yes" ]] ; then
296     # Stupid test to see if its already applied ...
297     if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
298     echo
299     eerror "Portage patch requested, but failed to apply!"
300     die "Portage patch requested, but failed to apply!"
301     fi
302     else
303     if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
304     # ewarn " Portage patch seems to be already applied."
305     # ewarn " Please verify that it is not needed."
306     :
307     else
308     local version=$( \
309     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
310     echo "${VERSION}")
311    
312     echo
313     eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
314     die "Portage patch failed to apply!"
315     fi
316     # We do not want to run libtoolize ...
317     ELT_APPLIED_PATCHES="portage"
318     fi
319     ;;
320     "uclibc-"*)
321     [[ ${CHOST} == *"-uclibc" ]] && \
322     ewarn " uClibc patch set '${y}' failed to apply!"
323     ;;
324     "fbsd-"*)
325     if [[ ${CHOST} == *"-freebsd"* ]] ; then
326     if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' "${x}/configure") ]]; then
327     eerror " FreeBSD patch set '${y}' failed to apply!"
328     die "FreeBSD patch set '${y}' failed to apply!"
329     fi
330     fi
331     ;;
332     "darwin-"*)
333     useq ppc-macos && \
334     ewarn " Darwin patch set '${y}' failed to apply!"
335     ;;
336     esac
337     fi
338     done
339    
340     if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
341     if [[ ${do_portage} == "no" && \
342     ${do_reversedeps} == "no" && \
343     ${do_only_patches} == "no" && \
344     ${deptoremove} == "" ]]
345     then
346     ewarn "Cannot apply any patches, please file a bug about this"
347     break
348    
349     # Sometimes ltmain.sh is in a subdirectory ...
350     if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
351     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
352     cd "${x}"/../
353     fi
354     fi
355    
356     if type -p libtoolize &> /dev/null ; then
357     ewarn "Cannot apply any patches, running libtoolize..."
358     libtoolize --copy --force
359     fi
360     cd "${x}"
361     break
362     fi
363     fi
364    
365     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
366    
367     touch "${x}/.elibtoolized"
368     done
369    
370     cd "${start_dir}"
371 azarah 1.1 }
372    
373 chriswhite 1.1.1.1 uclibctoolize() {
374     ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!"
375     elibtoolize
376     }
377 azarah 1.1
378 chriswhite 1.1.1.1 darwintoolize() {
379     ewarn "darwintoolize() is depreciated, please just use elibtoolize()!"
380     elibtoolize
381     }
382 azarah 1.1
383 chriswhite 1.1.1.1 # char *VER_major(string)
384     #
385     # Return the Major (X of X.Y.Z) version
386     #
387     VER_major() {
388     [[ -z $1 ]] && return 1
389    
390     local VER=$@
391     echo "${VER%%[^[:digit:]]*}"
392     }
393    
394     # char *VER_minor(string)
395     #
396     # Return the Minor (Y of X.Y.Z) version
397     #
398     VER_minor() {
399     [[ -z $1 ]] && return 1
400    
401     local VER=$@
402     VER=${VER#*.}
403     echo "${VER%%[^[:digit:]]*}"
404     }
405 azarah 1.1
406 chriswhite 1.1.1.1 # char *VER_micro(string)
407     #
408     # Return the Micro (Z of X.Y.Z) version.
409     #
410     VER_micro() {
411     [[ -z $1 ]] && return 1
412    
413     local VER=$@
414     VER=${VER#*.*.}
415     echo "${VER%%[^[:digit:]]*}"
416 azarah 1.1 }
417    
418 chriswhite 1.1.1.1 # int VER_to_int(string)
419     #
420     # Convert a string type version (2.4.0) to an int (132096)
421     # for easy compairing or versions ...
422     #
423     VER_to_int() {
424     [[ -z $1 ]] && return 1
425    
426     local VER_MAJOR=$(VER_major "$1")
427     local VER_MINOR=$(VER_minor "$1")
428     local VER_MICRO=$(VER_micro "$1")
429     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
430    
431     # We make version 1.0.0 the minimum version we will handle as
432     # a sanity check ... if its less, we fail ...
433     if [[ ${VER_int} -ge 65536 ]] ; then
434     echo "${VER_int}"
435     return 0
436     fi
437    
438     echo 1
439     return 1
440     }

  ViewVC Help
Powered by ViewVC 1.1.20