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

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

  ViewVC Help
Powered by ViewVC 1.1.20