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

Diff of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.1.1.1 Revision 1.25
1# Copyright 1999-2005 Gentoo Foundation 1# Copyright 1999-2004 Gentoo Technologies, Inc.
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.1.1.1 2005/11/30 09:59:18 chriswhite Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.25 2004/02/11 19:33:14 azarah Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 6#
7# This eclass patches ltmain.sh distributed with libtoolized packages with the 7# This eclass patches ltmain.sh distributed with libtoolized packages with the
8# relink and portage patch among others 8# relink and portage patch among others
9 9
10ECLASS="libtool"
11INHERITED="${INHERITED} ${ECLASS}"
10 12
11# 2004.09.25 rac 13newdepend "!bootstrap? ( sys-devel/libtool )"
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 14
19DESCRIPTION="Based on the ${ECLASS} eclass" 15DESCRIPTION="Based on the ${ECLASS} eclass"
20 16
21ELIBTOOL_VERSION="2.0.2" 17ELIBTOOL_VERSION="2.0.1"
18
22 19
23ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 20ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
24ELT_APPLIED_PATCHES= 21ELT_APPLIED_PATCHES=
25ELT_LTMAIN_SH=
26 22
27# 23#
28# Returns all the directories containing ltmain.sh 24# Returns all the directories containing ltmain.sh
29# 25#
30ELT_find_ltmain_sh() { 26ELT_find_ltmain_sh() {
31 local x= 27 local x=
32 local dirlist= 28 local dirlist=
33 29
34 for x in $(find "${S}" -name 'ltmain.sh') ; do 30 for x in $(find "${S}" -name 'ltmain.sh')
31 do
35 dirlist="${dirlist} ${x%/*}" 32 dirlist="${dirlist} ${x%/*}"
36 done 33 done
37 34
38 echo "${dirlist}" 35 echo "${dirlist}"
39} 36}
40 37
41# 38#
42# See if we can apply $2 on $1, and if so, do it 39# See if we can apply $2 on $1, and if so, do it
43# 40#
44ELT_try_and_apply_patch() { 41ELT_try_and_apply_patch() {
45 local ret=0 42 local ret=0
46 local file=$1
47 local patch=$2 43 local patch="$2"
48 44
49 # We only support patchlevel of 0 - why worry if its static patches? 45 # We only support patchlevel of 0 - why worry if its static patches?
50 if patch -p0 --dry-run "${file}" < "${patch}" &> "${T}/elibtool.log" ; then 46 if patch -p0 --dry-run $1 < ${patch} &>${T}/elibtool.log
47 then
51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..." 48 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch..."
52 patch -p0 "${file}" < "${patch}" &> "${T}/elibtool.log" 49 patch -p0 $1 < ${patch} &>${T}/elibtool.log
53 ret=$? 50 ret=$?
54 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 51 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
55 else 52 else
56 ret=1 53 ret=1
57 fi 54 fi
58 55
59 return "${ret}" 56 return ${ret}
60}
61
62#
63# Get string version of ltmain.sh or ltconfig (passed as $1)
64#
65ELT_libtool_version() {
66 local ltmain_sh=$1
67 local version=
68
69 version=$(eval $(grep -e '^[[:space:]]*VERSION=' "${ltmain_sh}"); \
70 echo "${VERSION}")
71 [[ -z ${version} ]] && version="0"
72
73 echo "${version}"
74} 57}
75 58
76# 59#
77# Run through the patches in $2 and see if any 60# Run through the patches in $2 and see if any
78# apply to $1 ... 61# apply to $1 ...
79# 62#
80ELT_walk_patches() { 63ELT_walk_patches() {
81 local x= 64 local x=
82 local y= 65 local y=
83 local ret=1 66 local ret=1
84 local file=$1
85 local patch_set=$2
86 local patch_dir= 67 local patch_dir=
87 local rem_int_dep=$3
88 local version=
89 local ltmain_sh=$1
90 68
91 [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH} 69 if [ -n "$2" ]
92 version=$(ELT_libtool_version "${ltmain_sh}") 70 then
93 71 if [ -d "${ELT_PATCH_DIR}/$2" ]
94 if [[ -n ${patch_set} ]] ; then 72 then
95 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
96 patch_dir="${ELT_PATCH_DIR}/${patch_set}" 73 patch_dir="${ELT_PATCH_DIR}/$2"
97 else 74 else
98 return "${ret}" 75 return ${ret}
99 fi 76 fi
100 77
101 if [[ ${version} == "0" ]] ; then
102 eerror "Could not get VERSION for ${file##*/}!"
103 die "Could not get VERSION for ${file##*/}!"
104 fi
105
106 # Go through the patches in reverse order (large to small)
107 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do 78 for x in $(ls -d "${patch_dir}"/* 2>/dev/null)
108 if [[ -n ${x} && -f ${x} ]] ; then 79 do
109 local ltver=$(VER_to_int "${version}") 80 if [ -n "${x}" -a -f "${x}" ]
110 local ptver=$(VER_to_int "${x##*/}") 81 then
111
112 # If libtool version smaller than patch version, skip patch.
113 [[ ${ltver} -lt ${ptver} ]] && continue
114 # For --remove-internal-dep ... 82 # For --remove-internal-dep ...
115 if [[ -n ${rem_int_dep} ]] ; then 83 if [ -n "$3" ]
84 then
116 # For replace @REM_INT_DEP@ with what was passed 85 # For replace @REM_INT_DEP@ with what was passed
117 # to --remove-internal-dep 86 # to --remove-internal-dep
118 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \ 87 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
119 "${T}/$$.rem_int_deps.patch" 88 ${T}/$$.rem_int_deps.patch
120 89
121 x="${T}/$$.rem_int_deps.patch" 90 x="${T}/$$.rem_int_deps.patch"
122 fi 91 fi
123 92
124 if ELT_try_and_apply_patch "${file}" "${x}" ; then 93 if ELT_try_and_apply_patch "$1" "${x}"
94 then
125 ret=0 95 ret=0
126 break 96 break
127 fi 97 fi
128 fi 98 fi
129 done 99 done
130 fi 100 fi
131 101
132 return "${ret}" 102 return ${ret}
133} 103}
134 104
135elibtoolize() { 105elibtoolize() {
136 local x= 106 local x=
137 local y= 107 local y=
138 local do_portage="no" 108 local do_portage="no"
139 local do_reversedeps="no" 109 local do_reversedeps="no"
140 local do_only_patches="no" 110 local do_only_patches="no"
141 local do_uclibc="yes"
142 local deptoremove= 111 local deptoremove=
143 local my_dirlist= 112 local my_dirlist=
144 local elt_patches="portage relink max_cmd_len sed test tmp" 113 local elt_patches="portage relink max_cmd_len sed test tmp"
145 local start_dir=${PWD}
146 114
147 my_dirlist=$(ELT_find_ltmain_sh) 115 my_dirlist="$(ELT_find_ltmain_sh)"
148 116
149 for x in "$@" ; do 117 for x in $*
118 do
150 case "${x}" in 119 case "${x}" in
151 "--portage") 120 "--portage")
152 # Only apply portage patch, and don't 121 # Only apply portage patch, and don't
153 # 'libtoolize --copy --force' if all patches fail. 122 # 'libtoolize --copy --force' if all patches fail.
154 do_portage="yes" 123 do_portage="yes"
164 do_only_patches="yes" 133 do_only_patches="yes"
165 ;; 134 ;;
166 "^--remove-internal-dep="*) 135 "^--remove-internal-dep="*)
167 # We will replace @REM_INT_DEP@ with what is needed 136 # We will replace @REM_INT_DEP@ with what is needed
168 # in ELT_walk_patches() ... 137 # in ELT_walk_patches() ...
169 deptoremove=$(echo "${x}" | sed -e 's|--remove-internal-dep=||') 138 deptoremove="$(echo "${x}" | sed -e 's|--remove-internal-dep=||')"
170 139
171 # Add the patch for this ... 140 # Add the patch for this ...
172 [[ -n ${deptoremove} ]] && elt_patches="${elt_patches} rem-int-dep" 141 [ -n "${deptoremove}" ] && elt_patches="${elt_patches} rem-int-dep"
173 ;; 142 ;;
174 "--shallow") 143 "--shallow")
175 # Only patch the ltmain.sh in ${S} 144 # Only patch the ltmain.sh in ${S}
176 if [[ -f ${S}/ltmain.sh ]] ; then 145 if [ -f "${S}/ltmain.sh" ]
146 then
177 my_dirlist=${S} 147 my_dirlist="${S}"
178 else 148 else
179 my_dirlist= 149 my_dirlist=
180 fi 150 fi
181 ;; 151 ;;
182 "--no-uclibc")
183 do_uclibc="no"
184 ;;
185 *)
186 eerror "Invalid elibtoolize option: ${x}"
187 die "elibtoolize called with ${x} ??"
188 esac 152 esac
189 done 153 done
190 154
191 [[ ${do_uclibc} == "yes" ]] && \
192 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
193
194 [[ ${CHOST} == *"-freebsd"* ]] && \
195 elt_patches="${elt_patches} fbsd-conf"
196
197 if useq ppc-macos ; then
198 local opts
199 [[ -f Makefile.am ]] && opts="--automake"
200 glibtoolize --copy --force ${opts}
201
202 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain"
203 fi
204
205 for x in ${my_dirlist} ; do 155 for x in ${my_dirlist}
156 do
206 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||") 157 local tmp="$(echo "${x}" | sed -e "s|${S}||")"
207 export ELT_APPLIED_PATCHES= 158 export ELT_APPLIED_PATCHES=
208 export ELT_LTMAIN_SH="${x}/ltmain.sh" 159
209
210 [[ -f ${x}/.elibtoolized ]] && continue
211
212 cd ${x} 160 cd ${x}
213 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')" 161 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g')..."
214 162
215 for y in ${elt_patches} ; do 163 for y in ${elt_patches}
164 do
216 local ret=0 165 local ret=0
217 166
218 case "${y}" in 167 case "${y}" in
219 "rem-int-dep") 168 "rem-int-dep")
220 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 169 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
221 ret=$? 170 ret=$?
222 ;; 171 ;;
223 "fix-relink") 172 "fix-relink")
224 # Do not apply if we do not have the relink patch applied ... 173 # Do not apply if we do not have the relink patch applied ...
225 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then 174 if [ -n "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ]
175 then
226 ELT_walk_patches "${x}/ltmain.sh" "${y}" 176 ELT_walk_patches "${x}/ltmain.sh" "${y}"
227 ret=$? 177 ret=$?
228 fi 178 fi
229 ;; 179 ;;
230 "max_cmd_len") 180 "max_cmd_len")
231 # Do not apply if $max_cmd_len is not used ... 181 # Do not apply if $max_cmd_len is not used ...
232 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then 182 if [ -n "$(grep 'max_cmd_len' "${x}/ltmain.sh")" ]
183 then
233 ELT_walk_patches "${x}/ltmain.sh" "${y}" 184 ELT_walk_patches "${x}/ltmain.sh" "${y}"
234 ret=$?
235 fi
236 ;;
237 "uclibc-conf")
238 if [[ -e ${x}/configure && \
239 -n $(grep 'Transform linux' "${x}/configure") ]] ; then
240 ELT_walk_patches "${x}/configure" "${y}"
241 ret=$?
242 # ltmain.sh and co might be in a subdirectory ...
243 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
244 -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
245 ELT_walk_patches "${x}/../configure" "${y}"
246 ret=$?
247 fi
248 ;;
249 "uclibc-ltconf")
250 # Newer libtoolize clears ltconfig, as not used anymore
251 if [[ -s ${x}/ltconfig ]] ; then
252 ELT_walk_patches "${x}/ltconfig" "${y}"
253 ret=$?
254 fi
255 ;;
256 "fbsd-conf")
257 if [[ -e ${x}/configure && \
258 -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
259 ELT_walk_patches "${x}/configure" "${y}"
260 ret=$?
261 # ltmain.sh and co might be in a subdirectory ...
262 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
263 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
264 ELT_walk_patches "${x}/../configure" "${y}"
265 ret=$?
266 fi
267 ;;
268 "darwin-ltconf")
269 # Newer libtoolize clears ltconfig, as not used anymore
270 if [[ -s ${x}/ltconfig ]] ; then
271 ELT_walk_patches "${x}/ltconfig" "${y}"
272 ret=$? 185 ret=$?
273 fi 186 fi
274 ;; 187 ;;
275 *) 188 *)
276 ELT_walk_patches "${x}/ltmain.sh" "${y}" 189 ELT_walk_patches "${x}/ltmain.sh" "${y}"
277 ret=$? 190 ret=$?
278 ;; 191 ;;
279 esac 192 esac
280 193
281 if [[ ${ret} -ne 0 ]] ; then 194 if [ "${ret}" -ne 0 ]
195 then
282 case ${y} in 196 case ${y} in
283 "relink") 197 "relink")
284 local version=$(ELT_libtool_version "${x}/ltmain.sh")
285 # Critical patch, but could be applied ... 198 # Critical patch, but could be applied ...
286 # FIXME: Still need a patch for ltmain.sh > 1.4.0
287 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \ 199 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ]
288 $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then 200 then
289 ewarn " Could not apply relink.patch!" 201 ewarn " Could not apply relink.patch!"
290 fi 202 fi
291 ;; 203 ;;
292 "portage") 204 "portage")
293 # Critical patch - for this one we abort, as it can really 205 # Critical patch - for this one we abort, as it can really
294 # cause breakage without it applied! 206 # cause breakage without it applied!
295 if [[ ${do_portage} == "yes" ]] ; then 207 if [ "${do_portage}" = "yes" ]
208 then
296 # Stupid test to see if its already applied ... 209 # Stupid test to see if its already applied ...
297 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 210 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ]
211 then
298 echo 212 echo
299 eerror "Portage patch requested, but failed to apply!" 213 eerror "Portage patch requested, but failed to apply!"
300 die "Portage patch requested, but failed to apply!" 214 die "Portage patch requested, but failed to apply!"
301 fi 215 fi
302 else 216 else
303 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 217 ewarn " Could not apply portage.patch!"
304 # ewarn " Portage patch seems to be already applied."
305 # ewarn " Please verify that it is not needed." 218 ewarn " Please verify that it is not needed."
306 :
307 else
308 local version=$( \
309 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
310 echo "${VERSION}")
311
312 echo
313 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
314 die "Portage patch failed to apply!"
315 fi
316 # We do not want to run libtoolize ...
317 ELT_APPLIED_PATCHES="portage"
318 fi 219 fi
319 ;;
320 "uclibc-"*)
321 [[ ${CHOST} == *"-uclibc" ]] && \
322 ewarn " uClibc patch set '${y}' failed to apply!"
323 ;;
324 "fbsd-"*)
325 if [[ ${CHOST} == *"-freebsd"* ]] ; then
326 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' "${x}/configure") ]]; then
327 eerror " FreeBSD patch set '${y}' failed to apply!"
328 die "FreeBSD patch set '${y}' failed to apply!"
329 fi
330 fi
331 ;;
332 "darwin-"*)
333 useq ppc-macos && \
334 ewarn " Darwin patch set '${y}' failed to apply!"
335 ;; 220 ;;
336 esac 221 esac
337 fi 222 fi
223
224 if [ -z "${ELT_APPLIED_PATCHES}" ]
225 then
226 if [ "${do_portage}" = "no" -a \
227 "${do_reversedeps}" = "no" -a \
228 "${do_only_patches}" = "no" -a \
229 "${deptoremove}" = "" ]
230 then
231 # Sometimes ltmain.sh is in a subdirectory ...
232 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ]
233 then
234 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ]
235 then
236 cd ${x}/../
237 fi
238 fi
239
240 if which libtoolize &>/dev/null
241 then
242 ewarn "Cannot apply any patch, running libtoolize..."
243 libtoolize --copy --force
244 fi
245 cd ${x}
246 break
247 fi
248 fi
338 done 249 done
339
340 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
341 if [[ ${do_portage} == "no" && \
342 ${do_reversedeps} == "no" && \
343 ${do_only_patches} == "no" && \
344 ${deptoremove} == "" ]]
345 then
346 ewarn "Cannot apply any patches, please file a bug about this"
347 break
348
349 # Sometimes ltmain.sh is in a subdirectory ...
350 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
351 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
352 cd "${x}"/../
353 fi
354 fi
355
356 if type -p libtoolize &> /dev/null ; then
357 ewarn "Cannot apply any patches, running libtoolize..."
358 libtoolize --copy --force
359 fi
360 cd "${x}"
361 break
362 fi
363 fi
364
365 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
366
367 touch "${x}/.elibtoolized"
368 done 250 done
369 251
370 cd "${start_dir}" 252 if [ -f libtool ]
371} 253 then
372 254 rm -f libtool
373uclibctoolize() {
374 ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!"
375 elibtoolize
376}
377
378darwintoolize() {
379 ewarn "darwintoolize() is depreciated, please just use elibtoolize()!"
380 elibtoolize
381}
382
383# char *VER_major(string)
384#
385# Return the Major (X of X.Y.Z) version
386#
387VER_major() {
388 [[ -z $1 ]] && return 1
389
390 local VER=$@
391 echo "${VER%%[^[:digit:]]*}"
392}
393
394# char *VER_minor(string)
395#
396# Return the Minor (Y of X.Y.Z) version
397#
398VER_minor() {
399 [[ -z $1 ]] && return 1
400
401 local VER=$@
402 VER=${VER#*.}
403 echo "${VER%%[^[:digit:]]*}"
404}
405
406# char *VER_micro(string)
407#
408# Return the Micro (Z of X.Y.Z) version.
409#
410VER_micro() {
411 [[ -z $1 ]] && return 1
412
413 local VER=$@
414 VER=${VER#*.*.}
415 echo "${VER%%[^[:digit:]]*}"
416}
417
418# int VER_to_int(string)
419#
420# Convert a string type version (2.4.0) to an int (132096)
421# for easy compairing or versions ...
422#
423VER_to_int() {
424 [[ -z $1 ]] && return 1
425
426 local VER_MAJOR=$(VER_major "$1")
427 local VER_MINOR=$(VER_minor "$1")
428 local VER_MICRO=$(VER_micro "$1")
429 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
430
431 # We make version 1.0.0 the minimum version we will handle as
432 # a sanity check ... if its less, we fail ...
433 if [[ ${VER_int} -ge 65536 ]] ; then
434 echo "${VER_int}"
435 return 0
436 fi 255 fi
437 256
438 echo 1 257 # We need to change the pwd back to $S, as we may be called in
439 return 1 258 # src_compile()
259 cd ${S}
440} 260}
261

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.25

  ViewVC Help
Powered by ViewVC 1.1.20