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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.59 - (hide annotations) (download)
Mon Sep 5 22:23:10 2005 UTC (9 years, 3 months ago) by azarah
Branch: MAIN
Changes since 1.58: +21 -5 lines
Move version retrieve stuff to ELT_libtool_version().  Do not warn on relink patch for libtool < 1.4.0.

1 vapier 1.42 # Copyright 1999-2005 Gentoo Foundation
2 vapier 1.15 # Distributed under the terms of the GNU General Public License v2
3 azarah 1.59 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.58 2005/09/04 20:45:57 azarah Exp $
4 vapier 1.20 #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@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.15
10 danarmak 1.12
11 rac 1.34 # 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    
19 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
20 azarah 1.1
21 azarah 1.44 ELIBTOOL_VERSION="2.0.2"
22 azarah 1.1
23 azarah 1.24 ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
24     ELT_APPLIED_PATCHES=
25 azarah 1.53 ELT_LTMAIN_SH=
26 azarah 1.24
27     #
28     # Returns all the directories containing ltmain.sh
29     #
30     ELT_find_ltmain_sh() {
31     local x=
32     local dirlist=
33    
34 vapier 1.42 for x in $(find "${S}" -name 'ltmain.sh') ; do
35 mr_bones_ 1.27 dirlist="${dirlist} ${x%/*}"
36     done
37 azarah 1.24
38 mr_bones_ 1.27 echo "${dirlist}"
39 azarah 1.24 }
40    
41     #
42     # See if we can apply $2 on $1, and if so, do it
43     #
44     ELT_try_and_apply_patch() {
45     local ret=0
46 azarah 1.57 local file=$1
47     local patch=$2
48 azarah 1.24
49     # We only support patchlevel of 0 - why worry if its static patches?
50 azarah 1.57 if patch -p0 --dry-run "${file}" < "${patch}" &> "${T}/elibtool.log" ; then
51 vapier 1.37 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
52 azarah 1.57 patch -p0 "${file}" < "${patch}" &> "${T}/elibtool.log"
53 azarah 1.24 ret=$?
54     export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
55     else
56     ret=1
57     fi
58    
59 azarah 1.57 return "${ret}"
60 azarah 1.24 }
61    
62     #
63 azarah 1.59 # Get string version of ltmain.sh or ltconfig (passed as $1)
64     #
65     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    
73     echo "${version}"
74     }
75    
76     #
77 azarah 1.24 # 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 azarah 1.57 local file=$1
85     local patch_set=$2
86 azarah 1.24 local patch_dir=
87 azarah 1.57 local rem_int_dep=$3
88 azarah 1.53 local version=
89     local ltmain_sh=$1
90 swegener 1.54
91 azarah 1.57 [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH}
92 azarah 1.59 version=$(ELT_libtool_version "${ltmain_sh}")
93 azarah 1.2
94 azarah 1.57 if [[ -n ${patch_set} ]] ; then
95     if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
96     patch_dir="${ELT_PATCH_DIR}/${patch_set}"
97 azarah 1.24 else
98 azarah 1.57 return "${ret}"
99 azarah 1.4 fi
100 mr_bones_ 1.27
101 azarah 1.59 if [[ ${version} == "0" ]] ; then
102 azarah 1.57 eerror "Could not get VERSION for ${file##*/}!"
103     die "Could not get VERSION for ${file##*/}!"
104 azarah 1.44 fi
105 mr_bones_ 1.27
106 azarah 1.44 # 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 swegener 1.50
112 azarah 1.44 # If libtool version smaller than patch version, skip patch.
113     [[ ${ltver} -lt ${ptver} ]] && continue
114     # For --remove-internal-dep ...
115 azarah 1.57 if [[ -n ${rem_int_dep} ]] ; then
116 azarah 1.44 # For replace @REM_INT_DEP@ with what was passed
117     # to --remove-internal-dep
118 azarah 1.57 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
119     "${T}/$$.rem_int_deps.patch"
120 azarah 1.43
121 azarah 1.44 x="${T}/$$.rem_int_deps.patch"
122 azarah 1.24 fi
123 azarah 1.43
124 azarah 1.57 if ELT_try_and_apply_patch "${file}" "${x}" ; then
125 azarah 1.44 ret=0
126     break
127 azarah 1.24 fi
128 azarah 1.44 fi
129     done
130 azarah 1.24 fi
131    
132 azarah 1.57 return "${ret}"
133 azarah 1.24 }
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 azarah 1.56 local do_uclibc="yes"
142 azarah 1.24 local deptoremove=
143     local my_dirlist=
144 azarah 1.56 local elt_patches="portage relink max_cmd_len sed test tmp"
145 azarah 1.57 local start_dir=${PWD}
146 azarah 1.24
147 azarah 1.57 my_dirlist=$(ELT_find_ltmain_sh)
148 mr_bones_ 1.27
149 vapier 1.42 for x in "$@" ; do
150 azarah 1.24 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 azarah 1.57 deptoremove=$(echo "${x}" | sed -e 's|--remove-internal-dep=||')
170 azarah 1.24
171     # Add the patch for this ...
172 azarah 1.57 [[ -n ${deptoremove} ]] && elt_patches="${elt_patches} rem-int-dep"
173 azarah 1.24 ;;
174     "--shallow")
175     # Only patch the ltmain.sh in ${S}
176 azarah 1.57 if [[ -f ${S}/ltmain.sh ]] ; then
177     my_dirlist=${S}
178 azarah 1.24 else
179     my_dirlist=
180     fi
181     ;;
182 vapier 1.40 "--no-uclibc")
183 azarah 1.56 do_uclibc="no"
184 vapier 1.40 ;;
185 vapier 1.42 *)
186 azarah 1.57 eerror "Invalid elibtoolize option: ${x}"
187     die "elibtoolize called with ${x} ??"
188 azarah 1.24 esac
189 azarah 1.4 done
190 azarah 1.1
191 azarah 1.56 [[ ${do_uclibc} == "yes" ]] && \
192     elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
193    
194     [[ ${CHOST} == *"-freebsd"* ]] && \
195     elt_patches="${elt_patches} fbsd-conf"
196    
197 usata 1.36 if use ppc-macos ; then
198 azarah 1.51 local opts
199     [[ -f Makefile.am ]] && opts="--automake"
200     glibtoolize --copy --force ${opts}
201 usata 1.36 darwintoolize
202     fi
203    
204 vapier 1.42 for x in ${my_dirlist} ; do
205 azarah 1.51 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
206 azarah 1.24 export ELT_APPLIED_PATCHES=
207 azarah 1.53 export ELT_LTMAIN_SH="${x}/ltmain.sh"
208 mr_bones_ 1.27
209 azarah 1.52 [[ -f ${x}/.elibtoolized ]] && continue
210    
211 azarah 1.1 cd ${x}
212 azarah 1.51 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
213 azarah 1.2
214 vapier 1.42 for y in ${elt_patches} ; do
215 azarah 1.24 local ret=0
216    
217     case "${y}" in
218     "rem-int-dep")
219     ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
220     ret=$?
221     ;;
222     "fix-relink")
223     # Do not apply if we do not have the relink patch applied ...
224 vapier 1.42 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
225 azarah 1.24 ELT_walk_patches "${x}/ltmain.sh" "${y}"
226     ret=$?
227     fi
228     ;;
229 azarah 1.25 "max_cmd_len")
230     # Do not apply if $max_cmd_len is not used ...
231 vapier 1.42 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
232 azarah 1.25 ELT_walk_patches "${x}/ltmain.sh" "${y}"
233     ret=$?
234     fi
235     ;;
236 azarah 1.53 "uclibc-conf")
237 azarah 1.58 if [[ -e ${x}/configure && \
238     -n $(grep 'Transform linux' "${x}/configure") ]] ; then
239 azarah 1.53 ELT_walk_patches "${x}/configure" "${y}"
240     ret=$?
241     # ltmain.sh and co might be in a subdirectory ...
242 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
243     -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
244 azarah 1.53 ELT_walk_patches "${x}/../configure" "${y}"
245     ret=$?
246     fi
247     ;;
248     "uclibc-ltconf")
249     if [[ -e ${x}/ltconfig ]] ; then
250     ELT_walk_patches "${x}/ltconfig" "${y}"
251     ret=$?
252     fi
253     ;;
254 flameeyes 1.55 "fbsd-conf")
255 azarah 1.58 if [[ -e ${x}/configure && \
256     -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
257 flameeyes 1.55 ELT_walk_patches "${x}/configure" "${y}"
258     ret=$?
259     # ltmain.sh and co might be in a subdirectory ...
260 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
261     -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
262 flameeyes 1.55 ELT_walk_patches "${x}/../configure" "${y}"
263     ret=$?
264     fi
265     ;;
266 azarah 1.24 *)
267     ELT_walk_patches "${x}/ltmain.sh" "${y}"
268     ret=$?
269     ;;
270     esac
271 mr_bones_ 1.27
272 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
273 azarah 1.3 case ${y} in
274 azarah 1.24 "relink")
275 azarah 1.59 local version=$(ELT_libtool_version "${x}/ltmain.sh")
276 azarah 1.24 # Critical patch, but could be applied ...
277 azarah 1.59 # FIXME: Still need a patch for ltmain.sh > 1.4.0
278     if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
279     $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
280 azarah 1.24 ewarn " Could not apply relink.patch!"
281     fi
282     ;;
283     "portage")
284     # Critical patch - for this one we abort, as it can really
285     # cause breakage without it applied!
286 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
287 azarah 1.24 # Stupid test to see if its already applied ...
288 vapier 1.42 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
289 azarah 1.24 echo
290     eerror "Portage patch requested, but failed to apply!"
291     die "Portage patch requested, but failed to apply!"
292     fi
293     else
294 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
295 azarah 1.51 # ewarn " Portage patch seems to be already applied."
296     # ewarn " Please verify that it is not needed."
297     :
298 azarah 1.45 else
299 azarah 1.46 local version=$( \
300     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
301     echo "${VERSION}")
302    
303 azarah 1.45 echo
304 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
305 azarah 1.45 die "Portage patch failed to apply!"
306     fi
307     # We do not want to run libtoolize ...
308     ELT_APPLIED_PATCHES="portage"
309 azarah 1.3 fi
310     ;;
311 azarah 1.53 "uclibc-"*)
312     [[ ${CHOST} == *"-uclibc" ]] && \
313     ewarn " uClibc patch set '${y}' failed to apply!"
314     ;;
315 flameeyes 1.55 "fbsd-"*)
316     [[ ${CHOST} == *"-freebsd"* ]] && \
317     eerror " FreeBSD patch set '${y}' failed to apply!"
318     die "FreeBSD patch set '${y}' failed to apply!"
319     ;;
320 azarah 1.3 esac
321 azarah 1.1 fi
322 azarah 1.52 done
323 azarah 1.11
324 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
325     if [[ ${do_portage} == "no" && \
326     ${do_reversedeps} == "no" && \
327     ${do_only_patches} == "no" && \
328     ${deptoremove} == "" ]]
329     then
330     ewarn "Cannot apply any patches, please file a bug about this"
331     break
332    
333     # Sometimes ltmain.sh is in a subdirectory ...
334     if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
335     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
336     cd "${x}"/../
337 azarah 1.24 fi
338 azarah 1.52 fi
339 azarah 1.24
340 azarah 1.52 if type -p libtoolize &> /dev/null ; then
341     ewarn "Cannot apply any patches, running libtoolize..."
342     libtoolize --copy --force
343 azarah 1.19 fi
344 azarah 1.52 cd "${x}"
345     break
346 azarah 1.1 fi
347 azarah 1.52 fi
348    
349     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
350    
351     touch "${x}/.elibtoolized"
352 azarah 1.1 done
353 azarah 1.6
354 vapier 1.29 cd "${start_dir}"
355 vapier 1.30 }
356    
357     uclibctoolize() {
358 azarah 1.53 ewarn "uclibctoolize() is depreciated, please just use libtoolize()!"
359     elibtoolize
360 azarah 1.1 }
361 usata 1.36
362     darwintoolize() {
363     local targets=""
364     local x
365    
366 vapier 1.42 if [[ -z $* ]] ; then
367     targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
368 usata 1.36 fi
369    
370     einfo "Applying Darwin/libtool patches ..."
371     for x in ${targets} ; do
372 vapier 1.42 [[ ! -s ${x} ]] && continue
373     case ${x##*/} in
374 usata 1.36 ltmain.sh|ltconfig)
375 vapier 1.42 local ver=$(grep '^VERSION=' ${x})
376     ver=${ver/VERSION=}
377     if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
378 usata 1.36 ver="1.3" # 1.4, 1.5 and 1.3 are compat
379     fi
380    
381     ebegin " Fixing \${S}${x/${S}}"
382 vapier 1.42 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
383 usata 1.36 eend $? "PLEASE CHECK ${x}"
384     ;;
385     esac
386     done
387     }
388 azarah 1.44
389     # char *VER_major(string)
390     #
391     # Return the Major (X of X.Y.Z) version
392     #
393     VER_major() {
394     [[ -z $1 ]] && return 1
395    
396     local VER=$@
397 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
398 azarah 1.44 }
399    
400     # char *VER_minor(string)
401     #
402     # Return the Minor (Y of X.Y.Z) version
403     #
404     VER_minor() {
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     # char *VER_micro(string)
413     #
414     # Return the Micro (Z of X.Y.Z) version.
415     #
416     VER_micro() {
417     [[ -z $1 ]] && return 1
418    
419     local VER=$@
420     VER=${VER#*.*.}
421 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
422 azarah 1.44 }
423    
424     # int VER_to_int(string)
425     #
426     # Convert a string type version (2.4.0) to an int (132096)
427     # for easy compairing or versions ...
428     #
429     VER_to_int() {
430     [[ -z $1 ]] && return 1
431    
432     local VER_MAJOR=$(VER_major "$1")
433     local VER_MINOR=$(VER_minor "$1")
434     local VER_MICRO=$(VER_micro "$1")
435     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
436    
437     # We make version 1.0.0 the minimum version we will handle as
438     # a sanity check ... if its less, we fail ...
439     if [[ ${VER_int} -ge 65536 ]] ; then
440     echo "${VER_int}"
441     return 0
442     fi
443    
444     echo 1
445     return 1
446     }

  ViewVC Help
Powered by ViewVC 1.1.20