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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.44 - (hide annotations) (download)
Wed Mar 23 18:03:21 2005 UTC (9 years, 1 month ago) by azarah
Branch: MAIN
Changes since 1.43: +87 -42 lines
Fixups for bug #83486.

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

  ViewVC Help
Powered by ViewVC 1.1.20