From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 1C84F138010 for ; Mon, 25 Mar 2013 22:22:14 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id B660AE06D7; Mon, 25 Mar 2013 22:22:09 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id D8BDCE05EB for ; Mon, 25 Mar 2013 22:22:08 +0000 (UTC) Received: from pomiocik.lan (87-205-59-1.adsl.inetia.pl [87.205.59.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: mgorny) by smtp.gentoo.org (Postfix) with ESMTPSA id 1883033DB47; Mon, 25 Mar 2013 22:22:06 +0000 (UTC) From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= To: gentoo-dev@lists.gentoo.org Cc: aballier@gentoo.org, =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Subject: [gentoo-dev] [PATCH] Support wrapping headers for multilib ABIs. Date: Mon, 25 Mar 2013 23:22:55 +0100 Message-Id: <1364250175-29611-1-git-send-email-mgorny@gentoo.org> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <20130324210108.4a408c31@portable> References: <20130324210108.4a408c31@portable> Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org X-Archives-Salt: e8b275f7-a2e1-4c2b-b92d-13a9b59c7773 X-Archives-Hash: f30c7098031f045c81e97c468c8f6f9d This time using a template like Alexis suggested. I've only added the ABIs currently supported by multilib-build. Feel free to provide me with a more complete one. --- gx86/eclass/autotools-multilib.eclass | 93 +++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/gx86/eclass/autotools-multilib.eclass b/gx86/eclass/autotools-multilib.eclass index d7372b0..ccbaac6 100644 --- a/gx86/eclass/autotools-multilib.eclass +++ b/gx86/eclass/autotools-multilib.eclass @@ -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 } -- 1.8.1.5