On 03/22/2013 12:27 PM, Bernhard Walle wrote: > On Gentoo, the host compiler can only be executed if basename(argv[0]) > is 'gcc' (or 'g++' etc.), not if it's 'gcc.real'. Then it invokes > gcc-config and fails: > > | % ln -s /usr/bin/gcc gcc.real > | % ./gcc.real --version > | > | * gcc-config: Could not get portage CHOST! > | * gcc-config: You should verify that CHOST is set in one of these places: > | * gcc-config: - //etc/portage/make.conf > | * gcc-config: - active environment > | gcc-config: error: could not get compiler binary path: No such file or directory > > I'm not a Gentoo expert (I'm just forced to use it for that purpose ;-)), > so I cannot explain further details. > > This patch makes ptxdist working on Gentoo by changing the symbolic link > from .real to real/, i.e. moving the final toolchain symlink > to some other directory, keeping the basename. > > It only changes that for the host compiler since a (usually manually > built) cross-compiler doesn't have that problem. > > Signed-off-by: Bernhard Walle > --- > bin/ptxdist | 5 +++-- > scripts/wrapper/libwrapper.sh | 9 ++++++++- > 2 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/bin/ptxdist b/bin/ptxdist > index 95382e6..a6317bf 100755 > --- a/bin/ptxdist > +++ b/bin/ptxdist > @@ -588,12 +588,13 @@ check_compiler() { > ;; > esac > > - ln -sf "${cc_abs}" "${PTX_WRAPPER_DIR}/${cc_default}.real" && > + [ -d "${PTX_WRAPPER_DIR}/real" ] || mkdir "${PTX_WRAPPER_DIR}/real" > + ln -sf "${cc_abs}" "${PTX_WRAPPER_DIR}/real/${cc_default}" && > ln -sf "${SCRIPTSDIR}/wrapper/host-${cc_default}-wrapper" "${PTX_WRAPPER_DIR}/${cc_default}" && > > if [ -n "${cc_alternate}" ]; then > ln -sf "${cc_default}" "${PTX_WRAPPER_DIR}/${cc_alternate}" && > - ln -sf "${cc_default}.real" "${PTX_WRAPPER_DIR}/${cc_alternate}.real" > + ln -sf "${cc_default}" "${PTX_WRAPPER_DIR}/real/${cc_alternate}" > fi || \ > ptxd_bailout "unable to create compiler wrapper link" > done > diff --git a/scripts/wrapper/libwrapper.sh b/scripts/wrapper/libwrapper.sh > index f376f7f..adf2f08 100644 > --- a/scripts/wrapper/libwrapper.sh > +++ b/scripts/wrapper/libwrapper.sh > @@ -21,10 +21,17 @@ fi > . ${PTXDIST_PLATFORMCONFIG} > > wrapper_exec() { > + local compiler_link > if [ "${PTXDIST_VERBOSE}" = 1 -a -n "${PTXDIST_FD_LOGFILE}" ]; then > echo "wrapper: ${PTXDIST_CCACHE} ${0##*/} ${ARG_LIST} $* ${LATE_ARG_LIST}" >&${PTXDIST_FD_LOGFILE} > fi > - exec ${PTXDIST_CCACHE} $0.real ${ARG_LIST} "$@" ${LATE_ARG_LIST} > + for c in $0.real "$(dirname $0)/real/$(basename $0)" ; do > + if [ -x "$c" ] ; then > + compiler_link="$c" > + break > + fi > + done We don't want to have this loop in the hot path. Iff we agree on the real/X instead of X.real solution, then you should convert all (host and cross) to use real/X Marc > + exec ${PTXDIST_CCACHE} "$compiler_link" ${ARG_LIST} "$@" ${LATE_ARG_LIST} > } > > cc_check_args() { > -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |