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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


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

1 # Copyright 1999-2005 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.43 2005/02/27 20:29:04 azarah Exp $
4 #
5 # Author: Martin Schlemmer <azarah@gentoo.org>
6 #
7 # This eclass patches ltmain.sh distributed with libtoolized packages with the
8 # relink and portage patch among others
9
10 ECLASS="libtool"
11 INHERITED="${INHERITED} ${ECLASS}"
12
13 # 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 DESCRIPTION="Based on the ${ECLASS} eclass"
22
23 ELIBTOOL_VERSION="2.0.2"
24
25 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 for x in $(find "${S}" -name 'ltmain.sh') ; do
36 dirlist="${dirlist} ${x%/*}"
37 done
38
39 echo "${dirlist}"
40 }
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 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
52 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 local version=$(eval $(grep -e '^[[:space:]]*VERSION=' $1); \
72 echo "${VERSION}")
73
74 if [[ -n $2 ]] ; then
75 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
76 patch_dir="${ELT_PATCH_DIR}/$2"
77 else
78 return ${ret}
79 fi
80
81 if [[ -z ${version} ]] ; then
82 eerror "Could not get VERSION for ${1##*/}!"
83 die "Could not get VERSION for ${1##*/}!"
84 fi
85
86 # 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
101 x="${T}/$$.rem_int_deps.patch"
102 fi
103
104 if ELT_try_and_apply_patch "$1" "${x}" ; then
105 ret=0
106 break
107 fi
108 fi
109 done
110 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 local elt_patches="portage relink max_cmd_len sed test tmp"
124 local start_dir="${PWD}"
125
126 my_dirlist="$(ELT_find_ltmain_sh)"
127
128 for x in "$@" ; do
129 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 "--no-uclibc")
163 NO_UCLIBCTOOLIZE=1
164 ;;
165 *)
166 eerror "Invalid elibtoolize option: $x"
167 die "elibtoolize called with $x ??"
168 esac
169 done
170
171 if use ppc-macos ; then
172 glibtoolize --copy --force
173 darwintoolize
174 fi
175
176 for x in ${my_dirlist} ; do
177 local tmp=$(echo "${x}" | sed -e "s|${S}||")
178 export ELT_APPLIED_PATCHES=
179
180 cd ${x}
181 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..."
182
183 for y in ${elt_patches} ; do
184 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 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
194 ELT_walk_patches "${x}/ltmain.sh" "${y}"
195 ret=$?
196 fi
197 ;;
198 "max_cmd_len")
199 # Do not apply if $max_cmd_len is not used ...
200 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
201 ELT_walk_patches "${x}/ltmain.sh" "${y}"
202 ret=$?
203 fi
204 ;;
205 *)
206 ELT_walk_patches "${x}/ltmain.sh" "${y}"
207 ret=$?
208 ;;
209 esac
210
211 if [[ ${ret} -ne 0 ]] ; then
212 case ${y} in
213 "relink")
214 # Critical patch, but could be applied ...
215 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
216 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 if [[ ${do_portage} == "yes" ]] ; then
223 # Stupid test to see if its already applied ...
224 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
225 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 fi
233 ;;
234 esac
235 fi
236
237 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
238 if [[ ${do_portage} == "no" && \
239 ${do_reversedeps} == "no" && \
240 ${do_only_patches} == "no" && \
241 ${deptoremove} == "" ]]
242 then
243 # Sometimes ltmain.sh is in a subdirectory ...
244 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 fi
248 fi
249
250 if type -p libtoolize &> /dev/null ; then
251 ewarn "Cannot apply any patch, running libtoolize..."
252 libtoolize --copy --force
253 fi
254 cd "${x}"
255 break
256 fi
257 fi
258 done
259 done
260
261 if [[ -f libtool ]] ; then
262 rm -f libtool
263 fi
264
265 cd "${start_dir}"
266
267 uclibctoolize
268 }
269
270 uclibctoolize() {
271 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
272
273 local errmsg=""
274 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
275 && errmsg="PLEASE CHECK" \
276 || errmsg="Already patched"
277 local targets=""
278 local x
279
280 if [[ -z $* ]] ; then
281 targets=$(find ${S} -name configure -o -name ltconfig)
282 fi
283
284 einfo "Applying uClibc/libtool patches ..."
285 for x in ${targets} ; do
286 [[ ! -s ${x} ]] && continue
287 case ${x##*/} in
288 configure)
289 if grep 'Transform linux' "${x}" > /dev/null ; then
290 ebegin " Fixing \${S}${x/${S}}"
291 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
292 eend $? "${errmsg} ${x}"
293 fi
294 ;;
295
296 ltconfig)
297 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 ebegin " Fixing \${S}${x/${S}}"
301 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
302 eend $? "${errmsg} ${x}"
303 ;;
304 esac
305 done
306 }
307
308 darwintoolize() {
309 local targets=""
310 local x
311
312 if [[ -z $* ]] ; then
313 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
314 fi
315
316 einfo "Applying Darwin/libtool patches ..."
317 for x in ${targets} ; do
318 [[ ! -s ${x} ]] && continue
319 case ${x##*/} in
320 ltmain.sh|ltconfig)
321 local ver=$(grep '^VERSION=' ${x})
322 ver=${ver/VERSION=}
323 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
324 ver="1.3" # 1.4, 1.5 and 1.3 are compat
325 fi
326
327 ebegin " Fixing \${S}${x/${S}}"
328 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
329 eend $? "PLEASE CHECK ${x}"
330 ;;
331 esac
332 done
333 }
334
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