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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.59

  ViewVC Help
Powered by ViewVC 1.1.20