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

Diff of /eclass/libtool.eclass

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

Revision 1.38 Revision 1.52
1# Copyright 1999-2004 Gentoo Foundation 1# Copyright 1999-2005 Gentoo Foundation
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.38 2004/10/20 14:25:02 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.52 2005/09/02 10:02:50 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}"
12 10
13# 2004.09.25 rac 11# 2004.09.25 rac
14# i have verified that at least one package can use this eclass and 12# i have verified that at least one package can use this eclass and
15# build properly even without libtool installed yet, probably using 13# build properly even without libtool installed yet, probably using
16# the files in the distribution. eliminating this dependency fixes 14# the files in the distribution. eliminating this dependency fixes
17# bug 65209, which is a showstopper for people doing installs using 15# bug 65209, which is a showstopper for people doing installs using
18# stageballs <3. if anybody decides to revert this, please attempt 16# stageballs <3. if anybody decides to revert this, please attempt
19# to find an alternate way of resolving that bug at the same time. 17# to find an alternate way of resolving that bug at the same time.
20 18
21#DEPEND="!bootstrap? ( sys-devel/libtool )"
22
23DESCRIPTION="Based on the ${ECLASS} eclass" 19DESCRIPTION="Based on the ${ECLASS} eclass"
24 20
25ELIBTOOL_VERSION="2.0.1" 21ELIBTOOL_VERSION="2.0.2"
26
27 22
28ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 23ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
29ELT_APPLIED_PATCHES= 24ELT_APPLIED_PATCHES=
30 25
31# 26#
33# 28#
34ELT_find_ltmain_sh() { 29ELT_find_ltmain_sh() {
35 local x= 30 local x=
36 local dirlist= 31 local dirlist=
37 32
38 for x in $(find "${S}" -name 'ltmain.sh') 33 for x in $(find "${S}" -name 'ltmain.sh') ; do
39 do
40 dirlist="${dirlist} ${x%/*}" 34 dirlist="${dirlist} ${x%/*}"
41 done 35 done
42 36
43 echo "${dirlist}" 37 echo "${dirlist}"
44} 38}
49ELT_try_and_apply_patch() { 43ELT_try_and_apply_patch() {
50 local ret=0 44 local ret=0
51 local patch="$2" 45 local patch="$2"
52 46
53 # We only support patchlevel of 0 - why worry if its static patches? 47 # We only support patchlevel of 0 - why worry if its static patches?
54 if patch -p0 --dry-run $1 < ${patch} &>${T}/elibtool.log 48 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
55 then
56 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..." 49 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
57 patch -p0 $1 < ${patch} &>${T}/elibtool.log 50 patch -p0 $1 < ${patch} &>${T}/elibtool.log
58 ret=$? 51 ret=$?
59 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 52 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
60 else 53 else
71ELT_walk_patches() { 64ELT_walk_patches() {
72 local x= 65 local x=
73 local y= 66 local y=
74 local ret=1 67 local ret=1
75 local patch_dir= 68 local patch_dir=
69 local version=$(eval $(grep -e '^[[:space:]]*VERSION=' $1); \
70 echo "${VERSION}")
76 71
77 if [ -n "$2" ] 72 if [[ -n $2 ]] ; then
78 then
79 if [ -d "${ELT_PATCH_DIR}/$2" ] 73 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
80 then
81 patch_dir="${ELT_PATCH_DIR}/$2" 74 patch_dir="${ELT_PATCH_DIR}/$2"
82 else 75 else
83 return ${ret} 76 return ${ret}
84 fi 77 fi
85 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)
86 for x in $(ls -d "${patch_dir}"/* 2>/dev/null) 85 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
87 do 86 if [[ -n ${x} && -f ${x} ]] ; then
88 if [ -n "${x}" -a -f "${x}" ] 87 local ltver=$(VER_to_int "${version}")
89 then 88 local ptver=$(VER_to_int "${x##*/}")
89
90 # If libtool version smaller than patch version, skip patch.
91 [[ ${ltver} -lt ${ptver} ]] && continue
90 # For --remove-internal-dep ... 92 # For --remove-internal-dep ...
91 if [ -n "$3" ] 93 if [[ -n $3 ]] ; then
92 then
93 # For replace @REM_INT_DEP@ with what was passed 94 # For replace @REM_INT_DEP@ with what was passed
94 # to --remove-internal-dep 95 # to --remove-internal-dep
95 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \ 96 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
96 ${T}/$$.rem_int_deps.patch 97 ${T}/$$.rem_int_deps.patch
97 98
98 x="${T}/$$.rem_int_deps.patch" 99 x="${T}/$$.rem_int_deps.patch"
99 fi 100 fi
100 101
101 if ELT_try_and_apply_patch "$1" "${x}" 102 if ELT_try_and_apply_patch "$1" "${x}" ; then
102 then
103 ret=0 103 ret=0
104 break 104 break
105 fi 105 fi
106 fi 106 fi
107 done 107 done
121 local elt_patches="portage relink max_cmd_len sed test tmp" 121 local elt_patches="portage relink max_cmd_len sed test tmp"
122 local start_dir="${PWD}" 122 local start_dir="${PWD}"
123 123
124 my_dirlist="$(ELT_find_ltmain_sh)" 124 my_dirlist="$(ELT_find_ltmain_sh)"
125 125
126 for x in "$@" 126 for x in "$@" ; do
127 do
128 case "${x}" in 127 case "${x}" in
129 "--portage") 128 "--portage")
130 # Only apply portage patch, and don't 129 # Only apply portage patch, and don't
131 # 'libtoolize --copy --force' if all patches fail. 130 # 'libtoolize --copy --force' if all patches fail.
132 do_portage="yes" 131 do_portage="yes"
156 my_dirlist="${S}" 155 my_dirlist="${S}"
157 else 156 else
158 my_dirlist= 157 my_dirlist=
159 fi 158 fi
160 ;; 159 ;;
160 "--no-uclibc")
161 NO_UCLIBCTOOLIZE=1
162 ;;
163 *)
164 eerror "Invalid elibtoolize option: $x"
165 die "elibtoolize called with $x ??"
161 esac 166 esac
162 done 167 done
163 168
164 if use ppc-macos ; then 169 if use ppc-macos ; then
170 local opts
171 [[ -f Makefile.am ]] && opts="--automake"
165 glibtoolize --copy --force 172 glibtoolize --copy --force ${opts}
166 darwintoolize 173 darwintoolize
167 fi 174 fi
168 175
169 for x in ${my_dirlist} 176 for x in ${my_dirlist} ; do
170 do
171 local tmp="$(echo "${x}" | sed -e "s|${S}||")" 177 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
172 export ELT_APPLIED_PATCHES= 178 export ELT_APPLIED_PATCHES=
173 179
180 [[ -f ${x}/.elibtoolized ]] && continue
181
174 cd ${x} 182 cd ${x}
175 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..." 183 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
176 184
177 for y in ${elt_patches} 185 for y in ${elt_patches} ; do
178 do
179 local ret=0 186 local ret=0
180 187
181 case "${y}" in 188 case "${y}" in
182 "rem-int-dep") 189 "rem-int-dep")
183 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 190 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
184 ret=$? 191 ret=$?
185 ;; 192 ;;
186 "fix-relink") 193 "fix-relink")
187 # Do not apply if we do not have the relink patch applied ... 194 # Do not apply if we do not have the relink patch applied ...
188 if [ -n "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 195 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
189 then
190 ELT_walk_patches "${x}/ltmain.sh" "${y}" 196 ELT_walk_patches "${x}/ltmain.sh" "${y}"
191 ret=$? 197 ret=$?
192 fi 198 fi
193 ;; 199 ;;
194 "max_cmd_len") 200 "max_cmd_len")
195 # Do not apply if $max_cmd_len is not used ... 201 # Do not apply if $max_cmd_len is not used ...
196 if [ -n "$(grep 'max_cmd_len' "${x}/ltmain.sh")" ] 202 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
197 then
198 ELT_walk_patches "${x}/ltmain.sh" "${y}" 203 ELT_walk_patches "${x}/ltmain.sh" "${y}"
199 ret=$? 204 ret=$?
200 fi 205 fi
201 ;; 206 ;;
202 *) 207 *)
203 ELT_walk_patches "${x}/ltmain.sh" "${y}" 208 ELT_walk_patches "${x}/ltmain.sh" "${y}"
204 ret=$? 209 ret=$?
205 ;; 210 ;;
206 esac 211 esac
207 212
208 if [ "${ret}" -ne 0 ] 213 if [[ ${ret} -ne 0 ]] ; then
209 then
210 case ${y} in 214 case ${y} in
211 "relink") 215 "relink")
212 # Critical patch, but could be applied ... 216 # Critical patch, but could be applied ...
213 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 217 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
214 then
215 ewarn " Could not apply relink.patch!" 218 ewarn " Could not apply relink.patch!"
216 fi 219 fi
217 ;; 220 ;;
218 "portage") 221 "portage")
219 # Critical patch - for this one we abort, as it can really 222 # Critical patch - for this one we abort, as it can really
220 # cause breakage without it applied! 223 # cause breakage without it applied!
221 if [ "${do_portage}" = "yes" ] 224 if [[ ${do_portage} == "yes" ]] ; then
222 then
223 # Stupid test to see if its already applied ... 225 # Stupid test to see if its already applied ...
224 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ] 226 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
225 then
226 echo 227 echo
227 eerror "Portage patch requested, but failed to apply!" 228 eerror "Portage patch requested, but failed to apply!"
228 die "Portage patch requested, but failed to apply!" 229 die "Portage patch requested, but failed to apply!"
229 fi 230 fi
230 else 231 else
231 ewarn " Could not apply portage.patch!" 232 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
233 # ewarn " Portage patch seems to be already applied."
232 ewarn " Please verify that it is not needed." 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"
233 fi 247 fi
234 ;; 248 ;;
235 esac 249 esac
236 fi 250 fi
251 done
237 252
238 if [ -z "${ELT_APPLIED_PATCHES}" ] 253 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
254 if [[ ${do_portage} == "no" && \
255 ${do_reversedeps} == "no" && \
256 ${do_only_patches} == "no" && \
257 ${deptoremove} == "" ]]
239 then 258 then
240 if [ "${do_portage}" = "no" -a \ 259 ewarn "Cannot apply any patches, please file a bug about this"
241 "${do_reversedeps}" = "no" -a \ 260 break
242 "${do_only_patches}" = "no" -a \ 261
243 "${deptoremove}" = "" ]
244 then
245 # Sometimes ltmain.sh is in a subdirectory ... 262 # Sometimes ltmain.sh is in a subdirectory ...
246 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ] 263 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
247 then
248 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ] 264 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
249 then
250 cd ${x}/../ 265 cd "${x}"/../
251 fi
252 fi 266 fi
253
254 if which libtoolize &>/dev/null
255 then
256 ewarn "Cannot apply any patch, running libtoolize..."
257 libtoolize --copy --force
258 fi
259 cd ${x}
260 break
261 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
262 fi 275 fi
263 done 276 fi
277
278 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
279
280 touch "${x}/.elibtoolized"
264 done 281 done
265 282
266 if [ -f libtool ]
267 then
268 rm -f libtool
269 fi
270
271 cd "${start_dir}" 283 cd "${start_dir}"
272 284
273 uclibctoolize 285 uclibctoolize
274} 286}
275 287
276uclibctoolize() { 288uclibctoolize() {
277 [ -e "${WORKDIR}/.uclibcpatched" ] && return 0 289 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
278 290
291 local errmsg=""
292 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
293 && errmsg="PLEASE CHECK" \
294 || errmsg="Already patched"
279 local targets="" 295 local targets=""
280 local x 296 local x
281 297
282 if [ -z "$@" ] ; then 298 if [[ -z $* ]] ; then
283 targets="$(find ${S} -name configure -o -name ltconfig)" 299 targets=$(find ${S} -name configure -o -name ltconfig)
284 fi 300 fi
285 301
286 einfo "Applying uClibc/libtool patches ..." 302 einfo "Applying uClibc/libtool patches ..."
287 for x in ${targets} ; do 303 for x in ${targets} ; do
288 [ ! -s "${x}" ] && continue 304 [[ ! -s ${x} ]] && continue
289 case $(basename "${x}") in 305 case ${x##*/} in
290 configure) 306 configure)
291 if grep 'Transform linux' "${x}" >/dev/null ; then 307 if grep 'Transform linux' "${x}" > /dev/null ; then
292 ebegin " Fixing \${S}${x/${S}}" 308 ebegin " Fixing \${S}${x/${S}}"
293 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null 309 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
294 eend $? "PLEASE CHECK ${x}" 310 eend $? "${errmsg} ${x}"
295 fi 311 fi
296 ;; 312 ;;
297 313
298 ltconfig) 314 ltconfig)
299 local ver="$(grep '^VERSION=' ${x})" 315 local ver=$(grep '^VERSION=' ${x})
300 ver="${ver/VERSION=}" 316 ver=${ver/VERSION=}
301 [ "${ver:0:3}" == "1.4" ] && ver="1.3" # 1.4 and 1.3 are compat 317 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
302 ebegin " Fixing \${S}${x/${S}}" 318 ebegin " Fixing \${S}${x/${S}}"
303 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null 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
326darwintoolize() {
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
304 eend $? "PLEASE CHECK ${x}" 347 eend $? "PLEASE CHECK ${x}"
305 ;; 348 ;;
306 esac 349 esac
307 done 350 done
308} 351}
309 352
310darwintoolize() { 353# char *VER_major(string)
311 local targets="" 354#
312 local x 355# Return the Major (X of X.Y.Z) version
356#
357VER_major() {
358 [[ -z $1 ]] && return 1
313 359
314 if [ -z "$@" ] ; then 360 local VER=$@
315 targets="$(find ${S} -name ltmain.sh -o -name ltconfig)" 361 echo ${VER%%[^[:digit:]]*}
316 fi 362}
317 363
318 einfo "Applying Darwin/libtool patches ..." 364# char *VER_minor(string)
319 for x in ${targets} ; do 365#
320 [ ! -s "${x}" ] && continue 366# Return the Minor (Y of X.Y.Z) version
321 case $(basename "${x}") in 367#
322 ltmain.sh|ltconfig) 368VER_minor() {
323 local ver="$(grep '^VERSION=' ${x})" 369 [[ -z $1 ]] && return 1
324 ver="${ver/VERSION=}" 370
325 if [ "${ver:0:3}" == "1.4" -o "${ver:0:3}" == "1.5" ]; 371 local VER=$@
326 then 372 VER=${VER#*.}
327 ver="1.3" # 1.4, 1.5 and 1.3 are compat 373 echo ${VER%%[^[:digit:]]*}
374}
375
376# char *VER_micro(string)
377#
378# Return the Micro (Z of X.Y.Z) version.
379#
380VER_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#
393VER_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
328 fi 406 fi
329 407
330 ebegin " Fixing \${S}${x/${S}}" 408 echo 1
331 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/$(basename "${x}")-${ver:0:3}.patch" > /dev/null 409 return 1
332 eend $? "PLEASE CHECK ${x}"
333 ;;
334 esac
335 done
336} 410}

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.52

  ViewVC Help
Powered by ViewVC 1.1.20