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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.40  
changed lines
  Added in v.1.55

  ViewVC Help
Powered by ViewVC 1.1.20