#!/bin/bash # Copyright 1999-2004 Gentoo Technologies, Inc. # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/sys-devel/cc-config/files/cc-config-1.2.8,v 1.3 2004/03/06 04:14:45 vapier Exp $ # Author: Martin Schlemmer source /etc/init.d/functions.sh || { echo "$0: Could not source /etc/init.d/functions.sh!" exit 1 } usage() { cat << "USAGE_END" Usage: cc-config [Option] [CC Profile] Change the current cc/gcc profile, or give info about profiles. Options: --use-old Use the old profile if one was selected. --use-portage-chost Only set to given profile if its CHOST is the same as that set for portage in /etc/make.conf (or one of other portage config files...). --get-current-profile Print current used gcc profile. --list-profiles Print a list of available profiles. --print-environ Print environment that can be used to setup things for current gcc profile, or specified one ... --get-bin-path Print path where binaries of given/current profile are located. --get-lib-path Print path where libraries of given/current profile are located. --get-stdcxx-incdir Print path to g++ include files of given/current profile. The profile name is in the form of: - For example: i686-pc-linux-gnu-3.2.1 USAGE_END exit 1 } if [ "$#" -lt 1 ] then usage fi cmd_setup() { # Sourcing /etc/env.d/gcc/${CC_COMP} is going to mess up # PATH among things... CP="$(find_path cp)" RM="$(find_path rm)" MV="$(find_path mv)" LN="$(find_path ln)" CAT="$(find_path cat)" AWK="$(find_path gawk)" GREP="$(find_path grep)" FIND="$(find_path find)" CHMOD="$(find_path chmod)" TOUCH="$(find_path touch)" ENV_UPDATE="$(find_path env-update)" } find_path() { [ -z "$1" ] && return 0 for x in /bin /sbin /usr/bin /usr/sbin do if [ -x ${x}/$1 -a -r ${x}/$1 ] then echo "${x}/$1" break fi done } CC_COMP="" REAL_CHOST="$(/usr/bin/python -c 'import portage; print portage.settings["CHOST"];')" switch_profile() { local MY_LDPATH="" local GCC_PROFILES="" if [ "$(id -u)" -ne 0 ] then eerror "$0: Must be root." exit 1 fi ebegin "Switching to ${CC_COMP} compiler" # Sourcing /etc/env.d/gcc/${CC_COMP} is going to mess up # PATH among things... cmd_setup # Order our profiles to have the default first... # We do this so that we can have them ordered with default # first in /etc/ld.so.conf, as the logical is that all # compilers for default CHOST will be used to compile stuff, # and thus we want all their lib paths in /etc/ld.so.conf ... GCC_PROFILES="$(${FIND} /etc/env.d/gcc/ -name "${REAL_CHOST}-*")" GCC_PROFILES="${GCC_PROFILES/\/etc\/env.d\/gcc\/${CC_COMP}}" GCC_PROFILES="/etc/env.d/gcc/${CC_COMP} ${GCC_PROFILES}" # Extract all LDPATH's for our CHOST for x in ${GCC_PROFILES} do if [ -f ${x} ] then source ${x} if [ -z "${MY_LDPATH}" ] then if [ -d ${LDPATH} ] then MY_LDPATH="${LDPATH}" fi else if [ -d ${LDPATH} ] then MY_LDPATH="${MY_LDPATH}:${LDPATH}" fi fi fi done # Setup things properly again for this profile source /etc/env.d/gcc/${CC_COMP} # Setup /etc/env.d/05gcc ${AWK} '!/^STDCXX_INCDIR=|^LDPATH=/ {print $0}' \ /etc/env.d/gcc/${CC_COMP} > /etc/env.d/05gcc # Add our custom LDPATH echo "LDPATH=\"${MY_LDPATH}\"" >> /etc/env.d/05gcc # Make sure we do not recreate /lib/cpp and /usr/bin/cc ... # echo "DISABLE_GEN_GCC_WRAPPERS=\"yes\"" >> /etc/env.d/05gcc echo "CURRENT=${CC_COMP}" > /etc/env.d/gcc/config source /etc/profile # These might not be installed, and we want to update the mtime # for ccache and distcc anyhow ... ${RM} -f /lib/cpp ${CP} -f /usr/lib/gcc-config/wrapper /lib/cpp for x in gcc cpp cc c++ g++ ${CHOST}-gcc ${CHOST}-c++ ${CHOST}-g++ do ${RM} -f /usr/bin/${x} ${CP} -f /usr/lib/gcc-config/wrapper /usr/bin/${x} ${TOUCH} -m /usr/bin/${x} done ${ENV_UPDATE} &> /dev/null eend 0 return 0 } get_current_profile() { if [ ! -f /etc/env.d/gcc/config ] then eerror "$0: No gcc profile is active!" return 1 fi source /etc/env.d/gcc/config if [ -z "${CURRENT}" ] then eerror "$0: No gcc profile is active!" return 1 fi echo "${CURRENT}" return 0 } list_profiles() { if [ ! -f /etc/env.d/gcc/config ] then eerror "$0: No gcc profile is active!" return 1 fi for x in /etc/env.d/gcc/* do if [ -f ${x} -a ${x} != "/etc/env.d/gcc/config" ] then echo "${x##*/}" fi done } print_environ() { local OLDPATH="${PATH}" source /etc/env.d/gcc/${CC_COMP} echo "export PATH=\"${PATH}:${OLDPATH}\"" # if [ -z "${LD_LIBRARY_PATH}" ] # then # echo "export LD_LIBRARY_PATH=\"${LDPATH}\"" # else # echo "export LD_LIBRARY_PATH=\"${LDPATH}:${LD_LIBRARY_PATH}\"" # fi echo "export CC=\"${CC}\"" echo "export CXX=\"${CXX}\"" } get_bin_path() { source /etc/env.d/gcc/${CC_COMP} echo "${PATH}" return 0 } get_lib_path() { source /etc/env.d/gcc/${CC_COMP} echo "${LDPATH}" return 0 } get_stdcxx_incdir() { source /etc/env.d/gcc/${CC_COMP} echo "${LDPATH}/include/${STDCXX_INCDIR}" return 0 } NEED_ACTION="yes" DOIT="switch_profile" CHECK_CHOST="no" for x in $* do case ${x} in # Only use specified compiler if one is not already selected. --use-old) if get_current_profile &> /dev/null then CC_COMP="$(get_current_profile)" fi ;; --use-portage-chost) CHECK_CHOST="yes" ;; --get-current-profile) if [ "${NEED_ACTION}" = "yes" ] then NEED_ACTION="no" DOIT="get_current_profile" fi ;; --list-profiles) if [ "${NEED_ACTION}" = "yes" ] then NEED_ACTION="no" DOIT="list_profiles" fi ;; --print-environ) if [ "${NEED_ACTION}" = "yes" ] then NEED_ACTION="no" DOIT="print_environ" fi ;; --get-bin-path) if [ "${NEED_ACTION}" = "yes" ] then NEED_ACTION="no" DOIT="get_bin_path" fi ;; --get-lib-path) if [ "${NEED_ACTION}" = "yes" ] then NEED_ACTION="no" DOIT="get_lib_path" fi ;; --get-stdcxx-incdir) if [ "${NEED_ACTION}" = "yes" ] then NEED_ACTION="no" DOIT="get_stdcxx_incdir" fi ;; *) if [ -z "${CC_COMP}" ] then CC_COMP="${x}" fi ;; esac done if [ "${DOIT}" = "switch_profile" -a -z "${CC_COMP}" ] then usage fi if [ -z "${CC_COMP}" ] then if get_current_profile &> /dev/null then CC_COMP="$(get_current_profile)" else eerror "$0: No default profile setup!" exit 1 fi fi if [ ! -d /usr/lib/gcc-lib/${CC_COMP%-*}/${CC_COMP##*-} -o \ ! -f /etc/env.d/gcc/${CC_COMP} ] then eerror "$0: Profile does not exist!" exit 1 fi # Chosen CHOST are not the same as the real CHOST according to make.conf, # and --use-portage-chost option was given, so do nothing ... if [ "${CHECK_CHOST}" = "yes" -a "${CC_COMP%-*}" != "${REAL_CHOST}" ] then exit 0 fi eval ${DOIT} # vim:ts=4