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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.50 - (hide annotations) (download)
Mon Jul 11 15:08:06 2005 UTC (9 years ago) by swegener
Branch: MAIN
Changes since 1.49: +2 -2 lines
QA: Apply whitespace checks from repoman to eclasses.

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 swegener 1.50 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.49 2005/07/06 20:23:20 agriffis 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     glibtoolize --copy --force
171     darwintoolize
172     fi
173    
174 vapier 1.42 for x in ${my_dirlist} ; do
175     local tmp=$(echo "${x}" | sed -e "s|${S}||")
176 azarah 1.24 export ELT_APPLIED_PATCHES=
177 mr_bones_ 1.27
178 azarah 1.1 cd ${x}
179 vapier 1.37 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..."
180 azarah 1.2
181 vapier 1.42 for y in ${elt_patches} ; do
182 azarah 1.24 local ret=0
183    
184     case "${y}" in
185     "rem-int-dep")
186     ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
187     ret=$?
188     ;;
189     "fix-relink")
190     # Do not apply if we do not have the relink patch applied ...
191 vapier 1.42 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
192 azarah 1.24 ELT_walk_patches "${x}/ltmain.sh" "${y}"
193     ret=$?
194     fi
195     ;;
196 azarah 1.25 "max_cmd_len")
197     # Do not apply if $max_cmd_len is not used ...
198 vapier 1.42 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
199 azarah 1.25 ELT_walk_patches "${x}/ltmain.sh" "${y}"
200     ret=$?
201     fi
202     ;;
203 azarah 1.24 *)
204     ELT_walk_patches "${x}/ltmain.sh" "${y}"
205     ret=$?
206     ;;
207     esac
208 mr_bones_ 1.27
209 vapier 1.42 if [[ ${ret} -ne 0 ]] ; then
210 azarah 1.3 case ${y} in
211 azarah 1.24 "relink")
212     # Critical patch, but could be applied ...
213 vapier 1.42 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
214 azarah 1.24 ewarn " Could not apply relink.patch!"
215     fi
216     ;;
217     "portage")
218     # Critical patch - for this one we abort, as it can really
219     # cause breakage without it applied!
220 vapier 1.42 if [[ ${do_portage} == "yes" ]] ; then
221 azarah 1.24 # Stupid test to see if its already applied ...
222 vapier 1.42 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
223 azarah 1.24 echo
224     eerror "Portage patch requested, but failed to apply!"
225     die "Portage patch requested, but failed to apply!"
226     fi
227     else
228 azarah 1.45 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
229     ewarn " Portage patch seems to be already applied."
230     ewarn " Please verify that it is not needed."
231     else
232 azarah 1.46 local version=$( \
233     eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
234     echo "${VERSION}")
235    
236 azarah 1.45 echo
237 azarah 1.46 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
238 azarah 1.45 die "Portage patch failed to apply!"
239     fi
240     # We do not want to run libtoolize ...
241     ELT_APPLIED_PATCHES="portage"
242 azarah 1.3 fi
243     ;;
244     esac
245 azarah 1.1 fi
246 azarah 1.11
247 vapier 1.42 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
248     if [[ ${do_portage} == "no" && \
249     ${do_reversedeps} == "no" && \
250     ${do_only_patches} == "no" && \
251     ${deptoremove} == "" ]]
252 azarah 1.24 then
253 vapier 1.47 ewarn "Cannot apply any patches, please file a bug about this"
254     break
255    
256 azarah 1.24 # Sometimes ltmain.sh is in a subdirectory ...
257 vapier 1.42 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
258     if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
259     cd "${x}"/../
260 azarah 1.3 fi
261 azarah 1.24 fi
262    
263 vapier 1.42 if type -p libtoolize &> /dev/null ; then
264 vapier 1.47 ewarn "Cannot apply any patches, running libtoolize..."
265 azarah 1.24 libtoolize --copy --force
266 azarah 1.19 fi
267 vapier 1.42 cd "${x}"
268 azarah 1.24 break
269 azarah 1.19 fi
270 azarah 1.1 fi
271     done
272     done
273 azarah 1.6
274 vapier 1.42 if [[ -f libtool ]] ; then
275 azarah 1.7 rm -f libtool
276     fi
277    
278 vapier 1.29 cd "${start_dir}"
279 vapier 1.30
280     uclibctoolize
281     }
282    
283     uclibctoolize() {
284 vapier 1.42 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
285 vapier 1.38
286 vapier 1.41 local errmsg=""
287 vapier 1.42 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
288 vapier 1.41 && errmsg="PLEASE CHECK" \
289     || errmsg="Already patched"
290 vapier 1.30 local targets=""
291     local x
292    
293 vapier 1.42 if [[ -z $* ]] ; then
294     targets=$(find ${S} -name configure -o -name ltconfig)
295 vapier 1.30 fi
296    
297     einfo "Applying uClibc/libtool patches ..."
298     for x in ${targets} ; do
299 vapier 1.42 [[ ! -s ${x} ]] && continue
300     case ${x##*/} in
301 vapier 1.31 configure)
302 vapier 1.42 if grep 'Transform linux' "${x}" > /dev/null ; then
303 vapier 1.31 ebegin " Fixing \${S}${x/${S}}"
304     patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
305 vapier 1.41 eend $? "${errmsg} ${x}"
306 vapier 1.31 fi
307     ;;
308    
309     ltconfig)
310 vapier 1.42 local ver=$(grep '^VERSION=' ${x})
311     ver=${ver/VERSION=}
312     [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
313 vapier 1.30 ebegin " Fixing \${S}${x/${S}}"
314 vapier 1.31 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
315 vapier 1.41 eend $? "${errmsg} ${x}"
316 vapier 1.31 ;;
317     esac
318 vapier 1.30 done
319 azarah 1.1 }
320 usata 1.36
321     darwintoolize() {
322     local targets=""
323     local x
324    
325 vapier 1.42 if [[ -z $* ]] ; then
326     targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
327 usata 1.36 fi
328    
329     einfo "Applying Darwin/libtool patches ..."
330     for x in ${targets} ; do
331 vapier 1.42 [[ ! -s ${x} ]] && continue
332     case ${x##*/} in
333 usata 1.36 ltmain.sh|ltconfig)
334 vapier 1.42 local ver=$(grep '^VERSION=' ${x})
335     ver=${ver/VERSION=}
336     if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
337 usata 1.36 ver="1.3" # 1.4, 1.5 and 1.3 are compat
338     fi
339    
340     ebegin " Fixing \${S}${x/${S}}"
341 vapier 1.42 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
342 usata 1.36 eend $? "PLEASE CHECK ${x}"
343     ;;
344     esac
345     done
346     }
347 azarah 1.44
348     # char *VER_major(string)
349     #
350     # Return the Major (X of X.Y.Z) version
351     #
352     VER_major() {
353     [[ -z $1 ]] && return 1
354    
355     local VER=$@
356     echo ${VER%%[^[:digit:]]*}
357     }
358    
359     # char *VER_minor(string)
360     #
361     # Return the Minor (Y of X.Y.Z) version
362     #
363     VER_minor() {
364     [[ -z $1 ]] && return 1
365    
366     local VER=$@
367     VER=${VER#*.}
368     echo ${VER%%[^[:digit:]]*}
369     }
370    
371     # char *VER_micro(string)
372     #
373     # Return the Micro (Z of X.Y.Z) version.
374     #
375     VER_micro() {
376     [[ -z $1 ]] && return 1
377    
378     local VER=$@
379     VER=${VER#*.*.}
380     echo ${VER%%[^[:digit:]]*}
381     }
382    
383     # int VER_to_int(string)
384     #
385     # Convert a string type version (2.4.0) to an int (132096)
386     # for easy compairing or versions ...
387     #
388     VER_to_int() {
389     [[ -z $1 ]] && return 1
390    
391     local VER_MAJOR=$(VER_major "$1")
392     local VER_MINOR=$(VER_minor "$1")
393     local VER_MICRO=$(VER_micro "$1")
394     local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
395    
396     # We make version 1.0.0 the minimum version we will handle as
397     # a sanity check ... if its less, we fail ...
398     if [[ ${VER_int} -ge 65536 ]] ; then
399     echo "${VER_int}"
400     return 0
401     fi
402    
403     echo 1
404     return 1
405     }

  ViewVC Help
Powered by ViewVC 1.1.20