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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.55 - (hide annotations) (download)
Sun Sep 4 18:40:48 2005 UTC (8 years, 10 months ago) by flameeyes
Branch: MAIN
Changes since 1.54: +21 -1 lines
Added elibtoolize patch for Gentoo/FreeBSD, to use linux-style link versioning.

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

  ViewVC Help
Powered by ViewVC 1.1.20