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

Diff of /eclass/libtool.eclass

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

Revision 1.25 Revision 1.58
1# Copyright 1999-2004 Gentoo Technologies, Inc. 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.25 2004/02/11 19:33:14 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
13newdepend "!bootstrap? ( sys-devel/libtool )" 11# 2004.09.25 rac
12# i have verified that at least one package can use this eclass and
13# build properly even without libtool installed yet, probably using
14# the files in the distribution. eliminating this dependency fixes
15# bug 65209, which is a showstopper for people doing installs using
16# stageballs <3. if anybody decides to revert this, please attempt
17# to find an alternate way of resolving that bug at the same time.
14 18
15DESCRIPTION="Based on the ${ECLASS} eclass" 19DESCRIPTION="Based on the ${ECLASS} eclass"
16 20
17ELIBTOOL_VERSION="2.0.1" 21ELIBTOOL_VERSION="2.0.2"
18
19 22
20ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 23ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
21ELT_APPLIED_PATCHES= 24ELT_APPLIED_PATCHES=
25ELT_LTMAIN_SH=
22 26
23# 27#
24# Returns all the directories containing ltmain.sh 28# Returns all the directories containing ltmain.sh
25# 29#
26ELT_find_ltmain_sh() { 30ELT_find_ltmain_sh() {
27 local x= 31 local x=
28 local dirlist= 32 local dirlist=
29 33
30 for x in $(find "${S}" -name 'ltmain.sh') 34 for x in $(find "${S}" -name 'ltmain.sh') ; do
31 do
32 dirlist="${dirlist} ${x%/*}" 35 dirlist="${dirlist} ${x%/*}"
33 done 36 done
34 37
35 echo "${dirlist}" 38 echo "${dirlist}"
36} 39}
37 40
38# 41#
39# 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
40# 43#
41ELT_try_and_apply_patch() { 44ELT_try_and_apply_patch() {
42 local ret=0 45 local ret=0
46 local file=$1
43 local patch="$2" 47 local patch=$2
44 48
45 # 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?
46 if patch -p0 --dry-run $1 < ${patch} &>${T}/elibtool.log 50 if patch -p0 --dry-run "${file}" < "${patch}" &> "${T}/elibtool.log" ; then
47 then
48 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch..." 51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
49 patch -p0 $1 < ${patch} &>${T}/elibtool.log 52 patch -p0 "${file}" < "${patch}" &> "${T}/elibtool.log"
50 ret=$? 53 ret=$?
51 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 54 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
52 else 55 else
53 ret=1 56 ret=1
54 fi 57 fi
55 58
56 return ${ret} 59 return "${ret}"
57} 60}
58 61
59# 62#
60# Run through the patches in $2 and see if any 63# Run through the patches in $2 and see if any
61# apply to $1 ... 64# apply to $1 ...
62# 65#
63ELT_walk_patches() { 66ELT_walk_patches() {
64 local x= 67 local x=
65 local y= 68 local y=
66 local ret=1 69 local ret=1
70 local file=$1
71 local patch_set=$2
67 local patch_dir= 72 local patch_dir=
73 local rem_int_dep=$3
74 local version=
75 local ltmain_sh=$1
68 76
69 if [ -n "$2" ] 77 [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH}
70 then 78 version=$(eval $(grep -e '^[[:space:]]*VERSION=' "${ltmain_sh}"); \
71 if [ -d "${ELT_PATCH_DIR}/$2" ] 79 echo "${VERSION}")
72 then 80
81 if [[ -n ${patch_set} ]] ; then
82 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
73 patch_dir="${ELT_PATCH_DIR}/$2" 83 patch_dir="${ELT_PATCH_DIR}/${patch_set}"
74 else 84 else
75 return ${ret} 85 return "${ret}"
76 fi 86 fi
77 87
88 if [[ -z ${version} ]] ; then
89 eerror "Could not get VERSION for ${file##*/}!"
90 die "Could not get VERSION for ${file##*/}!"
91 fi
92
93 # Go through the patches in reverse order (large to small)
78 for x in $(ls -d "${patch_dir}"/* 2>/dev/null) 94 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
79 do 95 if [[ -n ${x} && -f ${x} ]] ; then
80 if [ -n "${x}" -a -f "${x}" ] 96 local ltver=$(VER_to_int "${version}")
81 then 97 local ptver=$(VER_to_int "${x##*/}")
98
99 # If libtool version smaller than patch version, skip patch.
100 [[ ${ltver} -lt ${ptver} ]] && continue
82 # For --remove-internal-dep ... 101 # For --remove-internal-dep ...
83 if [ -n "$3" ] 102 if [[ -n ${rem_int_dep} ]] ; then
84 then
85 # For replace @REM_INT_DEP@ with what was passed 103 # For replace @REM_INT_DEP@ with what was passed
86 # to --remove-internal-dep 104 # to --remove-internal-dep
87 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \ 105 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
88 ${T}/$$.rem_int_deps.patch 106 "${T}/$$.rem_int_deps.patch"
89 107
90 x="${T}/$$.rem_int_deps.patch" 108 x="${T}/$$.rem_int_deps.patch"
91 fi 109 fi
92 110
93 if ELT_try_and_apply_patch "$1" "${x}" 111 if ELT_try_and_apply_patch "${file}" "${x}" ; then
94 then
95 ret=0 112 ret=0
96 break 113 break
97 fi 114 fi
98 fi 115 fi
99 done 116 done
100 fi 117 fi
101 118
102 return ${ret} 119 return "${ret}"
103} 120}
104 121
105elibtoolize() { 122elibtoolize() {
106 local x= 123 local x=
107 local y= 124 local y=
108 local do_portage="no" 125 local do_portage="no"
109 local do_reversedeps="no" 126 local do_reversedeps="no"
110 local do_only_patches="no" 127 local do_only_patches="no"
128 local do_uclibc="yes"
111 local deptoremove= 129 local deptoremove=
112 local my_dirlist= 130 local my_dirlist=
113 local elt_patches="portage relink max_cmd_len sed test tmp" 131 local elt_patches="portage relink max_cmd_len sed test tmp"
132 local start_dir=${PWD}
114 133
115 my_dirlist="$(ELT_find_ltmain_sh)" 134 my_dirlist=$(ELT_find_ltmain_sh)
116 135
117 for x in $* 136 for x in "$@" ; do
118 do
119 case "${x}" in 137 case "${x}" in
120 "--portage") 138 "--portage")
121 # Only apply portage patch, and don't 139 # Only apply portage patch, and don't
122 # 'libtoolize --copy --force' if all patches fail. 140 # 'libtoolize --copy --force' if all patches fail.
123 do_portage="yes" 141 do_portage="yes"
133 do_only_patches="yes" 151 do_only_patches="yes"
134 ;; 152 ;;
135 "^--remove-internal-dep="*) 153 "^--remove-internal-dep="*)
136 # We will replace @REM_INT_DEP@ with what is needed 154 # We will replace @REM_INT_DEP@ with what is needed
137 # in ELT_walk_patches() ... 155 # in ELT_walk_patches() ...
138 deptoremove="$(echo "${x}" | sed -e 's|--remove-internal-dep=||')" 156 deptoremove=$(echo "${x}" | sed -e 's|--remove-internal-dep=||')
139 157
140 # Add the patch for this ... 158 # Add the patch for this ...
141 [ -n "${deptoremove}" ] && elt_patches="${elt_patches} rem-int-dep" 159 [[ -n ${deptoremove} ]] && elt_patches="${elt_patches} rem-int-dep"
142 ;; 160 ;;
143 "--shallow") 161 "--shallow")
144 # Only patch the ltmain.sh in ${S} 162 # Only patch the ltmain.sh in ${S}
145 if [ -f "${S}/ltmain.sh" ] 163 if [[ -f ${S}/ltmain.sh ]] ; then
146 then
147 my_dirlist="${S}" 164 my_dirlist=${S}
148 else 165 else
149 my_dirlist= 166 my_dirlist=
150 fi 167 fi
151 ;; 168 ;;
169 "--no-uclibc")
170 do_uclibc="no"
171 ;;
172 *)
173 eerror "Invalid elibtoolize option: ${x}"
174 die "elibtoolize called with ${x} ??"
152 esac 175 esac
153 done 176 done
154 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
184 if use ppc-macos ; then
185 local opts
186 [[ -f Makefile.am ]] && opts="--automake"
187 glibtoolize --copy --force ${opts}
188 darwintoolize
189 fi
190
155 for x in ${my_dirlist} 191 for x in ${my_dirlist} ; do
156 do
157 local tmp="$(echo "${x}" | sed -e "s|${S}||")" 192 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
158 export ELT_APPLIED_PATCHES= 193 export ELT_APPLIED_PATCHES=
159 194 export ELT_LTMAIN_SH="${x}/ltmain.sh"
195
196 [[ -f ${x}/.elibtoolized ]] && continue
197
160 cd ${x} 198 cd ${x}
161 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g')..." 199 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
162 200
163 for y in ${elt_patches} 201 for y in ${elt_patches} ; do
164 do
165 local ret=0 202 local ret=0
166 203
167 case "${y}" in 204 case "${y}" in
168 "rem-int-dep") 205 "rem-int-dep")
169 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 206 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
170 ret=$? 207 ret=$?
171 ;; 208 ;;
172 "fix-relink") 209 "fix-relink")
173 # Do not apply if we do not have the relink patch applied ... 210 # Do not apply if we do not have the relink patch applied ...
174 if [ -n "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 211 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
175 then
176 ELT_walk_patches "${x}/ltmain.sh" "${y}" 212 ELT_walk_patches "${x}/ltmain.sh" "${y}"
177 ret=$? 213 ret=$?
178 fi 214 fi
179 ;; 215 ;;
180 "max_cmd_len") 216 "max_cmd_len")
181 # Do not apply if $max_cmd_len is not used ... 217 # Do not apply if $max_cmd_len is not used ...
182 if [ -n "$(grep 'max_cmd_len' "${x}/ltmain.sh")" ] 218 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
183 then
184 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}"
185 ret=$? 250 ret=$?
186 fi 251 fi
187 ;; 252 ;;
188 *) 253 *)
189 ELT_walk_patches "${x}/ltmain.sh" "${y}" 254 ELT_walk_patches "${x}/ltmain.sh" "${y}"
190 ret=$? 255 ret=$?
191 ;; 256 ;;
192 esac 257 esac
193 258
194 if [ "${ret}" -ne 0 ] 259 if [[ ${ret} -ne 0 ]] ; then
195 then
196 case ${y} in 260 case ${y} in
197 "relink") 261 "relink")
198 # Critical patch, but could be applied ... 262 # Critical patch, but could be applied ...
199 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 263 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
200 then
201 ewarn " Could not apply relink.patch!" 264 ewarn " Could not apply relink.patch!"
202 fi 265 fi
203 ;; 266 ;;
204 "portage") 267 "portage")
205 # Critical patch - for this one we abort, as it can really 268 # Critical patch - for this one we abort, as it can really
206 # cause breakage without it applied! 269 # cause breakage without it applied!
207 if [ "${do_portage}" = "yes" ] 270 if [[ ${do_portage} == "yes" ]] ; then
208 then
209 # Stupid test to see if its already applied ... 271 # Stupid test to see if its already applied ...
210 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ] 272 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
211 then
212 echo 273 echo
213 eerror "Portage patch requested, but failed to apply!" 274 eerror "Portage patch requested, but failed to apply!"
214 die "Portage patch requested, but failed to apply!" 275 die "Portage patch requested, but failed to apply!"
215 fi 276 fi
216 else 277 else
217 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."
218 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"
219 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!"
220 ;; 303 ;;
221 esac 304 esac
222 fi 305 fi
306 done
223 307
224 if [ -z "${ELT_APPLIED_PATCHES}" ] 308 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
309 if [[ ${do_portage} == "no" && \
310 ${do_reversedeps} == "no" && \
311 ${do_only_patches} == "no" && \
312 ${deptoremove} == "" ]]
225 then 313 then
226 if [ "${do_portage}" = "no" -a \ 314 ewarn "Cannot apply any patches, please file a bug about this"
227 "${do_reversedeps}" = "no" -a \ 315 break
228 "${do_only_patches}" = "no" -a \ 316
229 "${deptoremove}" = "" ]
230 then
231 # Sometimes ltmain.sh is in a subdirectory ... 317 # Sometimes ltmain.sh is in a subdirectory ...
232 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ] 318 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
233 then
234 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ] 319 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
235 then
236 cd ${x}/../ 320 cd "${x}"/../
237 fi 321 fi
238 fi
239
240 if which libtoolize &>/dev/null
241 then
242 ewarn "Cannot apply any patch, running libtoolize..."
243 libtoolize --copy --force
244 fi
245 cd ${x}
246 break
247 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
248 fi 330 fi
249 done 331 fi
332
333 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
334
335 touch "${x}/.elibtoolized"
250 done 336 done
251 337
252 if [ -f libtool ] 338 cd "${start_dir}"
253 then 339}
254 rm -f libtool 340
341uclibctoolize() {
342 ewarn "uclibctoolize() is depreciated, please just use libtoolize()!"
343 elibtoolize
344}
345
346darwintoolize() {
347 local targets=""
348 local x
349
350 if [[ -z $* ]] ; then
351 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
255 fi 352 fi
256 353
257 # We need to change the pwd back to $S, as we may be called in 354 einfo "Applying Darwin/libtool patches ..."
258 # src_compile() 355 for x in ${targets} ; do
259 cd ${S} 356 [[ ! -s ${x} ]] && continue
260} 357 case ${x##*/} in
358 ltmain.sh|ltconfig)
359 local ver=$(grep '^VERSION=' ${x})
360 ver=${ver/VERSION=}
361 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
362 ver="1.3" # 1.4, 1.5 and 1.3 are compat
363 fi
261 364
365 ebegin " Fixing \${S}${x/${S}}"
366 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
367 eend $? "PLEASE CHECK ${x}"
368 ;;
369 esac
370 done
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.25  
changed lines
  Added in v.1.58

  ViewVC Help
Powered by ViewVC 1.1.20