# 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 $ # @ECLASS: multilib-build.eclass # @MAINTAINER: # Michał Górny # @BLURB: flags and utility functions for building multilib packages # @DESCRIPTION: # The multilib-build.eclass exports USE flags and utility functions # necessary to build packages for multilib in a clean and uniform # manner. # # Please note that dependency specifications for multilib-capable # dependencies shall use the USE dependency string in ${MULTILIB_USEDEP} # to properly request multilib enabled. if [[ ! ${_MULTILIB_BUILD} ]]; then # EAPI=5 is required for meaningful MULTILIB_USEDEP. case ${EAPI:-0} in 5) ;; *) die "EAPI=${EAPI} is not supported" ;; esac inherit multibuild multilib # @ECLASS-VARIABLE: _MULTILIB_FLAGS # @INTERNAL # @DESCRIPTION: # The list of multilib flags and corresponding ABI values. _MULTILIB_FLAGS=( abi_x86_32:x86 abi_x86_64:amd64 abi_x86_x32:x32 ) # @ECLASS-VARIABLE: MULTILIB_USEDEP # @DESCRIPTION: # The USE-dependency to be used on dependencies (libraries) needing # to support multilib as well. # # Example use: # @CODE # RDEPEND="dev-libs/libfoo[${MULTILIB_USEDEP}] # net-libs/libbar[ssl,${MULTILIB_USEDEP}]" # @CODE _multilib_build_set_globals() { local flags=( "${_MULTILIB_FLAGS[@]%:*}" ) local usedeps=${flags[@]/%/(-)?} IUSE=${flags[*]} MULTILIB_USEDEP=${usedeps// /,} } _multilib_build_set_globals # @FUNCTION: multilib_get_enabled_abis # @DESCRIPTION: # Return the ordered list of enabled ABIs if multilib builds # are enabled. The best (most preferred) ABI will come last. # # If multilib is disabled, the default ABI will be returned # in order to enforce consistent testing with multilib code. multilib_get_enabled_abis() { debug-print-function ${FUNCNAME} "${@}" local abis=( $(get_all_abis) ) local abi i found for abi in "${abis[@]}"; do for i in "${_MULTILIB_FLAGS[@]}"; do local m_abi=${i#*:} local m_flag=${i%:*} if [[ ${m_abi} == ${abi} ]] && use "${m_flag}"; then echo "${abi}" found=1 fi done done if [[ ! ${found} ]]; then # ${ABI} can be used to override the fallback (multilib-portage), # ${DEFAULT_ABI} is the safe fallback. local abi=${ABI:-${DEFAULT_ABI}} debug-print "${FUNCNAME}: no ABIs enabled, fallback to ${abi}" debug-print "${FUNCNAME}: ABI=${ABI}, DEFAULT_ABI=${DEFAULT_ABI}" echo ${abi} fi } # @FUNCTION: _multilib_multibuild_wrapper # @USAGE: ... # @INTERNAL # @DESCRIPTION: # Initialize the environment for ABI selected for multibuild. _multilib_multibuild_wrapper() { debug-print-function ${FUNCNAME} "${@}" local ABI=${MULTIBUILD_VARIANT} multilib_toolchain_setup "${ABI}" "${@}" } # @FUNCTION: multilib_foreach_abi # @USAGE: ... # @DESCRIPTION: # If multilib support is enabled, sets the toolchain up for each # supported ABI along with the ABI variable and correct BUILD_DIR, # and runs the given commands with them. # # If multilib support is disabled, it just runs the commands. No setup # is done. multilib_foreach_abi() { debug-print-function ${FUNCNAME} "${@}" local MULTIBUILD_VARIANTS=( $(multilib_get_enabled_abis) ) multibuild_foreach_variant _multilib_multibuild_wrapper "${@}" } # @FUNCTION: multilib_parallel_foreach_abi # @USAGE: ... # @DESCRIPTION: # If multilib support is enabled, sets the toolchain up for each # supported ABI along with the ABI variable and correct BUILD_DIR, # and runs the given commands with them. The commands are run # in parallel with number of jobs being determined from MAKEOPTS. # # If multilib support is disabled, it just runs the commands. No setup # is done. # # Useful for running configure scripts. multilib_parallel_foreach_abi() { debug-print-function ${FUNCNAME} "${@}" local MULTIBUILD_VARIANTS=( $(multilib_get_enabled_abis) ) multibuild_parallel_foreach_variant _multilib_multibuild_wrapper "${@}" } # @FUNCTION: multilib_for_best_abi # @USAGE: ... # @DESCRIPTION: # Runs the given command with setup for the 'best' (usually native) ABI. multilib_for_best_abi() { debug-print-function ${FUNCNAME} "${@}" local MULTIBUILD_VARIANTS=( $(multilib_get_enabled_abis) ) multibuild_for_best_variant _multilib_multibuild_wrapper "${@}" } # @FUNCTION: multilib_check_headers # @DESCRIPTION: # Check whether the header files are consistent between ABIs. # # This function needs to be called after each ABI's installation phase. # It obtains the header file checksums and compares them with previous # runs (if any). Dies if header files differ. multilib_check_headers() { _multilib_header_cksum() { [[ -d ${ED}usr/include ]] && \ find "${ED}"usr/include -type f \ -exec cksum {} + | sort -k2 } local cksum=$(_multilib_header_cksum) local cksum_file=${T}/.multilib_header_cksum if [[ -f ${cksum_file} ]]; then local cksum_prev=$(< "${cksum_file}") if [[ ${cksum} != ${cksum_prev} ]]; then echo "${cksum}" > "${cksum_file}.new" eerror "Header files have changed between ABIs." if type -p diff &>/dev/null; then eerror "$(diff -du "${cksum_file}" "${cksum_file}.new")" else eerror "Old checksums in: ${cksum_file}" eerror "New checksums in: ${cksum_file}.new" fi die "Header checksum mismatch, aborting." fi else echo "${cksum}" > "${cksum_file}" fi } # @FUNCTION: multilib_copy_sources # @DESCRIPTION: # Create a single copy of the package sources for each enabled ABI. # # The sources are always copied from initial BUILD_DIR (or S if unset) # to ABI-specific build directory matching BUILD_DIR used by # multilib_foreach_abi(). multilib_copy_sources() { debug-print-function ${FUNCNAME} "${@}" local MULTIBUILD_VARIANTS=( $(multilib_get_enabled_abis) ) multibuild_copy_sources } _MULTILIB_BUILD=1 fi