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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.52 - (show annotations) (download)
Fri Sep 2 10:02:50 2005 UTC (8 years, 11 months ago) by azarah
Branch: MAIN
Changes since 1.51: +28 -26 lines
Do not run elibtoolize again if already run.  The check for no patches applied was in the wrong for loop.

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.51 2005/09/02 09:35:17 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
11 # 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 DESCRIPTION="Based on the ${ECLASS} eclass"
20
21 ELIBTOOL_VERSION="2.0.2"
22
23 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 for x in $(find "${S}" -name 'ltmain.sh') ; do
34 dirlist="${dirlist} ${x%/*}"
35 done
36
37 echo "${dirlist}"
38 }
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 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
49 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
50 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 local version=$(eval $(grep -e '^[[:space:]]*VERSION=' $1); \
70 echo "${VERSION}")
71
72 if [[ -n $2 ]] ; then
73 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
74 patch_dir="${ELT_PATCH_DIR}/$2"
75 else
76 return ${ret}
77 fi
78
79 if [[ -z ${version} ]] ; then
80 eerror "Could not get VERSION for ${1##*/}!"
81 die "Could not get VERSION for ${1##*/}!"
82 fi
83
84 # 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
90 # 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
99 x="${T}/$$.rem_int_deps.patch"
100 fi
101
102 if ELT_try_and_apply_patch "$1" "${x}" ; then
103 ret=0
104 break
105 fi
106 fi
107 done
108 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 local elt_patches="portage relink max_cmd_len sed test tmp"
122 local start_dir="${PWD}"
123
124 my_dirlist="$(ELT_find_ltmain_sh)"
125
126 for x in "$@" ; do
127 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 "--no-uclibc")
161 NO_UCLIBCTOOLIZE=1
162 ;;
163 *)
164 eerror "Invalid elibtoolize option: $x"
165 die "elibtoolize called with $x ??"
166 esac
167 done
168
169 if use ppc-macos ; then
170 local opts
171 [[ -f Makefile.am ]] && opts="--automake"
172 glibtoolize --copy --force ${opts}
173 darwintoolize
174 fi
175
176 for x in ${my_dirlist} ; do
177 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
178 export ELT_APPLIED_PATCHES=
179
180 [[ -f ${x}/.elibtoolized ]] && continue
181
182 cd ${x}
183 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
184
185 for y in ${elt_patches} ; do
186 local ret=0
187
188 case "${y}" in
189 "rem-int-dep")
190 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
191 ret=$?
192 ;;
193 "fix-relink")
194 # Do not apply if we do not have the relink patch applied ...
195 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
196 ELT_walk_patches "${x}/ltmain.sh" "${y}"
197 ret=$?
198 fi
199 ;;
200 "max_cmd_len")
201 # Do not apply if $max_cmd_len is not used ...
202 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
203 ELT_walk_patches "${x}/ltmain.sh" "${y}"
204 ret=$?
205 fi
206 ;;
207 *)
208 ELT_walk_patches "${x}/ltmain.sh" "${y}"
209 ret=$?
210 ;;
211 esac
212
213 if [[ ${ret} -ne 0 ]] ; then
214 case ${y} in
215 "relink")
216 # Critical patch, but could be applied ...
217 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
218 ewarn " Could not apply relink.patch!"
219 fi
220 ;;
221 "portage")
222 # Critical patch - for this one we abort, as it can really
223 # cause breakage without it applied!
224 if [[ ${do_portage} == "yes" ]] ; then
225 # Stupid test to see if its already applied ...
226 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
227 echo
228 eerror "Portage patch requested, but failed to apply!"
229 die "Portage patch requested, but failed to apply!"
230 fi
231 else
232 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
233 # ewarn " Portage patch seems to be already applied."
234 # ewarn " Please verify that it is not needed."
235 :
236 else
237 local version=$( \
238 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
239 echo "${VERSION}")
240
241 echo
242 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
243 die "Portage patch failed to apply!"
244 fi
245 # We do not want to run libtoolize ...
246 ELT_APPLIED_PATCHES="portage"
247 fi
248 ;;
249 esac
250 fi
251 done
252
253 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
254 if [[ ${do_portage} == "no" && \
255 ${do_reversedeps} == "no" && \
256 ${do_only_patches} == "no" && \
257 ${deptoremove} == "" ]]
258 then
259 ewarn "Cannot apply any patches, please file a bug about this"
260 break
261
262 # Sometimes ltmain.sh is in a subdirectory ...
263 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
264 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
265 cd "${x}"/../
266 fi
267 fi
268
269 if type -p libtoolize &> /dev/null ; then
270 ewarn "Cannot apply any patches, running libtoolize..."
271 libtoolize --copy --force
272 fi
273 cd "${x}"
274 break
275 fi
276 fi
277
278 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
279
280 touch "${x}/.elibtoolized"
281 done
282
283 cd "${start_dir}"
284
285 uclibctoolize
286 }
287
288 uclibctoolize() {
289 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
290
291 local errmsg=""
292 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
293 && errmsg="PLEASE CHECK" \
294 || errmsg="Already patched"
295 local targets=""
296 local x
297
298 if [[ -z $* ]] ; then
299 targets=$(find ${S} -name configure -o -name ltconfig)
300 fi
301
302 einfo "Applying uClibc/libtool patches ..."
303 for x in ${targets} ; do
304 [[ ! -s ${x} ]] && continue
305 case ${x##*/} in
306 configure)
307 if grep 'Transform linux' "${x}" > /dev/null ; then
308 ebegin " Fixing \${S}${x/${S}}"
309 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
310 eend $? "${errmsg} ${x}"
311 fi
312 ;;
313
314 ltconfig)
315 local ver=$(grep '^VERSION=' ${x})
316 ver=${ver/VERSION=}
317 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
318 ebegin " Fixing \${S}${x/${S}}"
319 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
320 eend $? "${errmsg} ${x}"
321 ;;
322 esac
323 done
324 }
325
326 darwintoolize() {
327 local targets=""
328 local x
329
330 if [[ -z $* ]] ; then
331 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
332 fi
333
334 einfo "Applying Darwin/libtool patches ..."
335 for x in ${targets} ; do
336 [[ ! -s ${x} ]] && continue
337 case ${x##*/} in
338 ltmain.sh|ltconfig)
339 local ver=$(grep '^VERSION=' ${x})
340 ver=${ver/VERSION=}
341 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
342 ver="1.3" # 1.4, 1.5 and 1.3 are compat
343 fi
344
345 ebegin " Fixing \${S}${x/${S}}"
346 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
347 eend $? "PLEASE CHECK ${x}"
348 ;;
349 esac
350 done
351 }
352
353 # char *VER_major(string)
354 #
355 # Return the Major (X of X.Y.Z) version
356 #
357 VER_major() {
358 [[ -z $1 ]] && return 1
359
360 local VER=$@
361 echo ${VER%%[^[:digit:]]*}
362 }
363
364 # char *VER_minor(string)
365 #
366 # Return the Minor (Y of X.Y.Z) version
367 #
368 VER_minor() {
369 [[ -z $1 ]] && return 1
370
371 local VER=$@
372 VER=${VER#*.}
373 echo ${VER%%[^[:digit:]]*}
374 }
375
376 # char *VER_micro(string)
377 #
378 # Return the Micro (Z of X.Y.Z) version.
379 #
380 VER_micro() {
381 [[ -z $1 ]] && return 1
382
383 local VER=$@
384 VER=${VER#*.*.}
385 echo ${VER%%[^[:digit:]]*}
386 }
387
388 # int VER_to_int(string)
389 #
390 # Convert a string type version (2.4.0) to an int (132096)
391 # for easy compairing or versions ...
392 #
393 VER_to_int() {
394 [[ -z $1 ]] && return 1
395
396 local VER_MAJOR=$(VER_major "$1")
397 local VER_MINOR=$(VER_minor "$1")
398 local VER_MICRO=$(VER_micro "$1")
399 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
400
401 # We make version 1.0.0 the minimum version we will handle as
402 # a sanity check ... if its less, we fail ...
403 if [[ ${VER_int} -ge 65536 ]] ; then
404 echo "${VER_int}"
405 return 0
406 fi
407
408 echo 1
409 return 1
410 }

  ViewVC Help
Powered by ViewVC 1.1.20