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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.60 - (hide annotations) (download)
Tue Oct 4 15:48:05 2005 UTC (8 years, 11 months ago) by azarah
Branch: MAIN
Changes since 1.59: +22 -30 lines
Update elibtoolize to apply darwin 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.60 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.59 2005/09/05 22:23:10 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 azarah 1.60
202     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.55 eerror " FreeBSD patch set '${y}' failed to apply!"
327     die "FreeBSD patch set '${y}' failed to apply!"
328 azarah 1.60 fi
329     ;;
330     "darwin-"*)
331     useq ppc-macos && \
332     ewarn " Darwin patch set '${y}' failed to apply!"
333 flameeyes 1.55 ;;
334 azarah 1.3 esac
335 azarah 1.1 fi
336 azarah 1.52 done
337 azarah 1.11
338 azarah 1.52 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
339     if [[ ${do_portage} == "no" && \
340     ${do_reversedeps} == "no" && \
341     ${do_only_patches} == "no" && \
342     ${deptoremove} == "" ]]
343     then
344     ewarn "Cannot apply any patches, please file a bug about this"
345     break
346    
347     # Sometimes ltmain.sh is in a subdirectory ...
348     if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
349     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
350     cd "${x}"/../
351 azarah 1.24 fi
352 azarah 1.52 fi
353 azarah 1.24
354 azarah 1.52 if type -p libtoolize &> /dev/null ; then
355     ewarn "Cannot apply any patches, running libtoolize..."
356     libtoolize --copy --force
357 azarah 1.19 fi
358 azarah 1.52 cd "${x}"
359     break
360 azarah 1.1 fi
361 azarah 1.52 fi
362    
363     [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
364    
365     touch "${x}/.elibtoolized"
366 azarah 1.1 done
367 azarah 1.6
368 vapier 1.29 cd "${start_dir}"
369 vapier 1.30 }
370    
371     uclibctoolize() {
372 azarah 1.60 ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!"
373 azarah 1.53 elibtoolize
374 azarah 1.1 }
375 usata 1.36
376     darwintoolize() {
377 azarah 1.60 ewarn "darwintoolize() is depreciated, please just use elibtoolize()!"
378     elibtoolize
379 usata 1.36 }
380 azarah 1.44
381     # char *VER_major(string)
382     #
383     # Return the Major (X of X.Y.Z) version
384     #
385     VER_major() {
386     [[ -z $1 ]] && return 1
387    
388     local VER=$@
389 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
390 azarah 1.44 }
391    
392     # char *VER_minor(string)
393     #
394     # Return the Minor (Y of X.Y.Z) version
395     #
396     VER_minor() {
397     [[ -z $1 ]] && return 1
398    
399     local VER=$@
400     VER=${VER#*.}
401 azarah 1.57 echo "${VER%%[^[:digit:]]*}"
402 azarah 1.44 }
403    
404     # char *VER_micro(string)
405     #
406     # Return the Micro (Z of X.Y.Z) version.
407     #
408     VER_micro() {
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     # int VER_to_int(string)
417     #
418     # Convert a string type version (2.4.0) to an int (132096)
419     # for easy compairing or versions ...
420     #
421     VER_to_int() {
422     [[ -z $1 ]] && return 1
423    
424     local VER_MAJOR=$(VER_major "$1")
425     local VER_MINOR=$(VER_minor "$1")
426     local VER_MICRO=$(VER_micro "$1")
427     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
428    
429     # We make version 1.0.0 the minimum version we will handle as
430     # a sanity check ... if its less, we fail ...
431     if [[ ${VER_int} -ge 65536 ]] ; then
432     echo "${VER_int}"
433     return 0
434     fi
435    
436     echo 1
437     return 1
438     }

  ViewVC Help
Powered by ViewVC 1.1.20