diff options
-rw-r--r-- | eclass/multilib-build.eclass | 106 |
1 files changed, 38 insertions, 68 deletions
diff --git a/eclass/multilib-build.eclass b/eclass/multilib-build.eclass index a2decd9..2cdfc7f 100644 --- a/eclass/multilib-build.eclass +++ b/eclass/multilib-build.eclass @@ -402,48 +402,13 @@ multilib_parallel_foreach_abi() { multibuild_parallel_foreach_variant _multilib_multibuild_wrapper "${@}" } -# @FUNCTION: multilib_for_best_abi -# @USAGE: <argv>... -# @DESCRIPTION: -# Runs the given command with setup for the 'best' (usually native) ABI. -multilib_for_best_abi() { - debug-print-function ${FUNCNAME} "${@}" - - eqawarn "QA warning: multilib_for_best_abi() function is deprecated and should" - eqawarn "not be used. Use multilib_for_native_abi instead" - - multilib_for_native_abi "${@}" -} - -# @FUNCTION: multilib_for_native_abi -# @USAGE: <argv>.... -# @DESCRIPTION: -# While iterating through ABIs, allows one to temporarily assume the context of -# the native ABI, and then resume iterating where one left off. If called outside -# of multilib ABI iteration, this acts as a noop-wrapper, simply invoking its -# arguments and returning the result. -multilib_for_native_abi() { - debug-print-function ${FUNCNAME} "${@}" - - if multilib_is_native_abi; then - "${@}" - else - do_if_is_native_multilib_variant() { - [[ ${MULTIBUILD_VARIANT#*.} == ${DEFAULT_ABI:-default} ]] || - return 0 - _multilib_multibuild_wrapper "${@}" - } - multibuild_foreach_variant do_if_is_native_multilib_variant "${@}" - fi -} - # @ECLASS-VARIABLE: MULTILIB_UNCHECKED_HEADERS # @DESCRIPTION: # A list of header files to ignore when checking for header conflicts. # If an ebuild or eclass author has implemented their own solution # to a possible header conflict, (if appropriate, that solution may # simply be to ignore it, which would typically result in the -# native ABI's header being installed (see: multilib_for_native_abi) +# native ABI's header being installed. # # This variable has to be a bash array. Paths shall be relative to # installation root (${ED}), and name regular files. @@ -836,7 +801,21 @@ _EOF_ : fi touch --reference="${root}${f}" "${root}${f}-${ABI}" || die "Cant touch \"${root}${f}-${ABI}\"" - rm -f "${root}${f}" + + # if the file is redundantly in MULTILIB_CHOST_TOOLS, we mustn't remove it. + local remove_it=yes + for f1 in "${MULTILIB_CHOST_TOOLS[@]}" ; do + # strip leading slashes + f1="${f1#/}" + [[ ${f1} =~ ^/+ ]] && f1="${f1#${BASH_REMATCH[0]}}" + # and then usr/include + f1="${f1#usr/include}" + if [[ ${f} == ${f1} ]] ; then + remove_it=no + break + fi + done + [[ ${remove_it} == yes ]] && { rm -f "${root}${f}" || die ; } else ln -T "${root}${f}" "${root}${f}-${ABI}" || die # make wrapper like original @@ -849,7 +828,8 @@ _EOF_ touch --reference="${root}${f}" "${root}${f}-${ABI}" || die "Cant touch \"${root}${f}-${ABI}\"" fi - if [[ ${generate_wrapper} == yes && ! -f "${ED}tmp/multilib-bin-wrappers/${f}" ]]; then + if multilib_is_native_abi && \ + [[ ${generate_wrapper} == yes && ! -f "${ED}tmp/multilib-bin-wrappers/${f}" ]]; then # we need to get the enabled abis in case somehow we are invoked by an inner layer of multi-ness local max_abi_len=0 a enabled_abis=( $(multilib_get_enabled_abis) ) for a in "${enabled_abis[@]}" ; do @@ -943,26 +923,20 @@ _EOF_ } _EOF_ - do_executable_wrapper_compile() { - einfo "Performing wrapper compilation in \"${fwrap_dir}\"." - pushd "${fwrap_dir}" > /dev/null || die - # we can just do normal tc-getCC here and it will almost always work; - # however, technically, the best ABI doesn't have to be the same as - # the native ABI -- therefore we follow the standard recipe: - local cc=${CC:-$(tc-getCC)} - ebegin "Compiling wrapper: ${cc} ${CFLAGS} ${f_c} -c -o ${f_c%.c}.o" - "${cc}" ${CFLAGS} "${f_c}" -c -o "${f_c%.c}.o" || \ - { eend $? ; die "executable wrapper compilation failed for ${f_c} in \"${fwrap_dir}\"" ; } - einfo "Linking wrapper: ${cc} ${LDFLAGS} ${f_c%.c}.o -o ${f_c%.c}" - "${cc}" ${LDFLAGS} "${f_c%.c}.o" -o "${f_c%.c}" || \ - { eend $? ; die "executable wrapper linking failed for ${f_c%.c}.o in \"${fwrap_dir}\"" ; } - einfo "Deploying compiled wrapper to staging area in \"/tmp/multilib-bin-wrappers/${dir}\"." - mkdir -p "${ED}tmp/multilib-bin-wrappers/${dir}" || die - cp "${f_c%.c}" "${ED}tmp/multilib-bin-wrappers/${f}" || die - eend $? - popd > /dev/null || die - } - multilib_for_native_abi do_executable_wrapper_compile + einfo "Performing wrapper compilation in \"${fwrap_dir}\"." + pushd "${fwrap_dir}" > /dev/null || die + local cc=${CC:-$(tc-getCC)} + ebegin "Compiling wrapper: ${cc} ${CFLAGS} ${f_c} -c -o ${f_c%.c}.o" + ${cc} ${CFLAGS} "${f_c}" -c -o "${f_c%.c}.o" || \ + { eend $? ; die "executable wrapper compilation failed for ${f_c} in \"${fwrap_dir}\"" ; } + einfo "Linking wrapper: ${cc} ${LDFLAGS} ${f_c%.c}.o -o ${f_c%.c}" + ${cc} ${LDFLAGS} "${f_c%.c}.o" -o "${f_c%.c}" || \ + { eend $? ; die "executable wrapper linking failed for ${f_c%.c}.o in \"${fwrap_dir}\"" ; } + einfo "Deploying compiled wrapper to staging area." + mkdir -p "${ED}tmp/multilib-bin-wrappers/${dir}" || die + cp "${f_c%.c}" "${ED}tmp/multilib-bin-wrappers/${f}" || die + eend $? + popd > /dev/null || die # make wrapper-executable like -ABI wrapped executable chown -c --reference="${root}${f}-${ABI}" "${ED}tmp/multilib-bin-wrappers/${f}" || \ die "Cant chown \"${ED}tmp/multilib-bin-wrappers/${f}\"" @@ -1043,17 +1017,13 @@ _EOF_ die "\"${root}${f}\" seems 'semantically oversaturated'; giving up the ghost." fi - # always copy whatever it is to the ${CHOST}-prefixed name - cp "${root}${f}" "${root}${dir}/${CHOST}-${fn}" || die + # move whatever it is to the ${CHOST}-prefixed name + mv "${root}${f}" "${root}${dir}/${CHOST}-${fn}" || die - # symlink the native one back (unless it's redundantly @wrapped -- in that case, leave it be) - if multilib_is_native_abi; then - if [[ ${dosymlink} == yes ]]; then - rm "${root}${f}" || die - ln -s "${CHOST}-${fn}" "${root}${f}" || die - fi - else - rm "${root}${f}" || die + # symlink the native one back (unless it's redundantly @wrapped) + if multilib_is_native_abi && [[ ${dosymlink} == yes ]]; then + ln -s "${CHOST}-${fn}" "${root}${f}" || die + einfo "MULTILIB_CHOST_TOOLS: re-created \"${root}${f}\" as a symlink to \"${CHOST}-${fn}\"." fi done } |