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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.64 - (hide annotations) (download)
Fri Feb 3 22:20:25 2006 UTC (8 years, 2 months ago) by azarah
Branch: MAIN
Changes since 1.63: +8 -1 lines
Do not apply the portage patch if already applied.

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.64 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.63 2006/01/22 00:24:15 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.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 azarah 1.64 "portage")
221     # Stupid test to see if its already applied ...
222     if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
223     ELT_walk_patches "${x}/ltmain.sh" "${y}"
224     ret=$?
225     fi
226     ;;
227 azarah 1.24 "rem-int-dep")
228     ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
229     ret=$?
230     ;;
231     "fix-relink")
232     # Do not apply if we do not have the relink patch applied ...
233 vapier 1.42 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
234 azarah 1.24 ELT_walk_patches "${x}/ltmain.sh" "${y}"
235     ret=$?
236     fi
237     ;;
238 azarah 1.25 "max_cmd_len")
239     # Do not apply if $max_cmd_len is not used ...
240 vapier 1.42 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
241 azarah 1.25 ELT_walk_patches "${x}/ltmain.sh" "${y}"
242     ret=$?
243     fi
244     ;;
245 azarah 1.53 "uclibc-conf")
246 azarah 1.58 if [[ -e ${x}/configure && \
247     -n $(grep 'Transform linux' "${x}/configure") ]] ; then
248 azarah 1.53 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 'Transform linux' "${x}/../configure") ]] ; then
253 azarah 1.53 ELT_walk_patches "${x}/../configure" "${y}"
254     ret=$?
255     fi
256     ;;
257     "uclibc-ltconf")
258 azarah 1.60 # Newer libtoolize clears ltconfig, as not used anymore
259     if [[ -s ${x}/ltconfig ]] ; then
260 azarah 1.53 ELT_walk_patches "${x}/ltconfig" "${y}"
261     ret=$?
262     fi
263     ;;
264 flameeyes 1.55 "fbsd-conf")
265 azarah 1.58 if [[ -e ${x}/configure && \
266     -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
267 flameeyes 1.55 ELT_walk_patches "${x}/configure" "${y}"
268     ret=$?
269     # ltmain.sh and co might be in a subdirectory ...
270 azarah 1.58 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
271     -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
272 flameeyes 1.55 ELT_walk_patches "${x}/../configure" "${y}"
273     ret=$?
274     fi
275     ;;
276 azarah 1.60 "darwin-ltconf")
277     # Newer libtoolize clears ltconfig, as not used anymore
278     if [[ -s ${x}/ltconfig ]] ; then
279     ELT_walk_patches "${x}/ltconfig" "${y}"
280     ret=$?
281     fi
282     ;;
283 azarah 1.24 *)
284     ELT_walk_patches "${x}/ltmain.sh" "${y}"
285     ret=$?
286     ;;
287     esac
288 mr_bones_ 1.27
289 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
290 azarah 1.3 case ${y} in
291 azarah 1.24 "relink")
292 azarah 1.59 local version=$(ELT_libtool_version "${x}/ltmain.sh")
293 azarah 1.24 # Critical patch, but could be applied ...
294 azarah 1.59 # FIXME: Still need a patch for ltmain.sh > 1.4.0
295     if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
296     $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
297 azarah 1.24 ewarn " Could not apply relink.patch!"
298     fi
299     ;;
300     "portage")
301     # Critical patch - for this one we abort, as it can really
302     # cause breakage without it applied!
303 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
304 azarah 1.24 # Stupid test to see if its already applied ...
305 vapier 1.42 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
306 azarah 1.24 echo
307     eerror "Portage patch requested, but failed to apply!"
308 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
309 azarah 1.24 die "Portage patch requested, but failed to apply!"
310     fi
311     else
312 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
313 azarah 1.51 # ewarn " Portage patch seems to be already applied."
314     # ewarn " Please verify that it is not needed."
315     :
316 azarah 1.45 else
317 azarah 1.46 local version=$( \
318     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
319     echo "${VERSION}")
320    
321 azarah 1.45 echo
322 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
323 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
324 azarah 1.45 die "Portage patch failed to apply!"
325     fi
326     # We do not want to run libtoolize ...
327     ELT_APPLIED_PATCHES="portage"
328 azarah 1.3 fi
329     ;;
330 azarah 1.53 "uclibc-"*)
331     [[ ${CHOST} == *"-uclibc" ]] && \
332     ewarn " uClibc patch set '${y}' failed to apply!"
333     ;;
334 flameeyes 1.55 "fbsd-"*)
335 azarah 1.60 if [[ ${CHOST} == *"-freebsd"* ]] ; then
336 flameeyes 1.61 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' "${x}/configure") ]]; then
337     eerror " FreeBSD patch set '${y}' failed to apply!"
338     die "FreeBSD patch set '${y}' failed to apply!"
339     fi
340 azarah 1.60 fi
341     ;;
342     "darwin-"*)
343     useq ppc-macos && \
344     ewarn " Darwin patch set '${y}' failed to apply!"
345 flameeyes 1.55 ;;
346 azarah 1.3 esac
347 azarah 1.1 fi
348 azarah 1.52 done
349 azarah 1.11
350 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
351     if [[ ${do_portage} == "no" && \
352     ${do_reversedeps} == "no" && \
353     ${do_only_patches} == "no" && \
354     ${deptoremove} == "" ]]
355     then
356     ewarn "Cannot apply any patches, please file a bug about this"
357     break
358    
359     # Sometimes ltmain.sh is in a subdirectory ...
360     if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
361     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
362     cd "${x}"/../
363 azarah 1.24 fi
364 azarah 1.52 fi
365 azarah 1.24
366 azarah 1.52 if type -p libtoolize &> /dev/null ; then
367     ewarn "Cannot apply any patches, running libtoolize..."
368     libtoolize --copy --force
369 azarah 1.19 fi
370 azarah 1.52 cd "${x}"
371     break
372 azarah 1.1 fi
373 azarah 1.52 fi
374    
375     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
376    
377     touch "${x}/.elibtoolized"
378 azarah 1.1 done
379 azarah 1.6
380 vapier 1.29 cd "${start_dir}"
381 vapier 1.30 }
382    
383     uclibctoolize() {
384 azarah 1.60 ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!"
385 azarah 1.53 elibtoolize
386 azarah 1.1 }
387 usata 1.36
388     darwintoolize() {
389 azarah 1.60 ewarn "darwintoolize() is depreciated, please just use elibtoolize()!"
390     elibtoolize
391 usata 1.36 }
392 azarah 1.44
393     # char *VER_major(string)
394     #
395     # Return the Major (X of X.Y.Z) version
396     #
397     VER_major() {
398     [[ -z $1 ]] && return 1
399    
400     local VER=$@
401 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
402 azarah 1.44 }
403    
404     # char *VER_minor(string)
405     #
406     # Return the Minor (Y of X.Y.Z) version
407     #
408     VER_minor() {
409     [[ -z $1 ]] && return 1
410    
411     local VER=$@
412     VER=${VER#*.}
413 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
414 azarah 1.44 }
415    
416     # char *VER_micro(string)
417     #
418     # Return the Micro (Z of X.Y.Z) version.
419     #
420     VER_micro() {
421     [[ -z $1 ]] && return 1
422    
423     local VER=$@
424     VER=${VER#*.*.}
425 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
426 azarah 1.44 }
427    
428     # int VER_to_int(string)
429     #
430     # Convert a string type version (2.4.0) to an int (132096)
431     # for easy compairing or versions ...
432     #
433     VER_to_int() {
434     [[ -z $1 ]] && return 1
435    
436     local VER_MAJOR=$(VER_major "$1")
437     local VER_MINOR=$(VER_minor "$1")
438     local VER_MICRO=$(VER_micro "$1")
439     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
440    
441     # We make version 1.0.0 the minimum version we will handle as
442     # a sanity check ... if its less, we fail ...
443     if [[ ${VER_int} -ge 65536 ]] ; then
444     echo "${VER_int}"
445     return 0
446     fi
447    
448     echo 1
449     return 1
450     }

  ViewVC Help
Powered by ViewVC 1.1.20