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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.67 - (hide annotations) (download)
Wed Apr 5 17:50:34 2006 UTC (8 years, 7 months ago) by azarah
Branch: MAIN
Changes since 1.66: +2 -2 lines
Change $PORTDIR/eclass/ to $ECLASSDIR/

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

  ViewVC Help
Powered by ViewVC 1.1.20