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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.62 - (hide annotations) (download)
Wed Dec 7 22:50:05 2005 UTC (9 years ago) by azarah
Branch: MAIN
Changes since 1.61: +5 -4 lines
Misc cleanups for libtool.eclass.  Add updates for max_cmd_len patches.

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

  ViewVC Help
Powered by ViewVC 1.1.20