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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.61 - (hide annotations) (download)
Sun Oct 9 13:01:41 2005 UTC (8 years, 6 months ago) by flameeyes
Branch: MAIN
Changes since 1.60: +6 -4 lines
Check if the freebsd patch was already applied when it fails to apply.

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 flameeyes 1.61 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.60 2005/10/04 15:48:05 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 azarah 1.60 if useq ppc-macos ; then
198 azarah 1.51 local opts
199     [[ -f Makefile.am ]] && opts="--automake"
200     glibtoolize --copy --force ${opts}
201 flameeyes 1.61
202 azarah 1.60 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain"
203 usata 1.36 fi
204    
205 vapier 1.42 for x in ${my_dirlist} ; do
206 azarah 1.51 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
207 azarah 1.24 export ELT_APPLIED_PATCHES=
208 azarah 1.53 export ELT_LTMAIN_SH="${x}/ltmain.sh"
209 mr_bones_ 1.27
210 azarah 1.52 [[ -f ${x}/.elibtoolized ]] && continue
211    
212 azarah 1.1 cd ${x}
213 azarah 1.51 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
214 azarah 1.2
215 vapier 1.42 for y in ${elt_patches} ; do
216 azarah 1.24 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 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 azarah 1.53 "uclibc-conf")
238 azarah 1.58 if [[ -e ${x}/configure && \
239     -n $(grep 'Transform linux' "${x}/configure") ]] ; then
240 azarah 1.53 ELT_walk_patches "${x}/configure" "${y}"
241     ret=$?
242     # ltmain.sh and co might be in a subdirectory ...
243 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
244     -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
245 azarah 1.53 ELT_walk_patches "${x}/../configure" "${y}"
246     ret=$?
247     fi
248     ;;
249     "uclibc-ltconf")
250 azarah 1.60 # Newer libtoolize clears ltconfig, as not used anymore
251     if [[ -s ${x}/ltconfig ]] ; then
252 azarah 1.53 ELT_walk_patches "${x}/ltconfig" "${y}"
253     ret=$?
254     fi
255     ;;
256 flameeyes 1.55 "fbsd-conf")
257 azarah 1.58 if [[ -e ${x}/configure && \
258     -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
259 flameeyes 1.55 ELT_walk_patches "${x}/configure" "${y}"
260     ret=$?
261     # ltmain.sh and co might be in a subdirectory ...
262 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
263     -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
264 flameeyes 1.55 ELT_walk_patches "${x}/../configure" "${y}"
265     ret=$?
266     fi
267     ;;
268 azarah 1.60 "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 azarah 1.24 *)
276     ELT_walk_patches "${x}/ltmain.sh" "${y}"
277     ret=$?
278     ;;
279     esac
280 mr_bones_ 1.27
281 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
282 azarah 1.3 case ${y} in
283 azarah 1.24 "relink")
284 azarah 1.59 local version=$(ELT_libtool_version "${x}/ltmain.sh")
285 azarah 1.24 # Critical patch, but could be applied ...
286 azarah 1.59 # 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 azarah 1.24 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 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
296 azarah 1.24 # Stupid test to see if its already applied ...
297 vapier 1.42 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
298 azarah 1.24 echo
299     eerror "Portage patch requested, but failed to apply!"
300     die "Portage patch requested, but failed to apply!"
301     fi
302     else
303 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
304 azarah 1.51 # ewarn " Portage patch seems to be already applied."
305     # ewarn " Please verify that it is not needed."
306     :
307 azarah 1.45 else
308 azarah 1.46 local version=$( \
309     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
310     echo "${VERSION}")
311    
312 azarah 1.45 echo
313 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
314 azarah 1.45 die "Portage patch failed to apply!"
315     fi
316     # We do not want to run libtoolize ...
317     ELT_APPLIED_PATCHES="portage"
318 azarah 1.3 fi
319     ;;
320 azarah 1.53 "uclibc-"*)
321     [[ ${CHOST} == *"-uclibc" ]] && \
322     ewarn " uClibc patch set '${y}' failed to apply!"
323     ;;
324 flameeyes 1.55 "fbsd-"*)
325 azarah 1.60 if [[ ${CHOST} == *"-freebsd"* ]] ; then
326 flameeyes 1.61 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 azarah 1.60 fi
331     ;;
332     "darwin-"*)
333     useq ppc-macos && \
334     ewarn " Darwin patch set '${y}' failed to apply!"
335 flameeyes 1.55 ;;
336 azarah 1.3 esac
337 azarah 1.1 fi
338 azarah 1.52 done
339 azarah 1.11
340 azarah 1.52 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 azarah 1.24 fi
354 azarah 1.52 fi
355 azarah 1.24
356 azarah 1.52 if type -p libtoolize &> /dev/null ; then
357     ewarn "Cannot apply any patches, running libtoolize..."
358     libtoolize --copy --force
359 azarah 1.19 fi
360 azarah 1.52 cd "${x}"
361     break
362 azarah 1.1 fi
363 azarah 1.52 fi
364    
365     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
366    
367     touch "${x}/.elibtoolized"
368 azarah 1.1 done
369 azarah 1.6
370 vapier 1.29 cd "${start_dir}"
371 vapier 1.30 }
372    
373     uclibctoolize() {
374 azarah 1.60 ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!"
375 azarah 1.53 elibtoolize
376 azarah 1.1 }
377 usata 1.36
378     darwintoolize() {
379 azarah 1.60 ewarn "darwintoolize() is depreciated, please just use elibtoolize()!"
380     elibtoolize
381 usata 1.36 }
382 azarah 1.44
383     # 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 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
392 azarah 1.44 }
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 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
404 azarah 1.44 }
405    
406     # 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 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
416 azarah 1.44 }
417    
418     # 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