diff options
author | Michał Górny <mgorny@gentoo.org> | 2013-04-07 16:56:14 +0000 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2013-04-07 16:56:14 +0000 |
commit | 1a0dc6da18297420bb813828ed2cc13cad931f39 (patch) | |
tree | f17ad3d1a465481a08b6464e3f71d5128c1c6651 /eclass/multilib-build.eclass | |
parent | fix deps (diff) | |
download | gentoo-2-1a0dc6da18297420bb813828ed2cc13cad931f39.tar.gz gentoo-2-1a0dc6da18297420bb813828ed2cc13cad931f39.tar.bz2 gentoo-2-1a0dc6da18297420bb813828ed2cc13cad931f39.zip |
Move header wrapping to multilib-build. Use the new code in autotools-multilib and multilib-minimal.
Diffstat (limited to 'eclass/multilib-build.eclass')
-rw-r--r-- | eclass/multilib-build.eclass | 136 |
1 files changed, 135 insertions, 1 deletions
diff --git a/eclass/multilib-build.eclass b/eclass/multilib-build.eclass index dbaed70ad773..5e8cb54344bc 100644 --- a/eclass/multilib-build.eclass +++ b/eclass/multilib-build.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/multilib-build.eclass,v 1.10 2013/03/09 13:52:05 mgorny Exp $ +# $Header: /var/cvsroot/gentoo-x86/eclass/multilib-build.eclass,v 1.11 2013/04/07 16:56:14 mgorny Exp $ # @ECLASS: multilib-build.eclass # @MAINTAINER: @@ -204,5 +204,139 @@ multilib_copy_sources() { multibuild_copy_sources } +# @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 replaced 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 + +# @FUNCTION: multilib_prepare_wrappers +# @USAGE: [<install-root>] +# @DESCRIPTION: +# Perform the preparation of all kinds of wrappers for the current ABI. +# This function shall be called once per each ABI, after installing +# the files to be wrapped. +# +# Takes an optional custom <install-root> from which files will be +# used. If no root is specified, uses ${ED}. +# +# The files to be wrapped are specified using separate variables, +# e.g. MULTILIB_WRAPPED_HEADERS. Those variables shall not be changed +# between the successive calls to multilib_prepare_wrappers +# and multilib_install_wrappers. +# +# After all wrappers are prepared, multilib_install_wrappers shall +# be called to commit them to the installation tree. +multilib_prepare_wrappers() { + debug-print-function ${FUNCNAME} "${@}" + + [[ ${#} -le 1 ]] || die "${FUNCNAME}: too many arguments" + + local root=${1:-${ED}} + 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 "${root}/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 multilib-build.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 +} + +# @FUNCTION: multilib_install_wrappers +# @USAGE: [<install-root>] +# @DESCRIPTION: +# Install the previously-prepared wrappers. This function shall +# be called once, after all wrappers were prepared. +# +# Takes an optional custom <install-root> to which the wrappers will be +# installed. If no root is specified, uses ${ED}. There is no need to +# use the same root as when preparing the wrappers. +# +# The files to be wrapped are specified using separate variables, +# e.g. MULTILIB_WRAPPED_HEADERS. Those variables shall not be changed +# between the calls to multilib_prepare_wrappers +# and multilib_install_wrappers. +multilib_install_wrappers() { + debug-print-function ${FUNCNAME} "${@}" + + [[ ${#} -le 1 ]] || die "${FUNCNAME}: too many arguments" + + local root=${1:-${ED}} + + if [[ -d "${ED}"/tmp/multilib-include ]]; then + multibuild_merge_root \ + "${ED}"/tmp/multilib-include "${root}"/usr/include + # it can fail if something else uses /tmp + rmdir "${ED}"/tmp &>/dev/null + fi +} + _MULTILIB_BUILD=1 fi |