1 |
# Copyright 1999-2004 Gentoo Foundation |
2 |
# Distributed under the terms of the GNU General Public License v2 |
3 |
# $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.53 2006/06/27 09:11:46 vapier Exp $ |
4 |
# |
5 |
# Author: Jeremy Huddleston <eradicator@gentoo.org> |
6 |
# |
7 |
# This eclass is for all functions pertaining to handling multilib. |
8 |
# configurations. |
9 |
|
10 |
DESCRIPTION="Based on the ${ECLASS} eclass" |
11 |
|
12 |
# has_multilib_profile: |
13 |
# Return true if the current profile is a multilib profile and lists more than |
14 |
# one abi in ${MULTILIB_ABIS}. You might want to use this like |
15 |
# 'use multilib || has_multilib_profile' until all profiles utilizing the |
16 |
# 'multilib' use flag are removed from portage |
17 |
|
18 |
# is_final_abi: |
19 |
# Return true if ${ABI} is the final abi to be installed (and thus we are |
20 |
# on our last run through a src_* function. |
21 |
|
22 |
# number_abis: |
23 |
# echo the number of ABIs we will be installing for |
24 |
|
25 |
# get_install_abis: |
26 |
# Return a list of the ABIs we want to install for with |
27 |
# the last one in the list being the default. |
28 |
|
29 |
# get_all_abis: |
30 |
# Return a list of the ABIs supported by this profile. |
31 |
# the last one in the list being the default. |
32 |
|
33 |
# get_all_libdirs: |
34 |
# Returns a list of all the libdirs used by this profile. This includes |
35 |
# those that might not be touched by the current ebuild and always includes |
36 |
# "lib". |
37 |
|
38 |
# get_libdir: |
39 |
# Returns the libdir for the selected ABI. This is backwards compatible |
40 |
# and simply calls get_abi_LIBDIR() on newer profiles. You should use this |
41 |
# to determine where to install shared objects (ex: /usr/$(get_libdir)) |
42 |
|
43 |
# get_abi_var <VAR> [<ABI>]: |
44 |
# returns the value of ${<VAR>_<ABI>} which should be set in make.defaults |
45 |
# |
46 |
# get_abi_CFLAGS: |
47 |
# get_abi_CDEFINE: |
48 |
# get_abi_LIBDIR: |
49 |
# Aliases for 'get_abi_var CFLAGS', etc. |
50 |
|
51 |
# get_ml_incdir [<include dir> [<ABI>]] |
52 |
# include dir defaults to /usr/include |
53 |
# ABI defaults to ${ABI} or ${DEFAULT_ABI} |
54 |
# |
55 |
# If a multilib include dir is associated with the passed include dir, then |
56 |
# we return it, otherwise, we just echo back the include dir. This is |
57 |
# neccessary when a built script greps header files rather than testing them |
58 |
# via #include (like perl) to figure out features. |
59 |
|
60 |
# prep_ml_includes: |
61 |
# Some includes (include/asm, glibc, etc) are ABI dependent. In this case, |
62 |
# We can install them in different locations for each ABI and create a common |
63 |
# header which includes the right one based on CDEFINE_${ABI}. If your |
64 |
# package installs ABI-specific headers, just add 'prep_ml_includes' to the |
65 |
# end of your src_install(). It takes a list of directories that include |
66 |
# files are installed in (default is /usr/include if none are passed). |
67 |
# |
68 |
# Example: |
69 |
# src_install() { |
70 |
# ... |
71 |
# prep_ml_includes /usr/qt/3/include |
72 |
# } |
73 |
|
74 |
# create_ml_includes <include dir> <symbol 1>:<dir 1> [<symbol 2>:<dir 2> ...] |
75 |
# If you need more control than prep_ml_includes can offer (like linux-headers |
76 |
# for the asm-* dirs, then use create_ml_includes. The firs argument is the |
77 |
# common dir. The remaining args are of the form <symbol>:<dir> where |
78 |
# <symbol> is what is put in the #ifdef for choosing that dir. |
79 |
# |
80 |
# Ideas for this code came from debian's sparc-linux headers package. |
81 |
# |
82 |
# Example: |
83 |
# create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64 |
84 |
# create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64 |
85 |
|
86 |
# get_libname [version] |
87 |
# returns libname with proper suffix {.so,.dylib} and optionally supplied version |
88 |
# for ELF/MACH-O shared objects |
89 |
# |
90 |
# Example: |
91 |
# get_libname libfoo ${PV} |
92 |
# Returns: libfoo.so.${PV} (ELF) || libfoo.${PV}.dylib (MACH) |
93 |
|
94 |
### END DOCUMENTATION ### |
95 |
|
96 |
# Defaults: |
97 |
export MULTILIB_ABIS=${MULTILIB_ABIS:-"default"} |
98 |
export DEFAULT_ABI=${DEFAULT_ABI:-"default"} |
99 |
export CFLAGS_default |
100 |
export LDFLAGS_default |
101 |
export CHOST_default=${CHOST_default:-${CHOST}} |
102 |
export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}} |
103 |
export LIBDIR_default=${CONF_LIBDIR:-"lib"} |
104 |
export CDEFINE_default="__unix__" |
105 |
export KERNEL_ABI=${KERNEL_ABI:-${DEFAULT_ABI}} |
106 |
|
107 |
# has_multilib_profile() |
108 |
has_multilib_profile() { |
109 |
[ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] |
110 |
} |
111 |
|
112 |
# This function simply returns the desired lib directory. With portage |
113 |
# 2.0.51, we now have support for installing libraries to lib32/lib64 |
114 |
# to accomidate the needs of multilib systems. It's no longer a good idea |
115 |
# to assume all libraries will end up in lib. Replace any (sane) instances |
116 |
# where lib is named directly with $(get_libdir) if possible. |
117 |
# |
118 |
# Travis Tilley <lv@gentoo.org> (24 Aug 2004) |
119 |
# |
120 |
# Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004): |
121 |
# Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set, |
122 |
# fall back on old behavior. Any profile that has these set should also |
123 |
# depend on a newer version of portage (not yet released) which uses these |
124 |
# over CONF_LIBDIR in econf, dolib, etc... |
125 |
get_libdir() { |
126 |
local CONF_LIBDIR |
127 |
if [ -n "${CONF_LIBDIR_OVERRIDE}" ] ; then |
128 |
# if there is an override, we want to use that... always. |
129 |
echo ${CONF_LIBDIR_OVERRIDE} |
130 |
else |
131 |
get_abi_LIBDIR |
132 |
fi |
133 |
} |
134 |
|
135 |
get_multilibdir() { |
136 |
if has_multilib_profile; then |
137 |
eerror "get_multilibdir called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org" |
138 |
exit 1 |
139 |
fi |
140 |
echo ${CONF_MULTILIBDIR:=lib32} |
141 |
} |
142 |
|
143 |
# Sometimes you need to override the value returned by get_libdir. A good |
144 |
# example of this is xorg-x11, where lib32 isnt a supported configuration, |
145 |
# and where lib64 -must- be used on amd64 (for applications that need lib |
146 |
# to be 32bit, such as adobe acrobat). Note that this override also bypasses |
147 |
# portage version sanity checking. |
148 |
# get_libdir_override expects one argument, the result get_libdir should |
149 |
# return: |
150 |
# |
151 |
# get_libdir_override lib64 |
152 |
# |
153 |
# Travis Tilley <lv@gentoo.org> (31 Aug 2004) |
154 |
get_libdir_override() { |
155 |
if has_multilib_profile; then |
156 |
eerror "get_libdir_override called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org" |
157 |
exit 1 |
158 |
fi |
159 |
CONF_LIBDIR="$1" |
160 |
CONF_LIBDIR_OVERRIDE="$1" |
161 |
LIBDIR_default="$1" |
162 |
} |
163 |
|
164 |
# get_abi_var <VAR> [<ABI>] |
165 |
# returns the value of ${<VAR>_<ABI>} which should be set in make.defaults |
166 |
# |
167 |
# ex: |
168 |
# CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32 |
169 |
# |
170 |
# Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)" |
171 |
# This will hopefully be added to portage soon... |
172 |
# |
173 |
# If <ABI> is not specified, ${ABI} is used. |
174 |
# If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used. |
175 |
# If <ABI> is not specified and ${ABI} and ${DEFAULT_ABI} are not defined, we return an empty string. |
176 |
# |
177 |
# Jeremy Huddleston <eradicator@gentoo.org> |
178 |
get_abi_var() { |
179 |
local flag=$1 |
180 |
local abi |
181 |
if [ $# -gt 1 ]; then |
182 |
abi=${2} |
183 |
elif [ -n "${ABI}" ]; then |
184 |
abi=${ABI} |
185 |
elif [ -n "${DEFAULT_ABI}" ]; then |
186 |
abi=${DEFAULT_ABI} |
187 |
else |
188 |
abi="default" |
189 |
fi |
190 |
|
191 |
local var="${flag}_${abi}" |
192 |
echo ${!var} |
193 |
} |
194 |
|
195 |
get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; } |
196 |
get_abi_ASFLAGS() { get_abi_var ASFLAGS "$@"; } |
197 |
get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; } |
198 |
get_abi_CHOST() { get_abi_var CHOST "$@"; } |
199 |
get_abi_CTARGET() { get_abi_var CTARGET "$@"; } |
200 |
get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; } |
201 |
get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; } |
202 |
get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; } |
203 |
|
204 |
# Return a list of the ABIs we want to install for with |
205 |
# the last one in the list being the default. |
206 |
get_install_abis() { |
207 |
local order="" |
208 |
|
209 |
if [[ -z ${MULTILIB_ABIS} ]] ; then |
210 |
echo "default" |
211 |
return 0 |
212 |
fi |
213 |
|
214 |
if hasq multilib-pkg-force ${RESTRICT} || |
215 |
{ hasq multilib-pkg ${FEATURES} && hasq multilib-pkg ${RESTRICT}; }; then |
216 |
for x in ${MULTILIB_ABIS} ; do |
217 |
if [[ ${x} != "${DEFAULT_ABI}" ]] ; then |
218 |
hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}" |
219 |
fi |
220 |
done |
221 |
hasq ${DEFAULT_ABI} ${ABI_DENY} || order="${ordera} ${DEFAULT_ABI}" |
222 |
|
223 |
if [[ -n ${ABI_ALLOW} ]] ; then |
224 |
local ordera="" |
225 |
for x in ${order} ; do |
226 |
if hasq ${x} ${ABI_ALLOW} ; then |
227 |
ordera="${ordera} ${x}" |
228 |
fi |
229 |
done |
230 |
order=${ordera} |
231 |
fi |
232 |
else |
233 |
order=${DEFAULT_ABI} |
234 |
fi |
235 |
|
236 |
if [[ -z ${order} ]] ; then |
237 |
die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package." |
238 |
fi |
239 |
|
240 |
echo ${order} |
241 |
return 0 |
242 |
} |
243 |
|
244 |
# Return a list of the ABIs supported by this profile. |
245 |
# the last one in the list being the default. |
246 |
get_all_abis() { |
247 |
local order="" |
248 |
|
249 |
if [[ -z ${MULTILIB_ABIS} ]] ; then |
250 |
echo "default" |
251 |
return 0 |
252 |
fi |
253 |
|
254 |
for x in ${MULTILIB_ABIS}; do |
255 |
if [[ ${x} != ${DEFAULT_ABI} ]] ; then |
256 |
order="${order:+${order} }${x}" |
257 |
fi |
258 |
done |
259 |
order="${order:+${order} }${DEFAULT_ABI}" |
260 |
|
261 |
echo ${order} |
262 |
return 0 |
263 |
} |
264 |
|
265 |
# get_all_libdirs() |
266 |
# Returns a list of all the libdirs used by this profile. This includes |
267 |
# those that might not be touched by the current ebuild. |
268 |
get_all_libdirs() { |
269 |
local libdirs="lib" |
270 |
local abi |
271 |
local dir |
272 |
|
273 |
# Remove when amd64's 2004.3 is purged. |
274 |
if [[ -n "${CONF_LIBDIR}" ]]; then |
275 |
for dir in ${CONF_LIBDIR} ${CONF_MULTILIBDIR:-lib32}; do |
276 |
[ "${dir}" != "lib" ] && libdirs="${libdirs} ${dir}" |
277 |
done |
278 |
else |
279 |
for abi in ${MULTILIB_ABIS}; do |
280 |
[ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})" |
281 |
done |
282 |
fi |
283 |
|
284 |
echo "${libdirs}" |
285 |
} |
286 |
|
287 |
# Return true if ${ABI} is the last ABI on our list (or if we're not |
288 |
# using the new multilib configuration. This can be used to determine |
289 |
# if we're in the last (or only) run through src_{unpack,compile,install} |
290 |
is_final_abi() { |
291 |
has_multilib_profile || return 0 |
292 |
local ALL_ABIS=$(get_install_abis) |
293 |
local LAST_ABI=${ALL_ABIS/* /} |
294 |
[[ ${LAST_ABI} == ${ABI} ]] |
295 |
} |
296 |
|
297 |
# echo the number of ABIs we will be installing for |
298 |
number_abis() { |
299 |
get_install_abis | wc -w |
300 |
} |
301 |
|
302 |
# get_ml_incdir [<include dir> [<ABI>]] |
303 |
# include dir defaults to /usr/include |
304 |
# ABI defaults to ${ABI} or ${DEFAULT_ABI} |
305 |
get_ml_incdir() { |
306 |
local dir=/usr/include |
307 |
|
308 |
if [[ $# -gt 0 ]]; then |
309 |
incdir=$1 |
310 |
shift |
311 |
fi |
312 |
|
313 |
if [[ -z "${MULTILIB_ABIS}" ]]; then |
314 |
echo ${incdir} |
315 |
return 0 |
316 |
fi |
317 |
|
318 |
local abi=${ABI-${DEFAULT_ABI}} |
319 |
if [[ $# -gt 0 ]]; then |
320 |
abi=$1 |
321 |
shift |
322 |
fi |
323 |
|
324 |
if [[ -d "${dir}/gentoo-multilib/${abi}" ]]; then |
325 |
echo ${dir}/gentoo-multilib/${abi} |
326 |
else |
327 |
echo ${dir} |
328 |
fi |
329 |
} |
330 |
|
331 |
# prep_ml_includes: |
332 |
# |
333 |
# Some includes (include/asm, glibc, etc) are ABI dependent. In this case, |
334 |
# We can install them in different locations for each ABI and create a common |
335 |
# header which includes the right one based on CDEFINE_${ABI}. If your |
336 |
# package installs ABI-specific headers, just add 'prep_ml_includes' to the |
337 |
# end of your src_install(). It takes a list of directories that include |
338 |
# files are installed in (default is /usr/include if none are passed). |
339 |
# |
340 |
# Example: |
341 |
# src_install() { |
342 |
# ... |
343 |
# prep_ml_includes /usr/qt/3/include |
344 |
# } |
345 |
|
346 |
prep_ml_includes() { |
347 |
if [[ $(number_abis) -gt 1 ]] ; then |
348 |
local dir |
349 |
local dirs |
350 |
local base |
351 |
|
352 |
if [[ $# -eq 0 ]] ; then |
353 |
dirs=/usr/include |
354 |
else |
355 |
dirs="$@" |
356 |
fi |
357 |
|
358 |
for dir in ${dirs} ; do |
359 |
base=${T}/gentoo-multilib/${dir}/gentoo-multilib |
360 |
mkdir -p "${base}" |
361 |
[[ -d ${base}/${ABI} ]] && rm -rf "${base}/${ABI}" |
362 |
mv "${D}/${dir}" "${base}/${ABI}" |
363 |
done |
364 |
|
365 |
if is_final_abi; then |
366 |
base=${T}/gentoo-multilib |
367 |
pushd "${base}" |
368 |
find . | tar -c -T - -f - | tar -x --no-same-owner -f - -C ${D} |
369 |
popd |
370 |
|
371 |
# This 'set' stuff is required by mips profiles to properly pass |
372 |
# CDEFINE's (which have spaces) to sub-functions |
373 |
set -- |
374 |
for dir in ${dirs} ; do |
375 |
set -- "$@" "${dir}" |
376 |
local abi |
377 |
for abi in $(get_install_abis); do |
378 |
set -- "$@" "$(get_abi_CDEFINE ${abi}):${dir}/gentoo-multilib/${abi}" |
379 |
done |
380 |
create_ml_includes "$@" |
381 |
done |
382 |
fi |
383 |
fi |
384 |
} |
385 |
|
386 |
# If you need more control than prep_ml_includes can offer (like linux-headers |
387 |
# for the asm-* dirs, then use create_ml_includes. The firs argument is the |
388 |
# common dir. The remaining args are of the form <symbol>:<dir> where |
389 |
# <symbol> is what is put in the #ifdef for choosing that dir. |
390 |
# |
391 |
# Ideas for this code came from debian's sparc-linux headers package. |
392 |
# |
393 |
# Example: |
394 |
# create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64 |
395 |
# create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64 |
396 |
# |
397 |
# Warning: Be careful with the ordering here. The default ABI has to be the |
398 |
# last, because it is always defined (by GCC) |
399 |
create_ml_includes() { |
400 |
local dest=$1 |
401 |
shift |
402 |
local basedirs=$(create_ml_includes-listdirs "$@") |
403 |
|
404 |
create_ml_includes-makedestdirs ${dest} ${basedirs} |
405 |
|
406 |
local file |
407 |
for file in $(create_ml_includes-allfiles ${basedirs}) ; do |
408 |
#local name=$(echo ${file} | tr '[:lower:]' '[:upper:]' | sed 's:[^[:upper:]]:_:g') |
409 |
( |
410 |
echo "/* Autogenerated by create_ml_includes() in multilib.eclass */" |
411 |
|
412 |
local dir |
413 |
for dir in ${basedirs}; do |
414 |
if [[ -f ${D}/${dir}/${file} ]] ; then |
415 |
echo "" |
416 |
local sym=$(create_ml_includes-sym_for_dir ${dir} "$@") |
417 |
if [[ ${sym/=} != "${sym}" ]] ; then |
418 |
echo "#if ${sym}" |
419 |
elif [[ ${sym::1} == "!" ]] ; then |
420 |
echo "#ifndef ${sym:1}" |
421 |
else |
422 |
echo "#ifdef ${sym}" |
423 |
fi |
424 |
echo "# include <$(create_ml_includes-absolute ${dir}/${file})>" |
425 |
echo "#endif /* ${sym} */" |
426 |
fi |
427 |
done |
428 |
|
429 |
#echo "#endif /* __CREATE_ML_INCLUDES_STUB_${name}__ */" |
430 |
) > "${D}/${dest}/${file}" |
431 |
done |
432 |
} |
433 |
|
434 |
# Helper function for create_ml_includes |
435 |
create_ml_includes-absolute() { |
436 |
local dst="$(create_ml_includes-tidy_path $1)" |
437 |
|
438 |
dst=(${dst//\// }) |
439 |
|
440 |
local i |
441 |
for ((i=0; i<${#dst[*]}; i++)); do |
442 |
[ "${dst[i]}" == "include" ] && break |
443 |
done |
444 |
|
445 |
local strip_upto=$i |
446 |
|
447 |
for ((i=strip_upto+1; i<${#dst[*]}-1; i++)); do |
448 |
echo -n ${dst[i]}/ |
449 |
done |
450 |
|
451 |
echo -n ${dst[i]} |
452 |
} |
453 |
|
454 |
# Helper function for create_ml_includes |
455 |
create_ml_includes-tidy_path() { |
456 |
local removed=$1 |
457 |
|
458 |
if [ -n "${removed}" ]; then |
459 |
# Remove multiple slashes |
460 |
while [ "${removed}" != "${removed/\/\//\/}" ]; do |
461 |
removed=${removed/\/\//\/} |
462 |
done |
463 |
|
464 |
# Remove . directories |
465 |
while [ "${removed}" != "${removed//\/.\//\/}" ]; do |
466 |
removed=${removed//\/.\//\/} |
467 |
done |
468 |
[ "${removed##*/}" = "." ] && removed=${removed%/*} |
469 |
|
470 |
# Removed .. directories |
471 |
while [ "${removed}" != "${removed//\/..\/}" ]; do |
472 |
local p1="${removed%%\/..\/*}" |
473 |
local p2="${removed#*\/..\/}" |
474 |
|
475 |
removed="${p1%\/*}/${p2}" |
476 |
done |
477 |
|
478 |
# Remove trailing .. |
479 |
[ "${removed##*/}" = ".." ] && removed=${removed%/*/*} |
480 |
|
481 |
# Remove trailing / |
482 |
[ "${removed##*/}" = "" ] && removed=${removed%/*} |
483 |
|
484 |
echo ${removed} |
485 |
fi |
486 |
} |
487 |
|
488 |
# Helper function for create_ml_includes |
489 |
create_ml_includes-listdirs() { |
490 |
local dirs |
491 |
local data |
492 |
for data in "$@"; do |
493 |
dirs="${dirs} ${data/*:/}" |
494 |
done |
495 |
echo ${dirs:1} |
496 |
} |
497 |
|
498 |
# Helper function for create_ml_includes |
499 |
create_ml_includes-makedestdirs() { |
500 |
local dest=$1 |
501 |
shift |
502 |
local basedirs=$@ |
503 |
|
504 |
dodir ${dest} |
505 |
|
506 |
local basedir |
507 |
for basedir in ${basedirs}; do |
508 |
local dir |
509 |
for dir in $(find ${D}/${basedir} -type d); do |
510 |
dodir ${dest}/${dir/${D}\/${basedir}/} |
511 |
done |
512 |
done |
513 |
} |
514 |
|
515 |
# Helper function for create_ml_includes |
516 |
create_ml_includes-allfiles() { |
517 |
local basedir file |
518 |
for basedir in "$@" ; do |
519 |
for file in $(find "${D}"/${basedir} -type f); do |
520 |
echo ${file/${D}\/${basedir}\//} |
521 |
done |
522 |
done | sort | uniq |
523 |
} |
524 |
|
525 |
# Helper function for create_ml_includes |
526 |
create_ml_includes-sym_for_dir() { |
527 |
local dir=$1 |
528 |
shift |
529 |
local data |
530 |
for data in "$@"; do |
531 |
if [[ ${data} == *:${dir} ]] ; then |
532 |
echo ${data/:*/} |
533 |
return 0 |
534 |
fi |
535 |
done |
536 |
echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@" |
537 |
# exit because we'll likely be called from a subshell |
538 |
exit 1 |
539 |
} |
540 |
|
541 |
get_libname() { |
542 |
local libname |
543 |
local ver=$1 |
544 |
case ${CHOST} in |
545 |
*-darwin*) libname="dylib";; |
546 |
*) libname="so";; |
547 |
esac |
548 |
|
549 |
if [[ -z $@ ]] ; then |
550 |
echo ".${libname}" |
551 |
else |
552 |
for ver in "$@" ; do |
553 |
case ${CHOST} in |
554 |
*-darwin*) echo ".${ver}.${libname}";; |
555 |
*) echo ".${libname}.${ver}";; |
556 |
esac |
557 |
done |
558 |
fi |
559 |
} |
560 |
|
561 |
# This is for the toolchain to setup profile variables when pulling in |
562 |
# a crosscompiler (and thus they aren't set in the profile) |
563 |
multilib_env() { |
564 |
local CTARGET=${1:-${CTARGET}} |
565 |
|
566 |
case ${CTARGET} in |
567 |
x86_64*) |
568 |
export CFLAGS_x86=${CFLAGS_x86--m32} |
569 |
export CHOST_x86=${CTARGET/x86_64/i686} |
570 |
export CTARGET_x86=${CHOST_x86} |
571 |
export CDEFINE_x86="__i386__" |
572 |
export LIBDIR_x86="lib" |
573 |
|
574 |
export CFLAGS_amd64=${CFLAGS_amd64--m64} |
575 |
export CHOST_amd64=${CTARGET} |
576 |
export CTARGET_amd64=${CTARGET_amd64} |
577 |
export CDEFINE_amd64="__x86_64__" |
578 |
export LIBDIR_amd64="lib64" |
579 |
|
580 |
export MULTILIB_ABIS="amd64 x86" |
581 |
export DEFAULT_ABI="amd64" |
582 |
;; |
583 |
mips64*) |
584 |
export CFLAGS_o32=${CFLAGS_o32--mabi=32} |
585 |
export CHOST_o32=${CTARGET/mips64/mips} |
586 |
export CTARGET_o32=${CHOST_o32} |
587 |
export CDEFINE_o32="_MIPS_SIM == _ABIO32" |
588 |
export LIBDIR_o32="lib" |
589 |
|
590 |
export CFLAGS_n32=${CFLAGS_n32--mabi=n32} |
591 |
export CHOST_n32=${CTARGET} |
592 |
export CTARGET_n32=${CHOST_n32} |
593 |
export CDEFINE_n32="_MIPS_SIM == _ABIN32" |
594 |
export LIBDIR_n32="lib32" |
595 |
|
596 |
export CFLAGS_n64=${CFLAGS_n64--mabi=64} |
597 |
export CHOST_n64=${CTARGET} |
598 |
export CTARGET_n64=${CHOST_n64} |
599 |
export CDEFINE_n64="_MIPS_SIM == _ABI64" |
600 |
export LIBDIR_n64="lib64" |
601 |
|
602 |
export MULTILIB_ABIS="n64 n32 o32" |
603 |
export DEFAULT_ABI="n32" |
604 |
;; |
605 |
powerpc64*) |
606 |
export CFLAGS_ppc=${CFLAGS_ppc--m32} |
607 |
export CHOST_ppc=${CTARGET/powerpc64/powerpc} |
608 |
export CTARGET_ppc=${CHOST_ppc} |
609 |
export CDEFINE_ppc="!__powerpc64__" |
610 |
export LIBDIR_ppc="lib" |
611 |
|
612 |
export CFLAGS_ppc64=${CFLAGS_ppc64--m64} |
613 |
export CHOST_ppc64=${CTARGET} |
614 |
export CTARGET_ppc64=${CHOST_ppc64} |
615 |
export CDEFINE_ppc64="__powerpc64__" |
616 |
export LIBDIR_ppc64="lib64" |
617 |
|
618 |
export MULTILIB_ABIS="ppc64 ppc" |
619 |
export DEFAULT_ABI="ppc64" |
620 |
;; |
621 |
s390x*) |
622 |
export CFLAGS_s390=${CFLAGS_s390--m31} # the 31 is not a typo |
623 |
export CHOST_s390=${CTARGET/s390x/s390} |
624 |
export CTARGET_s390=${CHOST_s390} |
625 |
export CDEFINE_s390="!__s390x__" |
626 |
export LIBDIR_s390="lib" |
627 |
|
628 |
export CFLAGS_s390x=${CFLAGS_s390x--m64} |
629 |
export CHOST_s390x=${CTARGET} |
630 |
export CTARGET_s390x=${CHOST_s390x} |
631 |
export CDEFINE_s390x="__s390x__" |
632 |
export LIBDIR_s390x="lib64" |
633 |
|
634 |
export MULTILIB_ABIS="s390x s390" |
635 |
export DEFAULT_ABI="s390x" |
636 |
;; |
637 |
sparc64*) |
638 |
export CFLAGS_sparc32=${CFLAGS_sparc32--m32} |
639 |
export CHOST_sparc32=${CTARGET/sparc64/sparc} |
640 |
export CTARGET_sparc32=${CHOST_sparc32} |
641 |
export CDEFINE_sparc32="!__arch64__" |
642 |
export LIBDIR_sparc32="lib" |
643 |
|
644 |
export CFLAGS_sparc64=${CFLAGS_sparc64--m64} |
645 |
export CHOST_sparc64=${CTARGET} |
646 |
export CTARGET_sparc64=${CHOST_sparc64} |
647 |
export CDEFINE_sparc64="__arch64__" |
648 |
export LIBDIR_sparc64="lib64" |
649 |
|
650 |
export MULTILIB_ABIS="sparc64 sparc32" |
651 |
export DEFAULT_ABI="sparc64" |
652 |
;; |
653 |
*) |
654 |
export MULTILIB_ABIS="default" |
655 |
export DEFAULT_ABI="default" |
656 |
;; |
657 |
esac |
658 |
} |
659 |
|
660 |
# Hide multilib details here for packages which are forced to be compiled for a |
661 |
# specific ABI when run on another ABI (like x86-specific packages on amd64) |
662 |
multilib_toolchain_setup() { |
663 |
if has_version app-admin/eselect-compiler ; then |
664 |
# Binutils doesn't have wrappers for ld and as (yet). Eventually it |
665 |
# will, and all this can just be handled with CHOST. |
666 |
export LD="ld $(get_abi_LDFLAGS $1)" |
667 |
export AS="as $(get_abi_ASFLAGS $1)" |
668 |
|
669 |
export CHOST=$(get_abi_CHOST $1) |
670 |
export CBUILD=$(get_abi_CHOST $1) |
671 |
else |
672 |
tc-export CC |
673 |
export ABI=$1 |
674 |
fi |
675 |
} |