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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.43  
changed lines
  Added in v.1.58

  ViewVC Help
Powered by ViewVC 1.1.20