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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.45 - (show annotations) (download)
Wed May 11 11:10:31 2005 UTC (9 years, 7 months ago) by azarah
Branch: MAIN
Changes since 1.44: +11 -3 lines
Do not run libtoolize if portage patch already applied.

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.44 2005/03/23 18:03:21 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 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
231 ewarn " Portage patch seems to be already applied."
232 ewarn " Please verify that it is not needed."
233 else
234 echo
235 eerror "Portage patch failed to apply!"
236 die "Portage patch failed to apply!"
237 fi
238 # We do not want to run libtoolize ...
239 ELT_APPLIED_PATCHES="portage"
240 fi
241 ;;
242 esac
243 fi
244
245 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
246 if [[ ${do_portage} == "no" && \
247 ${do_reversedeps} == "no" && \
248 ${do_only_patches} == "no" && \
249 ${deptoremove} == "" ]]
250 then
251 # Sometimes ltmain.sh is in a subdirectory ...
252 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
253 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
254 cd "${x}"/../
255 fi
256 fi
257
258 if type -p libtoolize &> /dev/null ; then
259 ewarn "Cannot apply any patch, running libtoolize..."
260 libtoolize --copy --force
261 fi
262 cd "${x}"
263 break
264 fi
265 fi
266 done
267 done
268
269 if [[ -f libtool ]] ; then
270 rm -f libtool
271 fi
272
273 cd "${start_dir}"
274
275 uclibctoolize
276 }
277
278 uclibctoolize() {
279 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
280
281 local errmsg=""
282 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
283 && errmsg="PLEASE CHECK" \
284 || errmsg="Already patched"
285 local targets=""
286 local x
287
288 if [[ -z $* ]] ; then
289 targets=$(find ${S} -name configure -o -name ltconfig)
290 fi
291
292 einfo "Applying uClibc/libtool patches ..."
293 for x in ${targets} ; do
294 [[ ! -s ${x} ]] && continue
295 case ${x##*/} in
296 configure)
297 if grep 'Transform linux' "${x}" > /dev/null ; then
298 ebegin " Fixing \${S}${x/${S}}"
299 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
300 eend $? "${errmsg} ${x}"
301 fi
302 ;;
303
304 ltconfig)
305 local ver=$(grep '^VERSION=' ${x})
306 ver=${ver/VERSION=}
307 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
308 ebegin " Fixing \${S}${x/${S}}"
309 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
310 eend $? "${errmsg} ${x}"
311 ;;
312 esac
313 done
314 }
315
316 darwintoolize() {
317 local targets=""
318 local x
319
320 if [[ -z $* ]] ; then
321 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
322 fi
323
324 einfo "Applying Darwin/libtool patches ..."
325 for x in ${targets} ; do
326 [[ ! -s ${x} ]] && continue
327 case ${x##*/} in
328 ltmain.sh|ltconfig)
329 local ver=$(grep '^VERSION=' ${x})
330 ver=${ver/VERSION=}
331 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
332 ver="1.3" # 1.4, 1.5 and 1.3 are compat
333 fi
334
335 ebegin " Fixing \${S}${x/${S}}"
336 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
337 eend $? "PLEASE CHECK ${x}"
338 ;;
339 esac
340 done
341 }
342
343 # char *VER_major(string)
344 #
345 # Return the Major (X of X.Y.Z) version
346 #
347 VER_major() {
348 [[ -z $1 ]] && return 1
349
350 local VER=$@
351 echo ${VER%%[^[:digit:]]*}
352 }
353
354 # char *VER_minor(string)
355 #
356 # Return the Minor (Y of X.Y.Z) version
357 #
358 VER_minor() {
359 [[ -z $1 ]] && return 1
360
361 local VER=$@
362 VER=${VER#*.}
363 echo ${VER%%[^[:digit:]]*}
364 }
365
366 # char *VER_micro(string)
367 #
368 # Return the Micro (Z of X.Y.Z) version.
369 #
370 VER_micro() {
371 [[ -z $1 ]] && return 1
372
373 local VER=$@
374 VER=${VER#*.*.}
375 echo ${VER%%[^[:digit:]]*}
376 }
377
378 # int VER_to_int(string)
379 #
380 # Convert a string type version (2.4.0) to an int (132096)
381 # for easy compairing or versions ...
382 #
383 VER_to_int() {
384 [[ -z $1 ]] && return 1
385
386 local VER_MAJOR=$(VER_major "$1")
387 local VER_MINOR=$(VER_minor "$1")
388 local VER_MICRO=$(VER_micro "$1")
389 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
390
391 # We make version 1.0.0 the minimum version we will handle as
392 # a sanity check ... if its less, we fail ...
393 if [[ ${VER_int} -ge 65536 ]] ; then
394 echo "${VER_int}"
395 return 0
396 fi
397
398 echo 1
399 return 1
400 }

  ViewVC Help
Powered by ViewVC 1.1.20