diff options
author | Mike Frysinger <vapier@gentoo.org> | 2005-01-04 16:17:13 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2005-01-04 16:17:13 +0000 |
commit | 437d60bb03324b59e4557f7ecf1ec31a4a3ec232 (patch) | |
tree | ec77651e317a2e6751f0a83531a4926da1ce4248 /sys-devel/gcc-config/files | |
parent | Fixing bug #74976 (diff) | |
download | historical-437d60bb03324b59e4557f7ecf1ec31a4a3ec232.tar.gz historical-437d60bb03324b59e4557f7ecf1ec31a4a3ec232.tar.bz2 historical-437d60bb03324b59e4557f7ecf1ec31a4a3ec232.zip |
old
Diffstat (limited to 'sys-devel/gcc-config/files')
-rw-r--r-- | sys-devel/gcc-config/files/digest-gcc-config-1.3.6-r4 | 0 | ||||
-rwxr-xr-x | sys-devel/gcc-config/files/gcc-config-1.3.6 | 484 | ||||
-rw-r--r-- | sys-devel/gcc-config/files/wrapper-1.4.2.c | 312 |
3 files changed, 0 insertions, 796 deletions
diff --git a/sys-devel/gcc-config/files/digest-gcc-config-1.3.6-r4 b/sys-devel/gcc-config/files/digest-gcc-config-1.3.6-r4 deleted file mode 100644 index e69de29bb2d1..000000000000 --- a/sys-devel/gcc-config/files/digest-gcc-config-1.3.6-r4 +++ /dev/null diff --git a/sys-devel/gcc-config/files/gcc-config-1.3.6 b/sys-devel/gcc-config/files/gcc-config-1.3.6 deleted file mode 100755 index 95ea46653b73..000000000000 --- a/sys-devel/gcc-config/files/gcc-config-1.3.6 +++ /dev/null @@ -1,484 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc-config/files/gcc-config-1.3.6,v 1.9 2004/11/28 16:39:49 lv Exp $ -# Author: Martin Schlemmer <azarah@gentoo.org> - -source /etc/init.d/functions.sh || { - echo "$0: Could not source /etc/init.d/functions.sh!" - exit 1 -} - -usage() { -cat << "USAGE_END" -Usage: gcc-config [options] [CC Profile] -Change the current cc/gcc profile, or give info about profiles. - -Options: - - -O, --use-old Use the old profile if one was selected. - - -P, --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...). - - -c, --get-current-profile Print current used gcc profile. - - -l, --list-profiles Print a list of available profiles. - - -E, --print-environ Print environment that can be used to setup the - current gcc profile, or a specified one. - - -B, --get-bin-path Print path where binaries of the given/current - profile are located. - - -L, --get-lib-path Print path where libraries of the given/current - profile are located. - - -X, --get-stdcxx-incdir Print path where g++ include files of the - given/current profile are located. - -Profile names are of the form: <CHOST>-<gcc version> -For example: i686-pc-linux-gnu-3.2.1 -USAGE_END - - exit 1 -} - -if [ "$#" -lt 1 ] -then - usage -fi - -find_path() { - [ -z "$1" ] && return 0 - - local fullpath="$(type -P $1)" - - if [ -x "${fullpath}" ] - then - echo "${fullpath}" - return 0 - fi - - for x in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin - do - if [ -x "${x}/$1" -a -r "${x}/$1" ] - then - echo "${x}/$1" - return 0 - fi - done - - return 0 -} - -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)" -} - -CC_COMP= - -get_real_chost() { - [ -n "${REAL_CHOST}" ] && return 0 - - # Use absolute path until all protage versions have portageq in /usr/bin - export REAL_CHOST="$(/usr/lib/portage/bin/portageq envvar CHOST)" - - if [ -z "${REAL_CHOST}" ] - then - eerror "$0: Could not get portage CHOST!" - return 1 - fi -} - -switch_profile() { - local MY_LDPATH= - local GCC_PROFILES= - local OLD_CC_COMP= - local GCC_BIN_PATH= - - if [ -r /etc/env.d/gcc/config ] - then - source /etc/env.d/gcc/config - - if [ -n "${CURRENT}" ] - then - OLD_CC_COMP="${CURRENT}" - fi - fi - - 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 ... - get_real_chost - 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}" - - # Handle LDPATH's that have multiple directories - local old_IFS="${IFS}" - export IFS=":" - local sub_ldpath= - for sub_ldpath in ${LDPATH} - do - if [ -z "${MY_LDPATH}" ] - then - if [ -d "${sub_ldpath}" ] - then - MY_LDPATH="${sub_ldpath}" - fi - else - if [ -d "${sub_ldpath}" ] - then - MY_LDPATH="${MY_LDPATH}:${sub_ldpath}" - fi - fi - done - export IFS="${old_IFS}" - 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 - - # Save PATH - GCC_BIN_PATH="${PATH}" - # Fix environment - 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++ f77 gcj \ - ${REAL_CHOST}-gcc ${REAL_CHOST}-c++ ${REAL_CHOST}-g++ \ - ${REAL_CHOST}-f77 ${REAL_CHOST}-gcj - do - # Make sure we have no stale wrappers - ${RM} -f "/usr/bin/${x}" - - if [ -x "${GCC_BIN_PATH}/${x}" -o \ - "${x}" = "c++" -o "${x}" = "${REAL_CHOST}-c++" -o \ - "${x}" = "cpp" -o "${x}" = "cc" ] - then - # Only install a wrapper if the binary exists ... - ${CP} -f /usr/lib/gcc-config/wrapper "/usr/bin/${x}" - - if [ "${OLD_CC_COMP}" != "${CC_COMP}" ] - then - ${TOUCH} -m "/usr/bin/${x}" - fi - fi - done - - - ${ENV_UPDATE} &> /dev/null - - eend 0 - - if [ "${OLD_CC_COMP}" != "${CC_COMP}" ] - then - echo - ewarn "If you intend to use the gcc from the new profile in an already" - ewarn "running shell, please remember to do:" - echo - ewarn " # source /etc/profile" - echo - fi - - 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() { - local i=1 - - if [ ! -f /etc/env.d/gcc/config ] - then - eerror "$0: No gcc profile is active!" - return 1 - fi - - get_current_profile > /dev/null - - for x in /etc/env.d/gcc/* - do - if [ -f "${x}" -a "${x}" != "/etc/env.d/gcc/config" ] - then - x="${x##*/}" - [ "${x}" == "${CURRENT}" ] && x="${x} *" - echo "[${i}] ${x}" - i=$((i + 1)) - fi - done -} - -print_environ() { - local OLDPATH="${PATH}" - local ENV_CMD= - local SET_ELEMENT= - - source "/etc/env.d/gcc/${CC_COMP}" - - case ${SHELL} in - */csh|*/tsch) - ENV_CMD="setenv" - SET_ELEMENT=" " - ;; - *) - ENV_CMD="export" - SET_ELEMENT="=" - ;; - esac - - echo "${ENV_CMD} PATH${SET_ELEMENT}\"${PATH}:${OLDPATH}\"" -# if [ -z "${LD_LIBRARY_PATH}" ] -# then -# echo "${ENV_CMD} LD_LIBRARY_PATH${SET_ELEMENT}\"${LDPATH}\"" -# else -# echo "${ENV_CMD} LD_LIBRARY_PATH${SET_ELEMENT}\"${LDPATH}:${LD_LIBRARY_PATH}\"" -# fi - echo "${ENV_CMD} CC${SET_ELEMENT}\"${CC}\"" - echo "${ENV_CMD} CXX${SET_ELEMENT}\"${CXX}\"" -} - -get_bin_path() { - if [ -e /etc/env.d/gcc/${CC_COMP} ] ; then - source "/etc/env.d/gcc/${CC_COMP}" - echo "${PATH}" - else - echo "no-config" - echo "/etc/env.d/gcc/${CC_COMP} doesnt exist" 1>&2 - fi - - return 0 -} - -get_lib_path() { - if [ -e /etc/env.d/gcc/${CC_COMP} ] ; then - source "/etc/env.d/gcc/${CC_COMP}" - echo "${LDPATH}" - else - echo "no-config" - echo "/etc/env.d/gcc/${CC_COMP} doesnt exist" 1>&2 - fi - - return 0 -} - -get_stdcxx_incdir() { - if [ -e /etc/env.d/gcc/${CC_COMP} ] ; then - source "/etc/env.d/gcc/${CC_COMP}" - echo "${LDPATH}/include/${STDCXX_INCDIR}" - else - echo "no-config" - echo "/etc/env.d/gcc/${CC_COMP} doesnt exist" 1>&2 - fi - - 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. - -O|--use-old) - if get_current_profile &> /dev/null - then - CC_COMP="$(get_current_profile)" - fi - ;; - -P|--use-portage-chost) - CHECK_CHOST="yes" - ;; - -c|--get-current-profile) - if [ "${NEED_ACTION}" = "yes" ] - then - NEED_ACTION="no" - DOIT="get_current_profile" - fi - ;; - -l|--list-profiles) - if [ "${NEED_ACTION}" = "yes" ] - then - NEED_ACTION="no" - DOIT="list_profiles" - fi - ;; - -E|--print-environ) - if [ "${NEED_ACTION}" = "yes" ] - then - NEED_ACTION="no" - DOIT="print_environ" - fi - ;; - -B|--get-bin-path) - if [ "${NEED_ACTION}" = "yes" ] - then - NEED_ACTION="no" - DOIT="get_bin_path" - fi - ;; - -L|--get-lib-path) - if [ "${NEED_ACTION}" = "yes" ] - then - NEED_ACTION="no" - DOIT="get_lib_path" - fi - ;; - -X|--get-stdcxx-incdir) - if [ "${NEED_ACTION}" = "yes" ] - then - NEED_ACTION="no" - DOIT="get_stdcxx_incdir" - fi - ;; - -h|--help) - usage - exit 0 - ;; - -v|--version) - echo "gcc-config-PORTAGE-VERSION" - exit 0 - ;; - -*) - eerror "$0: Invalid switch! Run $0 without parameters for help." - exit 1 - ;; - *) - if [ -z "${CC_COMP}" ] - then - if [ -n "`echo ${x} | gawk '/^[[:digit:]]*$/ { print }'`" ] - then - i=1 - for y in /etc/env.d/gcc/* - do - [ "${y}" = "/etc/env.d/gcc/config" ] && continue - - if [ -f "${y}" -a "${x}" -eq "${i}" ] - then - CC_COMP="${y##*/}" - break - else - i=$((i + 1)) - fi - done - else - CC_COMP="${x}" - fi - 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 - -CC_COMP_NO_SPECS=$(echo ${CC_COMP} | awk -F- '{ print $1"-"$2"-"$3"-"$4"-"$5 }') - -GCC_LIB="$(source /etc/env.d/gcc/${CC_COMP} - cmd_setup - echo ${LDPATH} | ${AWK} -F/ '{ print "/"$2"/"$3"/"$4"/" }')" - -if [ ! -d "${ROOT}/${GCC_LIB}/${CC_COMP_NO_SPECS%-*}/${CC_COMP_NO_SPECS##*-}" -o \ - ! -f "/etc/env.d/gcc/${CC_COMP}" ] -then - eerror "$0: Profile does not exist or invalid setting for /etc/env.d/gcc/${CC_COMP}" 1>&2 - #exit 1 -fi - -if [ "${CHECK_CHOST}" = "yes" ] -then - # Chosen CHOST are not the same as the real CHOST according to - # make.conf, and --use-portage-chost option was given, so do nothing - get_real_chost - [ "${CC_COMP%-*}" != "${REAL_CHOST}" ] && exit 0 -fi - -eval ${DOIT} - - -# vim:ts=4 diff --git a/sys-devel/gcc-config/files/wrapper-1.4.2.c b/sys-devel/gcc-config/files/wrapper-1.4.2.c deleted file mode 100644 index 42bf300f5490..000000000000 --- a/sys-devel/gcc-config/files/wrapper-1.4.2.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright 1999-2004 Gentoo Foundation - * Distributed under the terms of the GNU General Public License v2 - * $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc-config/files/wrapper-1.4.2.c,v 1.5 2004/12/09 01:46:23 vapier Exp $ - * Author: Martin Schlemmer <azarah@gentoo.org> - */ - -#define _REENTRANT -#define _GNU_SOURCE - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/param.h> -#include <unistd.h> -#include <wait.h> -#include <libgen.h> -#include <string.h> -#include <stdarg.h> -#include <errno.h> - -#define GCC_CONFIG "/usr/bin/gcc-config" - -#ifndef CC_PROFILE -# define ENVD_FILE "/etc/env.d/05gcc" -#else -# define ENVD_FILE "/etc/env.d/gcc/" CC_PROFILE -#endif - -struct wrapper_data { - char name[MAXPATHLEN + 1]; - char fullname[MAXPATHLEN + 1]; - char bin[MAXPATHLEN + 1]; - char tmp[MAXPATHLEN + 1]; - - char *path; -}; - -static const char *wrapper_strerror(int err, struct wrapper_data *data) -{ - /* this app doesn't use threads and strerror - * is more portable than strerror_r */ - strncpy(data->tmp, strerror(err), sizeof(data->tmp)); - return data->tmp; -} - -static void wrapper_exit(char *msg, ...) -{ - va_list args; - fprintf(stderr, "gcc-config error: "); - va_start(args, msg); - vfprintf(stderr, msg, args); - va_end(args); - exit(1); -} - -/* check_for_target checks in path for the file we are seeking - * it returns 1 if found (with data->bin setup), 0 if not and - * negative on error - */ -static int check_for_target(char *path, struct wrapper_data *data) -{ - struct stat sbuf; - int result = 0; - char str[MAXPATHLEN + 1]; - size_t len = strlen(path) + strlen(data->name) + 2; - - snprintf(str, len, "%s/%s", path, data->name); - - /* Stat possible file to check that - * 1) it exist and is a regular file, and - * 2) it is not the wrapper itself, and - * 3) it is in a /gcc-bin/ directory tree - */ - result = stat(str, &sbuf); - if ((0 == result) && - ((sbuf.st_mode & S_IFREG) || (sbuf.st_mode & S_IFLNK)) && - (0 != strcmp(str, data->fullname)) && - (0 != strstr(str, "/gcc-bin/"))) { - - strncpy(data->bin, str, MAXPATHLEN); - data->bin[MAXPATHLEN] = 0; - result = 1; - } - else - result = 0; - - return result; -} - -static int find_target_in_path(struct wrapper_data *data) -{ - char *token = NULL, *state; - char str[MAXPATHLEN + 1]; - - if (NULL == data->path) return 0; - - /* Make a copy since strtok_r will modify path */ - snprintf(str, MAXPATHLEN + 1, "%s", data->path); - - token = strtok_r(str, ":", &state); - - /* Find the first file with suitable name in PATH. The idea here is - * that we do not want to bind ourselfs to something static like the - * default profile, or some odd environment variable, but want to be - * able to build something with a non default gcc by just tweaking - * the PATH ... */ - while ((NULL != token) && (strlen(token) > 0)) { - - if (check_for_target(token, data)) - return 1; - - token = strtok_r(NULL, ":", &state); - } - - return 0; -} - -/* find_target_in_envd parses /etc/env.d/05gcc, and tries to - * extract PATH, which is set to the current profile's bin - * directory ... - */ -static int find_target_in_envd(struct wrapper_data *data) -{ - FILE *envfile = NULL; - char *token = NULL, *state; - char str[MAXPATHLEN + 1]; - char *strp = str; - - if (NULL == data->path) return 0; - - envfile = fopen(ENVD_FILE, "r"); - if (NULL == envfile) - return 0; - - while (0 != fgets(strp, MAXPATHLEN, envfile)) { - - /* Keep reading ENVD_FILE until we get a line that - * starts with 'PATH=' - */ - if (((strp) && (strlen(strp) > strlen("PATH=")) && - 0 == strncmp("PATH=", strp, strlen("PATH=")))) { - - token = strtok_r(strp, "=", &state); - if ((NULL != token) && (strlen(token) > 0)) - /* The second token should be the value of PATH .. */ - token = strtok_r(NULL, "=", &state); - else { - fclose(envfile); - return 0; - } - - if ((NULL != token) && (strlen(token) > 0)) { - - strp = token; - /* A bash variable may be unquoted, quoted with " or - * quoted with ', so extract the value without those .. - */ - token = strtok(strp, "\n\"\'"); - - while (NULL != token) { - - if (check_for_target(token, data)) { - - fclose(envfile); - return 1; - } - - token = strtok(NULL, "\n\"\'"); - } - } - - } - strp = str; - } - - fclose(envfile); - - return 0; -} - -static void find_wrapper_target(struct wrapper_data *data) -{ - FILE *inpipe = NULL; - char str[MAXPATHLEN + 1]; - -#ifndef CC_PROFILE - if (find_target_in_path(data)) - return; -#endif - - if (find_target_in_envd(data)) - return; - - /* Only our wrapper is in PATH, so - get the CC path using gcc-config and - execute the real binary in there... */ -#ifndef CC_PROFILE - inpipe = popen(GCC_CONFIG " --get-bin-path", "r"); -#else - inpipe = popen(GCC_CONFIG " --get-bin-path " CC_PROFILE, "r"); -#endif - if (NULL == inpipe) - wrapper_exit( - "Could not open pipe: %s\n", - wrapper_strerror(errno, data)); - - if (0 == fgets(str, MAXPATHLEN, inpipe)) - wrapper_exit( - "Could not get compiler binary path: %s\n", - wrapper_strerror(errno, data)); - - strncpy(data->bin, str, sizeof(data->bin) - 1); - data->bin[strlen(data->bin) - 1] = '/'; - strncat(data->bin, data->name, sizeof(data->bin) - 1); - data->bin[MAXPATHLEN] = 0; - - pclose(inpipe); -} - -/* This function modifies PATH to have gcc's bin path appended */ -static void modify_path(struct wrapper_data *data) -{ - char *newpath = NULL, *token = NULL, *state; - char dname_data[MAXPATHLEN + 1], str[MAXPATHLEN + 1]; - char *str2 = dname_data, *dname = dname_data; - size_t len = 0; - - if (NULL == data->bin) - return; - - snprintf(str2, MAXPATHLEN + 1, "%s", data->bin); - - if (NULL == (dname = dirname(str2))) - return; - - if (NULL == data->path) - return; - - /* Make a copy since strtok_r will modify path */ - snprintf(str, MAXPATHLEN + 1, "%s", data->path); - - token = strtok_r(str, ":", &state); - - /* Check if we already appended our bin location to PATH */ - if ((NULL != token) && (strlen(token) > 0)) { - if (0 == strcmp(token, dname)) - return; - } - - len = strlen(dname) + strlen(data->path) + 2 + strlen("PATH") + 1; - - newpath = (char *)malloc(len); - if (NULL == newpath) - wrapper_exit("out of memory\n"); - memset(newpath, 0, len); - - snprintf(newpath, len, "PATH=%s:%s", dname, data->path); - putenv(newpath); -} - -int main(int argc, char **argv) -{ - struct wrapper_data *data; - size_t size; - char *path; - int result = 0; - - data = alloca(sizeof(*data)); - if (NULL == data) - wrapper_exit("%s wrapper: out of memory\n", argv[0]); - memset(data, 0, sizeof(*data)); - - path = getenv("PATH"); - if (NULL != path) { - data->path = strdup(getenv("PATH")); - if (NULL == data->path) - wrapper_exit("%s wrapper: out of memory\n", argv[0]); - } - - /* What should we find ? */ - strcpy(data->name, basename(argv[0])); - - /* cc calls "/full/path/to/gcc" ... */ - if (0 == strcmp(data->name, "cc")) - strcpy(data->name, "gcc"); - - /* What is the full name of our wrapper? */ - size = sizeof(data->fullname); - result = snprintf(data->fullname, size, "/usr/bin/%s", data->name); - if ((-1 == result) || (result > size)) - wrapper_exit("invalid wrapper name: \"%s\"\n", data->name); - - find_wrapper_target(data); - - modify_path(data); - - if (data->path) - free(data->path); - data->path = NULL; - - /* Set argv[0] to the correct binary, else gcc do not find internal - * headers, etc (bug #8132). */ - argv[0] = data->bin; - - /* Ok, do it ... */ - if (execv(data->bin, argv) < 0) - wrapper_exit("Could not run/locate \"%s\"\n", data->name); - - return 0; -} |