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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.45 - (hide annotations) (download)
Wed May 11 11:10:31 2005 UTC (9 years, 4 months ago) by azarah
Branch: MAIN
Changes since 1.44: +11 -3 lines
Do not run libtoolize if portage patch 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.45 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.44 2005/03/23 18:03:21 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 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
231     ewarn " Portage patch seems to be already applied."
232     ewarn " Please verify that it is not needed."
233     else
234     echo
235     eerror "Portage patch failed to apply!"
236     die "Portage patch failed to apply!"
237     fi
238     # We do not want to run libtoolize ...
239     ELT_APPLIED_PATCHES="portage"
240 azarah 1.3 fi
241     ;;
242     esac
243 azarah 1.1 fi
244 azarah 1.11
245 vapier 1.42 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
246     if [[ ${do_portage} == "no" && \
247     ${do_reversedeps} == "no" && \
248     ${do_only_patches} == "no" && \
249     ${deptoremove} == "" ]]
250 azarah 1.24 then
251     # Sometimes ltmain.sh is in a subdirectory ...
252 vapier 1.42 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
253     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
254     cd "${x}"/../
255 azarah 1.3 fi
256 azarah 1.24 fi
257    
258 vapier 1.42 if type -p libtoolize &> /dev/null ; then
259 azarah 1.24 ewarn "Cannot apply any patch, running libtoolize..."
260     libtoolize --copy --force
261 azarah 1.19 fi
262 vapier 1.42 cd "${x}"
263 azarah 1.24 break
264 azarah 1.19 fi
265 azarah 1.1 fi
266     done
267     done
268 azarah 1.6
269 vapier 1.42 if [[ -f libtool ]] ; then
270 azarah 1.7 rm -f libtool
271     fi
272    
273 vapier 1.29 cd "${start_dir}"
274 vapier 1.30
275     uclibctoolize
276     }
277    
278     uclibctoolize() {
279 vapier 1.42 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
280 vapier 1.38
281 vapier 1.41 local errmsg=""
282 vapier 1.42 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
283 vapier 1.41 && errmsg="PLEASE CHECK" \
284     || errmsg="Already patched"
285 vapier 1.30 local targets=""
286     local x
287    
288 vapier 1.42 if [[ -z $* ]] ; then
289     targets=$(find ${S} -name configure -o -name ltconfig)
290 vapier 1.30 fi
291    
292     einfo "Applying uClibc/libtool patches ..."
293     for x in ${targets} ; do
294 vapier 1.42 [[ ! -s ${x} ]] && continue
295     case ${x##*/} in
296 vapier 1.31 configure)
297 vapier 1.42 if grep 'Transform linux' "${x}" > /dev/null ; then
298 vapier 1.31 ebegin " Fixing \${S}${x/${S}}"
299     patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
300 vapier 1.41 eend $? "${errmsg} ${x}"
301 vapier 1.31 fi
302     ;;
303    
304     ltconfig)
305 vapier 1.42 local ver=$(grep '^VERSION=' ${x})
306     ver=${ver/VERSION=}
307     [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
308 vapier 1.30 ebegin " Fixing \${S}${x/${S}}"
309 vapier 1.31 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
310 vapier 1.41 eend $? "${errmsg} ${x}"
311 vapier 1.31 ;;
312     esac
313 vapier 1.30 done
314 azarah 1.1 }
315 usata 1.36
316     darwintoolize() {
317     local targets=""
318     local x
319    
320 vapier 1.42 if [[ -z $* ]] ; then
321     targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
322 usata 1.36 fi
323    
324     einfo "Applying Darwin/libtool patches ..."
325     for x in ${targets} ; do
326 vapier 1.42 [[ ! -s ${x} ]] && continue
327     case ${x##*/} in
328 usata 1.36 ltmain.sh|ltconfig)
329 vapier 1.42 local ver=$(grep '^VERSION=' ${x})
330     ver=${ver/VERSION=}
331     if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
332 usata 1.36 ver="1.3" # 1.4, 1.5 and 1.3 are compat
333     fi
334    
335     ebegin " Fixing \${S}${x/${S}}"
336 vapier 1.42 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
337 usata 1.36 eend $? "PLEASE CHECK ${x}"
338     ;;
339     esac
340     done
341     }
342 azarah 1.44
343     # char *VER_major(string)
344     #
345     # Return the Major (X of X.Y.Z) version
346     #
347     VER_major() {
348     [[ -z $1 ]] && return 1
349    
350     local VER=$@
351     echo ${VER%%[^[:digit:]]*}
352     }
353    
354     # char *VER_minor(string)
355     #
356     # Return the Minor (Y of X.Y.Z) version
357     #
358     VER_minor() {
359     [[ -z $1 ]] && return 1
360    
361     local VER=$@
362     VER=${VER#*.}
363     echo ${VER%%[^[:digit:]]*}
364     }
365    
366     # char *VER_micro(string)
367     #
368     # Return the Micro (Z of X.Y.Z) version.
369     #
370     VER_micro() {
371     [[ -z $1 ]] && return 1
372    
373     local VER=$@
374     VER=${VER#*.*.}
375     echo ${VER%%[^[:digit:]]*}
376     }
377    
378     # int VER_to_int(string)
379     #
380     # Convert a string type version (2.4.0) to an int (132096)
381     # for easy compairing or versions ...
382     #
383     VER_to_int() {
384     [[ -z $1 ]] && return 1
385    
386     local VER_MAJOR=$(VER_major "$1")
387     local VER_MINOR=$(VER_minor "$1")
388     local VER_MICRO=$(VER_micro "$1")
389     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
390    
391     # We make version 1.0.0 the minimum version we will handle as
392     # a sanity check ... if its less, we fail ...
393     if [[ ${VER_int} -ge 65536 ]] ; then
394     echo "${VER_int}"
395     return 0
396     fi
397    
398     echo 1
399     return 1
400     }

  ViewVC Help
Powered by ViewVC 1.1.20