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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.63 - (hide annotations) (download)
Sun Jan 22 00:24:15 2006 UTC (8 years, 2 months ago) by azarah
Branch: MAIN
Changes since 1.62: +3 -1 lines
Add comment to contact us if portage patch fails.

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.63 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.62 2005/12/07 22:50: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.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 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
302 azarah 1.24 die "Portage patch requested, but failed to apply!"
303     fi
304     else
305 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
306 azarah 1.51 # ewarn " Portage patch seems to be already applied."
307     # ewarn " Please verify that it is not needed."
308     :
309 azarah 1.45 else
310 azarah 1.46 local version=$( \
311     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
312     echo "${VERSION}")
313    
314 azarah 1.45 echo
315 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
316 azarah 1.63 eerror "Please bug azarah or vapier to add proper patch."
317 azarah 1.45 die "Portage patch failed to apply!"
318     fi
319     # We do not want to run libtoolize ...
320     ELT_APPLIED_PATCHES="portage"
321 azarah 1.3 fi
322     ;;
323 azarah 1.53 "uclibc-"*)
324     [[ ${CHOST} == *"-uclibc" ]] && \
325     ewarn " uClibc patch set '${y}' failed to apply!"
326     ;;
327 flameeyes 1.55 "fbsd-"*)
328 azarah 1.60 if [[ ${CHOST} == *"-freebsd"* ]] ; then
329 flameeyes 1.61 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' "${x}/configure") ]]; then
330     eerror " FreeBSD patch set '${y}' failed to apply!"
331     die "FreeBSD patch set '${y}' failed to apply!"
332     fi
333 azarah 1.60 fi
334     ;;
335     "darwin-"*)
336     useq ppc-macos && \
337     ewarn " Darwin patch set '${y}' failed to apply!"
338 flameeyes 1.55 ;;
339 azarah 1.3 esac
340 azarah 1.1 fi
341 azarah 1.52 done
342 azarah 1.11
343 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
344     if [[ ${do_portage} == "no" && \
345     ${do_reversedeps} == "no" && \
346     ${do_only_patches} == "no" && \
347     ${deptoremove} == "" ]]
348     then
349     ewarn "Cannot apply any patches, please file a bug about this"
350     break
351    
352     # Sometimes ltmain.sh is in a subdirectory ...
353     if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
354     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
355     cd "${x}"/../
356 azarah 1.24 fi
357 azarah 1.52 fi
358 azarah 1.24
359 azarah 1.52 if type -p libtoolize &> /dev/null ; then
360     ewarn "Cannot apply any patches, running libtoolize..."
361     libtoolize --copy --force
362 azarah 1.19 fi
363 azarah 1.52 cd "${x}"
364     break
365 azarah 1.1 fi
366 azarah 1.52 fi
367    
368     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
369    
370     touch "${x}/.elibtoolized"
371 azarah 1.1 done
372 azarah 1.6
373 vapier 1.29 cd "${start_dir}"
374 vapier 1.30 }
375    
376     uclibctoolize() {
377 azarah 1.60 ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!"
378 azarah 1.53 elibtoolize
379 azarah 1.1 }
380 usata 1.36
381     darwintoolize() {
382 azarah 1.60 ewarn "darwintoolize() is depreciated, please just use elibtoolize()!"
383     elibtoolize
384 usata 1.36 }
385 azarah 1.44
386     # char *VER_major(string)
387     #
388     # Return the Major (X of X.Y.Z) version
389     #
390     VER_major() {
391     [[ -z $1 ]] && return 1
392    
393     local VER=$@
394 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
395 azarah 1.44 }
396    
397     # char *VER_minor(string)
398     #
399     # Return the Minor (Y of X.Y.Z) version
400     #
401     VER_minor() {
402     [[ -z $1 ]] && return 1
403    
404     local VER=$@
405     VER=${VER#*.}
406 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
407 azarah 1.44 }
408    
409     # char *VER_micro(string)
410     #
411     # Return the Micro (Z of X.Y.Z) version.
412     #
413     VER_micro() {
414     [[ -z $1 ]] && return 1
415    
416     local VER=$@
417     VER=${VER#*.*.}
418 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
419 azarah 1.44 }
420    
421     # int VER_to_int(string)
422     #
423     # Convert a string type version (2.4.0) to an int (132096)
424     # for easy compairing or versions ...
425     #
426     VER_to_int() {
427     [[ -z $1 ]] && return 1
428    
429     local VER_MAJOR=$(VER_major "$1")
430     local VER_MINOR=$(VER_minor "$1")
431     local VER_MICRO=$(VER_micro "$1")
432     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
433    
434     # We make version 1.0.0 the minimum version we will handle as
435     # a sanity check ... if its less, we fail ...
436     if [[ ${VER_int} -ge 65536 ]] ; then
437     echo "${VER_int}"
438     return 0
439     fi
440    
441     echo 1
442     return 1
443     }

  ViewVC Help
Powered by ViewVC 1.1.20