diff options
Diffstat (limited to 'eclass/autotools-multilib.eclass')
-rw-r--r-- | eclass/autotools-multilib.eclass | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/eclass/autotools-multilib.eclass b/eclass/autotools-multilib.eclass index d7372b0d866a..d27c8095ff12 100644 --- a/eclass/autotools-multilib.eclass +++ b/eclass/autotools-multilib.eclass @@ -1,6 +1,6 @@ # Copyright 1999-2013 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/eclass/autotools-multilib.eclass,v 1.12 2013/02/27 21:47:38 mgorny Exp $ +# $Header: /var/cvsroot/gentoo-x86/eclass/autotools-multilib.eclass,v 1.13 2013/04/01 09:18:57 mgorny Exp $ # @ECLASS: autotools-multilib.eclass # @MAINTAINER: @@ -33,6 +33,28 @@ inherit autotools-utils multilib-build EXPORT_FUNCTIONS src_prepare src_configure src_compile src_test src_install +# @ECLASS-VARIABLE: MULTILIB_WRAPPED_HEADERS +# @DESCRIPTION: +# A list of headers to wrap for multilib support. The listed headers +# will be moved to a non-standard location and replace with a file +# including them conditionally to current ABI. +# +# This variable has to be a bash array. Paths shall be relative to +# installation root (${ED}), and name regular files. Recursive wrapping +# is not supported. +# +# Please note that header wrapping is *discouraged*. It is preferred to +# install all headers in a subdirectory of libdir and use pkg-config to +# locate the headers. Some C preprocessors will not work with wrapped +# headers. +# +# Example: +# @CODE +# MULTILIB_WRAPPED_HEADERS=( +# /usr/include/foobar/config.h +# ) +# @CODE + autotools-multilib_src_prepare() { autotools-utils_src_prepare "${@}" } @@ -49,13 +71,84 @@ autotools-multilib_src_test() { multilib_foreach_abi autotools-utils_src_test "${@}" } +_autotools-multilib_wrap_headers() { + debug-print-function ${FUNCNAME} "$@" + local f + + for f in "${MULTILIB_WRAPPED_HEADERS[@]}"; do + # drop leading slash if it's there + f=${f#/} + + if [[ ${f} != usr/include/* ]]; then + die "Wrapping headers outside of /usr/include is not supported at the moment." + fi + # and then usr/include + f=${f#usr/include/} + + local dir=${f%/*} + + # $CHOST shall be set by multilib_toolchain_setup + dodir "/tmp/multilib-include/${CHOST}/${dir}" + mv "${ED}/usr/include/${f}" "${ED}/tmp/multilib-include/${CHOST}/${dir}/" || die + + if [[ ! -f ${ED}/tmp/multilib-include/${f} ]]; then + dodir "/tmp/multilib-include/${dir}" + # a generic template + cat > "${ED}/tmp/multilib-include/${f}" <<_EOF_ || die +/* This file is auto-generated by autotools-multilib.eclass + * as a multilib-friendly wrapper. For the original content, + * please see the files that are #included below. + */ + +#if defined(__x86_64__) /* amd64 */ +# if defined(__ILP32__) /* x32 ABI */ +# error "abi_x86_x32 not supported by the package." +# else /* 64-bit ABI */ +# error "abi_x86_64 not supported by the package." +# endif +#elif defined(__i386__) /* plain x86 */ +# error "abi_x86_32 not supported by the package." +#else +# error "No ABI matched, please report a bug to bugs.gentoo.org" +#endif +_EOF_ + fi + + # XXX: get abi_* directly + local abi_flag + case "${ABI}" in + amd64) + abi_flag=abi_x86_64;; + x86) + abi_flag=abi_x86_32;; + x32) + abi_flag=abi_x86_x32;; + *) + die "Header wrapping for ${ABI} not supported yet";; + esac + + # Note: match a space afterwards to avoid collision potential. + sed -e "/${abi_flag} /s&error.*&include <${CHOST}/${f}>&" \ + -i "${ED}/tmp/multilib-include/${f}" || die + done +} + autotools-multilib_src_install() { autotools-multilib_secure_install() { autotools-utils_src_install "${@}" + _autotools-multilib_wrap_headers # Make sure all headers are the same for each ABI. multilib_check_headers } multilib_foreach_abi autotools-multilib_secure_install "${@}" + + # merge the wrapped headers + if [[ -d "${ED}"/tmp/multilib-include ]]; then + multibuild_merge_root \ + "${ED}"/tmp/multilib-include "${ED}"/usr/include + # it can fail if something else uses /tmp + rmdir "${ED}"/tmp &>/dev/null + fi } |