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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.52 - (hide annotations) (download)
Fri Sep 2 10:02:50 2005 UTC (8 years, 11 months ago) by azarah
Branch: MAIN
Changes since 1.51: +28 -26 lines
Do not run elibtoolize again if already run.  The check for no patches applied was in the wrong for loop.

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

  ViewVC Help
Powered by ViewVC 1.1.20