| 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.1.1.1 2005/11/30 09:59:17 chriswhite Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.65 2008/06/01 01:37:29 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 | |
| 10 | DESCRIPTION="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 | |
15 | |
| 18 | # is_final_abi: |
16 | # is_final_abi: |
| 19 | # Return true if ${ABI} is the final abi to be installed (and thus we are |
17 | # Return true if ${ABI} is the final abi to be installed (and thus we are |
| 20 | # on our last run through a src_* function. |
18 | # on our last run through a src_* function. |
| 21 | |
19 | |
| … | |
… | |
| 100 | export LDFLAGS_default |
98 | export LDFLAGS_default |
| 101 | export CHOST_default=${CHOST_default:-${CHOST}} |
99 | export CHOST_default=${CHOST_default:-${CHOST}} |
| 102 | export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}} |
100 | export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}} |
| 103 | export LIBDIR_default=${CONF_LIBDIR:-"lib"} |
101 | export LIBDIR_default=${CONF_LIBDIR:-"lib"} |
| 104 | export CDEFINE_default="__unix__" |
102 | export CDEFINE_default="__unix__" |
|
|
103 | export KERNEL_ABI=${KERNEL_ABI:-${DEFAULT_ABI}} |
| 105 | |
104 | |
| 106 | # has_multilib_profile() |
105 | # @FUNCTION: has_multilib_profile |
|
|
106 | # @DESCRIPTION: |
|
|
107 | # Return true if the current profile is a multilib profile and lists more than |
|
|
108 | # one abi in ${MULTILIB_ABIS}. When has_multilib_profile returns true, that |
|
|
109 | # profile should enable the 'multilib' use flag. This is so you can DEPEND on |
|
|
110 | # a package only for multilib or not multilib. |
| 107 | has_multilib_profile() { |
111 | has_multilib_profile() { |
| 108 | [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] |
112 | [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] |
| 109 | } |
113 | } |
| 110 | |
114 | |
|
|
115 | # @FUNCTION: get_libdir |
|
|
116 | # @RETURN: the libdir for the selected ABI |
|
|
117 | # @DESCRIPTION: |
| 111 | # This function simply returns the desired lib directory. With portage |
118 | # This function simply returns the desired lib directory. With portage |
| 112 | # 2.0.51, we now have support for installing libraries to lib32/lib64 |
119 | # 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 |
120 | # 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 |
121 | # to assume all libraries will end up in lib. Replace any (sane) instances |
| 115 | # where lib is named directly with $(get_libdir) if possible. |
122 | # where lib is named directly with $(get_libdir) if possible. |
| 116 | # |
|
|
| 117 | # Travis Tilley <lv@gentoo.org> (24 Aug 2004) |
|
|
| 118 | # |
123 | # |
| 119 | # Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004): |
124 | # Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004): |
| 120 | # Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set, |
125 | # 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 |
126 | # 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 |
127 | # depend on a newer version of portage (not yet released) which uses these |
| … | |
… | |
| 129 | else |
134 | else |
| 130 | get_abi_LIBDIR |
135 | get_abi_LIBDIR |
| 131 | fi |
136 | fi |
| 132 | } |
137 | } |
| 133 | |
138 | |
|
|
139 | # @FUNCTION: get_multilibdir |
|
|
140 | # @RETURN: Returns the multilibdir |
| 134 | get_multilibdir() { |
141 | get_multilibdir() { |
| 135 | if has_multilib_profile; then |
142 | 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" |
143 | 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 |
144 | exit 1 |
| 138 | fi |
145 | fi |
| 139 | echo ${CONF_MULTILIBDIR:=lib32} |
146 | echo ${CONF_MULTILIBDIR:=lib32} |
| 140 | } |
147 | } |
| 141 | |
148 | |
|
|
149 | # @FUNCTION: get_libdir_override |
|
|
150 | # @DESCRIPTION: |
| 142 | # Sometimes you need to override the value returned by get_libdir. A good |
151 | # 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, |
152 | # 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 |
153 | # 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 |
154 | # to be 32bit, such as adobe acrobat). Note that this override also bypasses |
| 146 | # portage version sanity checking. |
155 | # portage version sanity checking. |
| 147 | # get_libdir_override expects one argument, the result get_libdir should |
156 | # get_libdir_override expects one argument, the result get_libdir should |
| 148 | # return: |
157 | # return: |
| 149 | # |
158 | # |
| 150 | # get_libdir_override lib64 |
159 | # get_libdir_override lib64 |
| 151 | # |
|
|
| 152 | # Travis Tilley <lv@gentoo.org> (31 Aug 2004) |
|
|
| 153 | get_libdir_override() { |
160 | get_libdir_override() { |
| 154 | if has_multilib_profile; then |
161 | 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" |
162 | 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 |
163 | exit 1 |
| 157 | fi |
164 | fi |
| 158 | CONF_LIBDIR="$1" |
165 | CONF_LIBDIR="$1" |
| 159 | CONF_LIBDIR_OVERRIDE="$1" |
166 | CONF_LIBDIR_OVERRIDE="$1" |
| 160 | LIBDIR_default="$1" |
167 | LIBDIR_default="$1" |
| 161 | } |
168 | } |
| 162 | |
169 | |
| 163 | # get_abi_var <VAR> [<ABI>] |
170 | # @FUNCTION: get_abi_var |
|
|
171 | # @USAGE: <VAR> [ABI] |
| 164 | # returns the value of ${<VAR>_<ABI>} which should be set in make.defaults |
172 | # @RETURN: returns the value of ${<VAR>_<ABI>} which should be set in make.defaults |
| 165 | # |
173 | # @DESCRIPTION: |
| 166 | # ex: |
174 | # ex: |
| 167 | # CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32 |
175 | # CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32 |
| 168 | # |
176 | # |
| 169 | # Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)" |
177 | # Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)" |
| 170 | # This will hopefully be added to portage soon... |
178 | # This will hopefully be added to portage soon... |
| 171 | # |
179 | # |
| 172 | # If <ABI> is not specified, ${ABI} is used. |
180 | # If <ABI> is not specified, ${ABI} is used. |
| 173 | # If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used. |
181 | # 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. |
182 | # 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> |
|
|
| 177 | get_abi_var() { |
183 | get_abi_var() { |
| 178 | local flag=$1 |
184 | local flag=$1 |
| 179 | local abi |
185 | local abi |
| 180 | if [ $# -gt 1 ]; then |
186 | if [ $# -gt 1 ]; then |
| 181 | abi=${2} |
187 | abi=${2} |
| … | |
… | |
| 189 | |
195 | |
| 190 | local var="${flag}_${abi}" |
196 | local var="${flag}_${abi}" |
| 191 | echo ${!var} |
197 | echo ${!var} |
| 192 | } |
198 | } |
| 193 | |
199 | |
|
|
200 | # @FUNCTION: get_abi_CFLAGS |
|
|
201 | # @USAGE: [ABI] |
|
|
202 | # @DESCRIPTION: |
|
|
203 | # Alias for 'get_abi_var CFLAGS' |
| 194 | get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; } |
204 | get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; } |
|
|
205 | |
|
|
206 | # @FUNCTION: get_abi_ASFLAGS |
|
|
207 | # @USAGE: [ABI] |
|
|
208 | # @DESCRIPTION: |
|
|
209 | # Alias for 'get_abi_var ASFLAGS' |
|
|
210 | get_abi_ASFLAGS() { get_abi_var ASFLAGS "$@"; } |
|
|
211 | |
|
|
212 | # @FUNCTION: get_abi_LDFLAGS |
|
|
213 | # @USAGE: [ABI] |
|
|
214 | # @DESCRIPTION: |
|
|
215 | # Alias for 'get_abi_var LDFLAGS' |
| 195 | get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; } |
216 | get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; } |
|
|
217 | |
|
|
218 | # @FUNCTION: get_abi_CHOST |
|
|
219 | # @USAGE: [ABI] |
|
|
220 | # @DESCRIPTION: |
|
|
221 | # Alias for 'get_abi_var CHOST' |
| 196 | get_abi_CHOST() { get_abi_var CHOST "$@"; } |
222 | get_abi_CHOST() { get_abi_var CHOST "$@"; } |
|
|
223 | |
|
|
224 | # @FUNCTION: get_abi_CTARGET |
|
|
225 | # @USAGE: [ABI] |
|
|
226 | # @DESCRIPTION: |
|
|
227 | # Alias for 'get_abi_var CTARGET' |
| 197 | get_abi_CTARGET() { get_abi_var CTARGET "$@"; } |
228 | get_abi_CTARGET() { get_abi_var CTARGET "$@"; } |
|
|
229 | |
|
|
230 | # @FUNCTION: get_abi_FAKE_TARGETS |
|
|
231 | # @USAGE: [ABI] |
|
|
232 | # @DESCRIPTION: |
|
|
233 | # Alias for 'get_abi_var FAKE_TARGETS' |
| 198 | get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; } |
234 | get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; } |
|
|
235 | |
|
|
236 | # @FUNCTION: get_abi_CDEFINE |
|
|
237 | # @USAGE: [ABI] |
|
|
238 | # @DESCRIPTION: |
|
|
239 | # Alias for 'get_abi_var CDEFINE' |
| 199 | get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; } |
240 | get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; } |
|
|
241 | |
|
|
242 | # @FUNCTION: get_abi_LIBDIR |
|
|
243 | # @USAGE: [ABI] |
|
|
244 | # @DESCRIPTION: |
|
|
245 | # Alias for 'get_abi_var LIBDIR' |
| 200 | get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; } |
246 | get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; } |
| 201 | |
247 | |
|
|
248 | # @FUNCTION: get_install_abis |
|
|
249 | # @DESCRIPTION: |
| 202 | # Return a list of the ABIs we want to install for with |
250 | # Return a list of the ABIs we want to install for with |
| 203 | # the last one in the list being the default. |
251 | # the last one in the list being the default. |
| 204 | get_install_abis() { |
252 | get_install_abis() { |
| 205 | local order="" |
253 | local order="" |
| 206 | |
254 | |
| 207 | if [[ -z ${MULTILIB_ABIS} ]] ; then |
255 | if [[ -z ${MULTILIB_ABIS} ]] ; then |
| 208 | echo "default" |
256 | echo "default" |
| 209 | return 0 |
257 | return 0 |
| 210 | fi |
258 | fi |
| 211 | |
259 | |
| 212 | if hasq multilib-pkg-force ${RESTRICT} || |
260 | if [[ ${EMULTILIB_PKG} == "true" ]] ; then |
| 213 | { hasq multilib-pkg ${FEATURES} && hasq multilib-pkg ${RESTRICT}; }; then |
|
|
| 214 | for x in ${MULTILIB_ABIS} ; do |
261 | for x in ${MULTILIB_ABIS} ; do |
| 215 | if [[ ${x} != "${DEFAULT_ABI}" ]] ; then |
262 | if [[ ${x} != "${DEFAULT_ABI}" ]] ; then |
| 216 | hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}" |
263 | hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}" |
| 217 | fi |
264 | fi |
| 218 | done |
265 | done |
| … | |
… | |
| 237 | |
284 | |
| 238 | echo ${order} |
285 | echo ${order} |
| 239 | return 0 |
286 | return 0 |
| 240 | } |
287 | } |
| 241 | |
288 | |
|
|
289 | # @FUNCTION: get_all_abis |
|
|
290 | # @DESCRIPTION: |
| 242 | # Return a list of the ABIs supported by this profile. |
291 | # Return a list of the ABIs supported by this profile. |
| 243 | # the last one in the list being the default. |
292 | # the last one in the list being the default. |
| 244 | get_all_abis() { |
293 | get_all_abis() { |
| 245 | local order="" |
294 | local order="" |
| 246 | |
295 | |
| … | |
… | |
| 258 | |
307 | |
| 259 | echo ${order} |
308 | echo ${order} |
| 260 | return 0 |
309 | return 0 |
| 261 | } |
310 | } |
| 262 | |
311 | |
| 263 | # get_all_libdirs() |
312 | # @FUNCTION: get_all_libdirs |
|
|
313 | # @DESCRIPTION: |
| 264 | # Returns a list of all the libdirs used by this profile. This includes |
314 | # Returns a list of all the libdirs used by this profile. This includes |
| 265 | # those that might not be touched by the current ebuild. |
315 | # those that might not be touched by the current ebuild and always includes |
|
|
316 | # "lib". |
| 266 | get_all_libdirs() { |
317 | get_all_libdirs() { |
| 267 | local libdirs="lib" |
318 | local libdirs="lib" |
| 268 | local abi |
319 | local abi |
| 269 | local dir |
320 | local dir |
| 270 | |
321 | |
| 271 | if has_multilib_profile; then |
|
|
| 272 | for abi in ${MULTILIB_ABIS}; do |
322 | for abi in ${MULTILIB_ABIS}; do |
| 273 | [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})" |
323 | [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})" |
| 274 | done |
324 | 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 | |
325 | |
| 281 | echo "${libdirs}" |
326 | echo "${libdirs}" |
| 282 | } |
327 | } |
| 283 | |
328 | |
|
|
329 | # @FUNCTION: is_final_abi |
|
|
330 | # @DESCRIPTION: |
| 284 | # Return true if ${ABI} is the last ABI on our list (or if we're not |
331 | # 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 |
332 | # 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} |
333 | # if we're in the last (or only) run through src_{unpack,compile,install} |
| 287 | is_final_abi() { |
334 | is_final_abi() { |
| 288 | has_multilib_profile || return 0 |
335 | has_multilib_profile || return 0 |
| 289 | local ALL_ABIS=$(get_install_abis) |
336 | local ALL_ABIS=$(get_install_abis) |
| 290 | local LAST_ABI=${ALL_ABIS/* /} |
337 | local LAST_ABI=${ALL_ABIS/* /} |
| 291 | [[ ${LAST_ABI} == ${ABI} ]] |
338 | [[ ${LAST_ABI} == ${ABI} ]] |
| 292 | } |
339 | } |
| 293 | |
340 | |
|
|
341 | # @FUNCTION: number_abis |
|
|
342 | # @DESCRIPTION: |
| 294 | # echo the number of ABIs we will be installing for |
343 | # echo the number of ABIs we will be installing for |
| 295 | number_abis() { |
344 | number_abis() { |
| 296 | get_install_abis | wc -w |
345 | get_install_abis | wc -w |
| 297 | } |
346 | } |
| 298 | |
347 | |
| 299 | # get_ml_incdir [<include dir> [<ABI>]] |
348 | # @FUNCTION: get_ml_incdir |
|
|
349 | # @USAGE: [include_dir] [ABI] |
|
|
350 | # @DESCRIPTION: |
| 300 | # include dir defaults to /usr/include |
351 | # include dir defaults to /usr/include |
| 301 | # ABI defaults to ${ABI} or ${DEFAULT_ABI} |
352 | # ABI defaults to ${ABI} or ${DEFAULT_ABI} |
|
|
353 | # |
|
|
354 | # If a multilib include dir is associated with the passed include dir, then |
|
|
355 | # we return it, otherwise, we just echo back the include dir. This is |
|
|
356 | # neccessary when a built script greps header files rather than testing them |
|
|
357 | # via #include (like perl) to figure out features. |
| 302 | get_ml_incdir() { |
358 | get_ml_incdir() { |
| 303 | local dir=/usr/include |
359 | local dir=/usr/include |
| 304 | |
360 | |
| 305 | if [[ $# -gt 0 ]]; then |
361 | if [[ $# -gt 0 ]]; then |
| 306 | incdir=$1 |
362 | incdir=$1 |
| … | |
… | |
| 323 | else |
379 | else |
| 324 | echo ${dir} |
380 | echo ${dir} |
| 325 | fi |
381 | fi |
| 326 | } |
382 | } |
| 327 | |
383 | |
| 328 | # prep_ml_includes: |
384 | # @FUNCTION: prep_ml_includes |
| 329 | # |
385 | # @DESCRIPTION: |
| 330 | # Some includes (include/asm, glibc, etc) are ABI dependent. In this case, |
386 | # 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 |
387 | # 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 |
388 | # 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 |
389 | # 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 |
390 | # 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). |
391 | # files are installed in (default is /usr/include if none are passed). |
| 336 | # |
392 | # |
| 337 | # Example: |
393 | # Example: |
| 338 | # src_install() { |
394 | # src_install() { |
| 339 | # ... |
395 | # ... |
| 340 | # prep_ml_includes /usr/qt/3/include |
396 | # prep_ml_includes /usr/qt/3/include |
| 341 | # } |
397 | # } |
| 342 | |
|
|
| 343 | prep_ml_includes() { |
398 | prep_ml_includes() { |
| 344 | if [[ $(number_abis) -gt 1 ]] ; then |
399 | if [[ $(number_abis) -gt 1 ]] ; then |
| 345 | local dir |
400 | local dir |
| 346 | local dirs |
401 | local dirs |
| 347 | local base |
402 | local base |
| … | |
… | |
| 378 | done |
433 | done |
| 379 | fi |
434 | fi |
| 380 | fi |
435 | fi |
| 381 | } |
436 | } |
| 382 | |
437 | |
|
|
438 | # @FUNCTION: create_ml_includes |
|
|
439 | # @USAGE: <include_dir> <symbol_1>:<dir_1> [<symbol_2>:<dir_2>...] |
|
|
440 | # @DESCRIPTION: |
| 383 | # If you need more control than prep_ml_includes can offer (like linux-headers |
441 | # 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 |
442 | # 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 |
443 | # 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. |
444 | # <symbol> is what is put in the #ifdef for choosing that dir. |
| 387 | # |
445 | # |
| 388 | # Ideas for this code came from debian's sparc-linux headers package. |
446 | # Ideas for this code came from debian's sparc-linux headers package. |
| 389 | # |
447 | # |
| 390 | # Example: |
448 | # Example: |
| 391 | # create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64 |
449 | # 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 |
450 | # create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64 |
|
|
451 | # |
|
|
452 | # Warning: Be careful with the ordering here. The default ABI has to be the |
|
|
453 | # last, because it is always defined (by GCC) |
| 393 | create_ml_includes() { |
454 | create_ml_includes() { |
| 394 | local dest=$1 |
455 | local dest=$1 |
| 395 | shift |
456 | shift |
| 396 | local basedirs=$(create_ml_includes-listdirs "$@") |
457 | local basedirs=$(create_ml_includes-listdirs "$@") |
| 397 | |
458 | |
| … | |
… | |
| 530 | echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@" |
591 | echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@" |
| 531 | # exit because we'll likely be called from a subshell |
592 | # exit because we'll likely be called from a subshell |
| 532 | exit 1 |
593 | exit 1 |
| 533 | } |
594 | } |
| 534 | |
595 | |
|
|
596 | # @FUNCTION: get_libname |
|
|
597 | # @USAGE: [version] |
|
|
598 | # @DESCRIPTION: |
|
|
599 | # Returns libname with proper suffix {.so,.dylib} and optionally supplied version |
|
|
600 | # for ELF/MACH-O shared objects |
|
|
601 | # |
|
|
602 | # Example: |
|
|
603 | # get_libname libfoo ${PV} |
|
|
604 | # Returns: libfoo.so.${PV} (ELF) || libfoo.${PV}.dylib (MACH) |
| 535 | get_libname() { |
605 | get_libname() { |
| 536 | local libname |
606 | local libname |
| 537 | local ver=$1 |
607 | local ver=$1 |
| 538 | case ${CHOST} in |
608 | case ${CHOST} in |
|
|
609 | mingw*|*-mingw*) libname="dll";; |
| 539 | *-darwin*) libname="dylib";; |
610 | *-darwin*) libname="dylib";; |
| 540 | *) libname="so";; |
611 | *) libname="so";; |
| 541 | esac |
612 | esac |
| 542 | |
613 | |
| 543 | if [[ -z $@ ]] ; then |
614 | if [[ -z $* ]] ; then |
| 544 | echo ".${libname}" |
615 | echo ".${libname}" |
| 545 | else |
616 | else |
| 546 | for ver in "$@" ; do |
617 | for ver in "$@" ; do |
| 547 | case ${CHOST} in |
618 | case ${CHOST} in |
| 548 | *-darwin*) echo ".${ver}.${libname}";; |
619 | *-darwin*) echo ".${ver}.${libname}";; |
| … | |
… | |
| 565 | export CDEFINE_x86="__i386__" |
636 | export CDEFINE_x86="__i386__" |
| 566 | export LIBDIR_x86="lib" |
637 | export LIBDIR_x86="lib" |
| 567 | |
638 | |
| 568 | export CFLAGS_amd64=${CFLAGS_amd64--m64} |
639 | export CFLAGS_amd64=${CFLAGS_amd64--m64} |
| 569 | export CHOST_amd64=${CTARGET} |
640 | export CHOST_amd64=${CTARGET} |
| 570 | export CTARGET_amd64=${CTARGET_amd64} |
641 | export CTARGET_amd64=${CHOST_amd64} |
| 571 | export CDEFINE_amd64="__x86_64__" |
642 | export CDEFINE_amd64="__x86_64__" |
| 572 | export LIBDIR_amd64="lib64" |
643 | export LIBDIR_amd64="lib64" |
| 573 | |
644 | |
| 574 | export MULTILIB_ABIS="amd64 x86" |
645 | export MULTILIB_ABIS="amd64 x86" |
| 575 | export DEFAULT_ABI="amd64" |
646 | export DEFAULT_ABI="amd64" |
| … | |
… | |
| 648 | export MULTILIB_ABIS="default" |
719 | export MULTILIB_ABIS="default" |
| 649 | export DEFAULT_ABI="default" |
720 | export DEFAULT_ABI="default" |
| 650 | ;; |
721 | ;; |
| 651 | esac |
722 | esac |
| 652 | } |
723 | } |
|
|
724 | |
|
|
725 | # @FUNCTION: multilib_toolchain_setup |
|
|
726 | # @DESCRIPTION: |
|
|
727 | # Hide multilib details here for packages which are forced to be compiled for a |
|
|
728 | # specific ABI when run on another ABI (like x86-specific packages on amd64) |
|
|
729 | multilib_toolchain_setup() { |
|
|
730 | export ABI=$1 |
|
|
731 | |
|
|
732 | if has_version app-admin/eselect-compiler ; then |
|
|
733 | # Binutils doesn't have wrappers for ld and as (yet). Eventually it |
|
|
734 | # will, and all this can just be handled with CHOST. |
|
|
735 | export LD="ld $(get_abi_LDFLAGS $1)" |
|
|
736 | export AS="as $(get_abi_ASFLAGS $1)" |
|
|
737 | |
|
|
738 | export CHOST=$(get_abi_CHOST $1) |
|
|
739 | export CBUILD=$(get_abi_CHOST $1) |
|
|
740 | else |
|
|
741 | tc-export CC |
|
|
742 | fi |
|
|
743 | } |