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

Diff of /eclass/multilib.eclass

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

Revision 1.38 Revision 1.69
1# Copyright 1999-2004 Gentoo Foundation 1# Copyright 1999-2008 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/multilib.eclass,v 1.38 2005/10/07 02:24:47 eradicator Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.69 2008/11/28 09:20:26 vapier Exp $
4# 4
5# Author: Jeremy Huddleston <eradicator@gentoo.org> 5# @ECLASS: multilib.eclass
6# 6# @MAINTAINER:
7# amd64@gentoo.org
8# toolchain@gentoo.org
9# @BLURB: This eclass is for all functions pertaining to handling multilib configurations.
10# @DESCRIPTION:
7# This eclass is for all functions pertaining to handling multilib. 11# This eclass is for all functions pertaining to handling multilib configurations.
8# configurations.
9 12
10DESCRIPTION="Based on the ${ECLASS} eclass" 13___ECLASS_RECUR_MULTILIB="yes"
11 14[[ -z ${___ECLASS_RECUR_TOOLCHAIN_FUNCS} ]] && inherit toolchain-funcs
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 15
96# Defaults: 16# Defaults:
97export MULTILIB_ABIS=${MULTILIB_ABIS:-"default"} 17export MULTILIB_ABIS=${MULTILIB_ABIS:-"default"}
98export DEFAULT_ABI=${DEFAULT_ABI:-"default"} 18export DEFAULT_ABI=${DEFAULT_ABI:-"default"}
99export CFLAGS_default 19export CFLAGS_default
100export LDFLAGS_default 20export LDFLAGS_default
101export CHOST_default=${CHOST_default:-${CHOST}} 21export CHOST_default=${CHOST_default:-${CHOST}}
102export CTARGET_default=${CTARGET_default:-${CTARGET}} 22export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}}
103export LIBDIR_default=${CONF_LIBDIR:-"lib"} 23export LIBDIR_default=${CONF_LIBDIR:-"lib"}
104export CDEFINE_default="__unix__" 24export CDEFINE_default="__unix__"
25export KERNEL_ABI=${KERNEL_ABI:-${DEFAULT_ABI}}
105 26
106# has_multilib_profile() 27# @FUNCTION: has_multilib_profile
28# @DESCRIPTION:
29# Return true if the current profile is a multilib profile and lists more than
30# one abi in ${MULTILIB_ABIS}. When has_multilib_profile returns true, that
31# profile should enable the 'multilib' use flag. This is so you can DEPEND on
32# a package only for multilib or not multilib.
107has_multilib_profile() { 33has_multilib_profile() {
108 [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] 34 [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ]
109} 35}
110 36
37# @FUNCTION: get_libdir
38# @RETURN: the libdir for the selected ABI
39# @DESCRIPTION:
111# This function simply returns the desired lib directory. With portage 40# This function simply returns the desired lib directory. With portage
112# 2.0.51, we now have support for installing libraries to lib32/lib64 41# 2.0.51, we now have support for installing libraries to lib32/lib64
113# to accomidate the needs of multilib systems. It's no longer a good idea 42# to accomidate the needs of multilib systems. It's no longer a good idea
114# to assume all libraries will end up in lib. Replace any (sane) instances 43# to assume all libraries will end up in lib. Replace any (sane) instances
115# where lib is named directly with $(get_libdir) if possible. 44# where lib is named directly with $(get_libdir) if possible.
116#
117# Travis Tilley <lv@gentoo.org> (24 Aug 2004)
118# 45#
119# Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004): 46# Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004):
120# Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set, 47# Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set,
121# fall back on old behavior. Any profile that has these set should also 48# fall back on old behavior. Any profile that has these set should also
122# depend on a newer version of portage (not yet released) which uses these 49# depend on a newer version of portage (not yet released) which uses these
129 else 56 else
130 get_abi_LIBDIR 57 get_abi_LIBDIR
131 fi 58 fi
132} 59}
133 60
61# @FUNCTION: get_multilibdir
62# @RETURN: Returns the multilibdir
134get_multilibdir() { 63get_multilibdir() {
135 if has_multilib_profile; then 64 if has_multilib_profile; then
136 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" 65 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"
137 exit 1 66 exit 1
138 fi 67 fi
139 echo ${CONF_MULTILIBDIR:=lib32} 68 echo ${CONF_MULTILIBDIR:=lib32}
140} 69}
141 70
71# @FUNCTION: get_libdir_override
72# @DESCRIPTION:
142# Sometimes you need to override the value returned by get_libdir. A good 73# Sometimes you need to override the value returned by get_libdir. A good
143# example of this is xorg-x11, where lib32 isnt a supported configuration, 74# example of this is xorg-x11, where lib32 isnt a supported configuration,
144# and where lib64 -must- be used on amd64 (for applications that need lib 75# and where lib64 -must- be used on amd64 (for applications that need lib
145# to be 32bit, such as adobe acrobat). Note that this override also bypasses 76# to be 32bit, such as adobe acrobat). Note that this override also bypasses
146# portage version sanity checking. 77# portage version sanity checking.
147# get_libdir_override expects one argument, the result get_libdir should 78# get_libdir_override expects one argument, the result get_libdir should
148# return: 79# return:
149# 80#
150# get_libdir_override lib64 81# get_libdir_override lib64
151#
152# Travis Tilley <lv@gentoo.org> (31 Aug 2004)
153get_libdir_override() { 82get_libdir_override() {
154 if has_multilib_profile; then 83 if has_multilib_profile; then
155 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" 84 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"
156 exit 1 85 exit 1
157 fi 86 fi
158 CONF_LIBDIR="$1" 87 CONF_LIBDIR="$1"
159 CONF_LIBDIR_OVERRIDE="$1" 88 CONF_LIBDIR_OVERRIDE="$1"
160 LIBDIR_default="$1" 89 LIBDIR_default="$1"
161} 90}
162 91
163# get_abi_var <VAR> [<ABI>] 92# @FUNCTION: get_abi_var
93# @USAGE: <VAR> [ABI]
164# returns the value of ${<VAR>_<ABI>} which should be set in make.defaults 94# @RETURN: returns the value of ${<VAR>_<ABI>} which should be set in make.defaults
165# 95# @DESCRIPTION:
166# ex: 96# ex:
167# CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32 97# CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32
168# 98#
169# Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)" 99# Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)"
170# This will hopefully be added to portage soon... 100# This will hopefully be added to portage soon...
171# 101#
172# If <ABI> is not specified, ${ABI} is used. 102# If <ABI> is not specified, ${ABI} is used.
173# If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used. 103# If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used.
174# If <ABI> is not specified and ${ABI} and ${DEFAULT_ABI} are not defined, we return an empty string. 104# If <ABI> is not specified and ${ABI} and ${DEFAULT_ABI} are not defined, we return an empty string.
175#
176# Jeremy Huddleston <eradicator@gentoo.org>
177get_abi_var() { 105get_abi_var() {
178 local flag=$1 106 local flag=$1
179 local abi 107 local abi
180 if [ $# -gt 1 ]; then 108 if [ $# -gt 1 ]; then
181 abi=${2} 109 abi=${2}
189 117
190 local var="${flag}_${abi}" 118 local var="${flag}_${abi}"
191 echo ${!var} 119 echo ${!var}
192} 120}
193 121
122# @FUNCTION: get_abi_CFLAGS
123# @USAGE: [ABI]
124# @DESCRIPTION:
125# Alias for 'get_abi_var CFLAGS'
194get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; } 126get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; }
127
128# @FUNCTION: get_abi_ASFLAGS
129# @USAGE: [ABI]
130# @DESCRIPTION:
131# Alias for 'get_abi_var ASFLAGS'
132get_abi_ASFLAGS() { get_abi_var ASFLAGS "$@"; }
133
134# @FUNCTION: get_abi_LDFLAGS
135# @USAGE: [ABI]
136# @DESCRIPTION:
137# Alias for 'get_abi_var LDFLAGS'
195get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; } 138get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; }
139
140# @FUNCTION: get_abi_CHOST
141# @USAGE: [ABI]
142# @DESCRIPTION:
143# Alias for 'get_abi_var CHOST'
196get_abi_CHOST() { get_abi_var CHOST "$@"; } 144get_abi_CHOST() { get_abi_var CHOST "$@"; }
145
146# @FUNCTION: get_abi_CTARGET
147# @USAGE: [ABI]
148# @DESCRIPTION:
149# Alias for 'get_abi_var CTARGET'
197get_abi_CTARGET() { get_abi_var CTARGET "$@"; } 150get_abi_CTARGET() { get_abi_var CTARGET "$@"; }
151
152# @FUNCTION: get_abi_FAKE_TARGETS
153# @USAGE: [ABI]
154# @DESCRIPTION:
155# Alias for 'get_abi_var FAKE_TARGETS'
198get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; } 156get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; }
157
158# @FUNCTION: get_abi_CDEFINE
159# @USAGE: [ABI]
160# @DESCRIPTION:
161# Alias for 'get_abi_var CDEFINE'
199get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; } 162get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; }
163
164# @FUNCTION: get_abi_LIBDIR
165# @USAGE: [ABI]
166# @DESCRIPTION:
167# Alias for 'get_abi_var LIBDIR'
200get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; } 168get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; }
201 169
170# @FUNCTION: get_install_abis
171# @DESCRIPTION:
202# Return a list of the ABIs we want to install for with 172# Return a list of the ABIs we want to install for with
203# the last one in the list being the default. 173# the last one in the list being the default.
204get_install_abis() { 174get_install_abis() {
205 local order="" 175 local order=""
206 176
207 if [[ -z ${MULTILIB_ABIS} ]] ; then 177 if [[ -z ${MULTILIB_ABIS} ]] ; then
208 echo "default" 178 echo "default"
209 return 0 179 return 0
210 fi 180 fi
211 181
212 if hasq multilib-pkg-force ${RESTRICT} || 182 if [[ ${EMULTILIB_PKG} == "true" ]] ; then
213 { hasq multilib-pkg ${FEATURES} && hasq multilib-pkg ${RESTRICT}; }; then
214 for x in ${MULTILIB_ABIS} ; do 183 for x in ${MULTILIB_ABIS} ; do
215 if [[ ${x} != "${DEFAULT_ABI}" ]] ; then 184 if [[ ${x} != "${DEFAULT_ABI}" ]] ; then
216 hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}" 185 hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}"
217 fi 186 fi
218 done 187 done
237 206
238 echo ${order} 207 echo ${order}
239 return 0 208 return 0
240} 209}
241 210
211# @FUNCTION: get_all_abis
212# @DESCRIPTION:
242# Return a list of the ABIs supported by this profile. 213# Return a list of the ABIs supported by this profile.
243# the last one in the list being the default. 214# the last one in the list being the default.
244get_all_abis() { 215get_all_abis() {
245 local order="" 216 local order=""
246 217
247 if [ -z "${MULTILIB_ABIS}" ]; then 218 if [[ -z ${MULTILIB_ABIS} ]] ; then
248 echo "default" 219 echo "default"
249 return 0 220 return 0
250 fi 221 fi
251 222
252 for x in ${MULTILIB_ABIS}; do 223 for x in ${MULTILIB_ABIS}; do
253 if [ "${x}" != "${DEFAULT_ABI}" ]; then 224 if [[ ${x} != ${DEFAULT_ABI} ]] ; then
254 order="${order:+${order }}${x}" 225 order="${order:+${order} }${x}"
255 fi 226 fi
256 done 227 done
257 order="${order:+${order} }${DEFAULT_ABI}" 228 order="${order:+${order} }${DEFAULT_ABI}"
258 229
259 echo ${order} 230 echo ${order}
260 return 0 231 return 0
261} 232}
262 233
263# get_all_libdirs() 234# @FUNCTION: get_all_libdirs
235# @DESCRIPTION:
264# Returns a list of all the libdirs used by this profile. This includes 236# Returns a list of all the libdirs used by this profile. This includes
265# those that might not be touched by the current ebuild. 237# those that might not be touched by the current ebuild and always includes
238# "lib".
266get_all_libdirs() { 239get_all_libdirs() {
267 local libdirs="lib" 240 local libdirs="lib"
268 local abi 241 local abi
269 local dir 242 local dir
270 243
271 if has_multilib_profile; then
272 for abi in ${MULTILIB_ABIS}; do 244 for abi in ${MULTILIB_ABIS}; do
273 [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})" 245 [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})"
274 done 246 done
275 elif [ -n "${CONF_LIBDIR}" ]; then
276 for dir in ${CONF_LIBDIR} ${CONF_MULTILIBDIR:-lib32}; do
277 [ "${dir}" != "lib" ] && libdirs="${libdirs} ${dir}"
278 done
279 fi
280 247
281 echo "${libdirs}" 248 echo "${libdirs}"
282} 249}
283 250
251# @FUNCTION: is_final_abi
252# @DESCRIPTION:
284# Return true if ${ABI} is the last ABI on our list (or if we're not 253# Return true if ${ABI} is the last ABI on our list (or if we're not
285# using the new multilib configuration. This can be used to determine 254# using the new multilib configuration. This can be used to determine
286# if we're in the last (or only) run through src_{unpack,compile,install} 255# if we're in the last (or only) run through src_{unpack,compile,install}
287is_final_abi() { 256is_final_abi() {
288 has_multilib_profile || return 0 257 has_multilib_profile || return 0
289 local ALL_ABIS=$(get_install_abis) 258 local ALL_ABIS=$(get_install_abis)
290 local LAST_ABI=${ALL_ABIS/* /} 259 local LAST_ABI=${ALL_ABIS/* /}
291 [[ ${LAST_ABI} == ${ABI} ]] 260 [[ ${LAST_ABI} == ${ABI} ]]
292} 261}
293 262
263# @FUNCTION: number_abis
264# @DESCRIPTION:
294# echo the number of ABIs we will be installing for 265# echo the number of ABIs we will be installing for
295number_abis() { 266number_abis() {
296 get_install_abis | wc -w 267 get_install_abis | wc -w
297} 268}
298 269
299# get_ml_incdir [<include dir> [<ABI>]] 270# @FUNCTION: get_ml_incdir
271# @USAGE: [include_dir] [ABI]
272# @DESCRIPTION:
300# include dir defaults to /usr/include 273# include dir defaults to /usr/include
301# ABI defaults to ${ABI} or ${DEFAULT_ABI} 274# ABI defaults to ${ABI} or ${DEFAULT_ABI}
275#
276# If a multilib include dir is associated with the passed include dir, then
277# we return it, otherwise, we just echo back the include dir. This is
278# neccessary when a built script greps header files rather than testing them
279# via #include (like perl) to figure out features.
302get_ml_incdir() { 280get_ml_incdir() {
303 local dir=/usr/include 281 local dir=/usr/include
304 282
305 if [[ $# -gt 0 ]]; then 283 if [[ $# -gt 0 ]]; then
306 incdir=$1 284 incdir=$1
323 else 301 else
324 echo ${dir} 302 echo ${dir}
325 fi 303 fi
326} 304}
327 305
328# prep_ml_includes: 306# @FUNCTION: prep_ml_includes
329# 307# @DESCRIPTION:
330# Some includes (include/asm, glibc, etc) are ABI dependent. In this case, 308# Some includes (include/asm, glibc, etc) are ABI dependent. In this case,
331# We can install them in different locations for each ABI and create a common 309# We can install them in different locations for each ABI and create a common
332# header which includes the right one based on CDEFINE_${ABI}. If your 310# header which includes the right one based on CDEFINE_${ABI}. If your
333# package installs ABI-specific headers, just add 'prep_ml_includes' to the 311# package installs ABI-specific headers, just add 'prep_ml_includes' to the
334# end of your src_install(). It takes a list of directories that include 312# end of your src_install(). It takes a list of directories that include
335# files are installed in (default is /usr/include if none are passed). 313# files are installed in (default is /usr/include if none are passed).
336# 314#
337# Example: 315# Example:
338# src_install() { 316# src_install() {
339# ... 317# ...
340# prep_ml_includes /usr/qt/3/include 318# prep_ml_includes /usr/qt/3/include
341# } 319# }
342
343prep_ml_includes() { 320prep_ml_includes() {
344 if [[ $(number_abis) -gt 1 ]] ; then 321 if [[ $(number_abis) -gt 1 ]] ; then
345 local dir 322 local dir
346 local dirs 323 local dirs
347 local base 324 local base
378 done 355 done
379 fi 356 fi
380 fi 357 fi
381} 358}
382 359
360# @FUNCTION: create_ml_includes
361# @USAGE: <include_dir> <symbol_1>:<dir_1> [<symbol_2>:<dir_2>...]
362# @DESCRIPTION:
383# If you need more control than prep_ml_includes can offer (like linux-headers 363# If you need more control than prep_ml_includes can offer (like linux-headers
384# for the asm-* dirs, then use create_ml_includes. The firs argument is the 364# for the asm-* dirs, then use create_ml_includes. The firs argument is the
385# common dir. The remaining args are of the form <symbol>:<dir> where 365# common dir. The remaining args are of the form <symbol>:<dir> where
386# <symbol> is what is put in the #ifdef for choosing that dir. 366# <symbol> is what is put in the #ifdef for choosing that dir.
387# 367#
388# Ideas for this code came from debian's sparc-linux headers package. 368# Ideas for this code came from debian's sparc-linux headers package.
389# 369#
390# Example: 370# Example:
391# create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64 371# create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64
392# create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64 372# create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64
373#
374# Warning: Be careful with the ordering here. The default ABI has to be the
375# last, because it is always defined (by GCC)
393create_ml_includes() { 376create_ml_includes() {
394 local dest=$1 377 local dest=$1
395 shift 378 shift
396 local basedirs=$(create_ml_includes-listdirs "$@") 379 local basedirs=$(create_ml_includes-listdirs "$@")
397 380
530 echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@" 513 echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@"
531 # exit because we'll likely be called from a subshell 514 # exit because we'll likely be called from a subshell
532 exit 1 515 exit 1
533} 516}
534 517
518# @FUNCTION: get_libname
519# @USAGE: [version]
520# @DESCRIPTION:
521# Returns libname with proper suffix {.so,.dylib} and optionally supplied version
522# for ELF/MACH-O shared objects
523#
524# Example:
525# get_libname libfoo ${PV}
526# Returns: libfoo.so.${PV} (ELF) || libfoo.${PV}.dylib (MACH)
535get_libname() { 527get_libname() {
528 local libname
536 local ver=$1 529 local ver=$1
537 if use userland_Darwin ; then 530 case ${CHOST} in
531 *-cygwin|mingw*|*-mingw*) libname="dll";;
532 *-darwin*) libname="dylib";;
533 *) libname="so";;
534 esac
535
538 if [ -z ${ver} ] ; then 536 if [[ -z $* ]] ; then
539 echo ".dylib" 537 echo ".${libname}"
540 else
541 echo ".${ver}.dylib"
542 fi
543 else 538 else
544 if [ -z ${ver} ] ; then 539 for ver in "$@" ; do
545 echo ".so" 540 case ${CHOST} in
546 else 541 *-darwin*) echo ".${ver}.${libname}";;
547 echo ".so.${ver}" 542 *) echo ".${libname}.${ver}";;
548 fi 543 esac
544 done
549 fi 545 fi
550} 546}
551 547
552# This is for the toolchain to setup profile variables when pulling in 548# This is for the toolchain to setup profile variables when pulling in
553# a crosscompiler (and thus they aren't set in the profile) 549# a crosscompiler (and thus they aren't set in the profile)
554multilib_env() { 550multilib_env() {
555 local CTARGET=$1
556 local CTARGET_post=${CTARGET#*-} 551 local CTARGET=${1:-${CTARGET}}
557 552
558 case ${CTARGET} in 553 case ${CTARGET} in
559 x86_64*) 554 x86_64*)
560 export CFLAGS_x86=${CFLAGS_x86--m32} 555 export CFLAGS_x86=${CFLAGS_x86--m32}
561 export CHOST_x86=i686-${CTARGET_post} 556 export CHOST_x86=${CTARGET/x86_64/i686}
562 export CTARGET_x86=i686-${CTARGET_post} 557 export CTARGET_x86=${CHOST_x86}
563 export CDEFINE_x86="__i386__" 558 export CDEFINE_x86="__i386__"
564 export LIBDIR_x86="lib" 559 export LIBDIR_x86="lib"
565 560
566 export CFLAGS_amd64=${CFLAGS_amd64--m64} 561 export CFLAGS_amd64=${CFLAGS_amd64--m64}
567 export CHOST_amd64=x86_64-${CTARGET_post} 562 export CHOST_amd64=${CTARGET}
568 export CTARGET_amd64=x86_64-${CTARGET_post} 563 export CTARGET_amd64=${CHOST_amd64}
569 export CDEFINE_amd64="__x86_64__" 564 export CDEFINE_amd64="__x86_64__"
570 export LIBDIR_amd64="lib64" 565 export LIBDIR_amd64="lib64"
571 566
572 export MULTILIB_ABIS="amd64 x86" 567 export MULTILIB_ABIS="amd64 x86"
573 export DEFAULT_ABI="amd64" 568 export DEFAULT_ABI="amd64"
574 ;; 569 ;;
575 mips64*) 570 mips64*)
576 export CFLAGS_o32=${CFLAGS_o32--mabi=32} 571 export CFLAGS_o32=${CFLAGS_o32--mabi=32}
577 export CHOST_o32=mips-${CTARGET_post} 572 export CHOST_o32=${CTARGET/mips64/mips}
578 export CTARGET_o32=mips-${CTARGET_post} 573 export CTARGET_o32=${CHOST_o32}
579 export CDEFINE_o32="_MIPS_SIM == _ABIO32" 574 export CDEFINE_o32="_MIPS_SIM == _ABIO32"
580 export LIBDIR_o32="lib" 575 export LIBDIR_o32="lib"
581 576
582 export CFLAGS_n32=${CFLAGS_n32--mabi=n32} 577 export CFLAGS_n32=${CFLAGS_n32--mabi=n32}
583 export CHOST_n32=mips64-${CTARGET_post} 578 export CHOST_n32=${CTARGET}
584 export CTARGET_n32=mips64-${CTARGET_post} 579 export CTARGET_n32=${CHOST_n32}
585 export CDEFINE_n32="_MIPS_SIM == _ABIN32" 580 export CDEFINE_n32="_MIPS_SIM == _ABIN32"
586 export LIBDIR_n32="lib32" 581 export LIBDIR_n32="lib32"
587 582
588 export CFLAGS_n64=${CFLAGS_n64--mabi=64} 583 export CFLAGS_n64=${CFLAGS_n64--mabi=64}
589 export CHOST_n64=mips64-${CTARGET_post} 584 export CHOST_n64=${CTARGET}
590 export CTARGET_n64=mips64-${CTARGET_post} 585 export CTARGET_n64=${CHOST_n64}
591 export CDEFINE_n64="_MIPS_SIM == _ABI64" 586 export CDEFINE_n64="_MIPS_SIM == _ABI64"
592 export LIBDIR_n64="lib64" 587 export LIBDIR_n64="lib64"
593 588
594 export MULTILIB_ABIS="n64 n32 o32" 589 export MULTILIB_ABIS="n64 n32 o32"
595 export DEFAULT_ABI="n32" 590 export DEFAULT_ABI="n32"
596 ;; 591 ;;
597 powerpc64*) 592 powerpc64*)
598 export CFLAGS_ppc=${CFLAGS_ppc--m32} 593 export CFLAGS_ppc=${CFLAGS_ppc--m32}
599 export CHOST_ppc=powerpc-${CTARGET_post} 594 export CHOST_ppc=${CTARGET/powerpc64/powerpc}
600 export CTARGET_ppc=powerpc-${CTARGET_post} 595 export CTARGET_ppc=${CHOST_ppc}
601 export CDEFINE_ppc="!__powerpc64__" 596 export CDEFINE_ppc="!__powerpc64__"
602 export LIBDIR_ppc="lib" 597 export LIBDIR_ppc="lib"
603 598
604 export CFLAGS_ppc64=${CFLAGS_ppc64--m64} 599 export CFLAGS_ppc64=${CFLAGS_ppc64--m64}
605 export CHOST_ppc64=powerpc64-${CTARGET_post} 600 export CHOST_ppc64=${CTARGET}
606 export CTARGET_ppc64=powerpc64-${CTARGET_post} 601 export CTARGET_ppc64=${CHOST_ppc64}
607 export CDEFINE_ppc64="__powerpc64__" 602 export CDEFINE_ppc64="__powerpc64__"
608 export LIBDIR_ppc64="lib64" 603 export LIBDIR_ppc64="lib64"
609 604
610 export MULTILIB_ABIS="ppc64 ppc" 605 export MULTILIB_ABIS="ppc64 ppc"
611 export DEFAULT_ABI="ppc64" 606 export DEFAULT_ABI="ppc64"
612 ;; 607 ;;
608 s390x*)
609 export CFLAGS_s390=${CFLAGS_s390--m31} # the 31 is not a typo
610 export CHOST_s390=${CTARGET/s390x/s390}
611 export CTARGET_s390=${CHOST_s390}
612 export CDEFINE_s390="!__s390x__"
613 export LIBDIR_s390="lib"
614
615 export CFLAGS_s390x=${CFLAGS_s390x--m64}
616 export CHOST_s390x=${CTARGET}
617 export CTARGET_s390x=${CHOST_s390x}
618 export CDEFINE_s390x="__s390x__"
619 export LIBDIR_s390x="lib64"
620
621 export MULTILIB_ABIS="s390x s390"
622 export DEFAULT_ABI="s390x"
623 ;;
613 sparc64*) 624 sparc*)
614 export CFLAGS_sparc32=${CFLAGS_sparc32--m32} 625 export CFLAGS_sparc32=${CFLAGS_sparc32}
615 export CHOST_sparc32=sparc-${CTARGET_post} 626 export CHOST_sparc32=${CTARGET/sparc64/sparc}
616 export CTARGET_sparc32=sparc-${CTARGET_post} 627 export CTARGET_sparc32=${CHOST_sparc32}
617 export CDEFINE_sparc32="!__arch64__" 628 export CDEFINE_sparc32="!__arch64__"
618 export LIBDIR_sparc32="lib" 629 export LIBDIR_sparc32="lib"
619 630
620 export CFLAGS_sparc64=${CFLAGS_sparc64--m64} 631 export CFLAGS_sparc64=${CFLAGS_sparc64--m64}
621 export CHOST_sparc64=sparc64-${CTARGET_post} 632 export CHOST_sparc64=${CTARGET}
622 export CTARGET_sparc64=sparc64-${CTARGET_post} 633 export CTARGET_sparc64=${CHOST_sparc64}
623 export CDEFINE_sparc64="__arch64__" 634 export CDEFINE_sparc64="__arch64__"
624 export LIBDIR_sparc64="lib64" 635 export LIBDIR_sparc64="lib64"
625 636
626 export MULTILIB_ABIS="sparc64 sparc32" 637 export MULTILIB_ABIS="${MULTILIB_ABIS-sparc64 sparc32}"
627 export DEFAULT_ABI="sparc64" 638 export DEFAULT_ABI="${DEFAULT_ABI-sparc64}"
628 ;; 639 ;;
629 *) 640 *)
630 export MULTILIB_ABIS="default" 641 export MULTILIB_ABIS="default"
631 export DEFAULT_ABI="default" 642 export DEFAULT_ABI="default"
632 ;; 643 ;;
633 esac 644 esac
634} 645}
646
647# @FUNCTION: multilib_toolchain_setup
648# @DESCRIPTION:
649# Hide multilib details here for packages which are forced to be compiled for a
650# specific ABI when run on another ABI (like x86-specific packages on amd64)
651multilib_toolchain_setup() {
652 export ABI=$1
653
654 if has_version app-admin/eselect-compiler ; then
655 # Binutils doesn't have wrappers for ld and as (yet). Eventually it
656 # will, and all this can just be handled with CHOST.
657 export LD="ld $(get_abi_LDFLAGS $1)"
658 export AS="as $(get_abi_ASFLAGS $1)"
659
660 export CHOST=$(get_abi_CHOST $1)
661 export CBUILD=$(get_abi_CHOST $1)
662 else
663 tc-export CC
664 fi
665}

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.69

  ViewVC Help
Powered by ViewVC 1.1.20