Comment activer en permanence scl CentOS 6.4?

33

J'ai installé une version plus récente de devtoolset (1.1) et je me demandais comment définir de manière permanente la valeur par défaut. À l'heure actuelle, lorsque je ssh sur mon serveur exécutant CentOS, je dois exécuter cette commandescl enable devtoolset-1.1 bash

J'ai essayé de l'ajouter à ~ / .bashrc et de le coller simplement sur la dernière ligne, sans succès.

th3v0id
la source

Réponses:

62

Dans votre ~/.bashrcou ~/.bash_profilesimplement sourcez le script "enable" fourni avec le devtoolset. Par exemple, avec Devtoolset 2, la commande est la suivante:

source /opt/rh/devtoolset-2/enable

ou

source scl_source enable devtoolset-2

Beaucoup plus efficace: pas de forkbomb, pas de shell difficile

Destroyica
la source
C'était applicable sur les centos 6,8. Juste un changement mineur à "source / opt / rh / devtoolset-3 / enable"
JonnyRo
1
la recherche de ce fichier fonctionne toujours avec devtoolset-7
datdinhquoc
1
@datdinhquoc oui, vous devez vous procurer/opt/rh/devtoolset-7/enable
Destroyica le
13

Une alternative de source /opt/rh/devtoolset-4/enableest

source scl_source enable devtoolset-4

Le script shell ci-dessus scl_sourceest plus élégant que d'utiliser un chemin codé en dur (peut être différent sur une autre machine). Cependant scl_sourcefait moins parce que /opt/rh/devtoolset-4/enableutilise scl_sourceet d'autres trucs.

Pour utiliser, scl_sourcevous devrez peut-être mettre à jour le paquetscl-utils

yum update scl-utils  # old scl-utils versions miss scl_source

Copier-coller rapide

echo 'source scl_source enable devtoolset-4' >> ~/.bashrc
    # Do not forget to change the version ↑

Code source pour les curieux

Un exemple de scl_sourcecode source:
https://gist.github.com/bkabrda/6435016

Le scl_sourceinstallé sur mon Red Hat 7.1

#!/bin/bash

_scl_source_help="Usage: source scl_source <action> [<collection> ...]

Don't use this script outside of SCL scriptlets!

Options:
    -h, --help    display this help and exit"

if [ $# -eq 0 -o $1 = "-h" -o $1 = "--help" ]; then
    echo "$_scl_source_help"
    return 0
fi


if [ -z "$_recursion" ]; then
    _recursion="false"
fi
if [ -z "$_scl_scriptlet_name" ]; then
    # The only allowed action in the case of recursion is the same
    # as was the original
    _scl_scriptlet_name=$1
fi
shift 1

if [ -z "$_scl_dir" ]; then
    # No need to re-define the directory twice
    _scl_dir=/etc/scl/conf
    if [ ! -e $_scl_dir ]; then
        _scl_dir=/etc/scl/prefixes
    fi
fi

for arg in "$@"; do
    _scl_prefix_file=$_scl_dir/$arg
    _scl_prefix=`cat $_scl_prefix_file 2> /dev/null`
    if [ $? -ne 0 ]; then
        echo "Can't read $_scl_prefix_file, $arg is probably not installed."
        return 1
    fi

    # First check if the collection is already in the list
    # of collections to be enabled
    for scl in ${_scls[@]}; do
        if [ $arg == $scl ]; then
            continue 2
        fi
    done

    # Now check if the collection isn't already enabled
    /usr/bin/scl_enabled $arg > /dev/null 2> /dev/null
    if [ $? -ne 0 ]; then
        _scls+=($arg)
        _scl_prefixes+=($_scl_prefix)
    fi;
done

if [ $_recursion == "false" ]; then
    _i=0
    _recursion="true"
    while [ $_i -lt ${#_scls[@]} ]; do
        _scl_scriptlet_path="${_scl_prefixes[$_i]}/${_scls[$_i]}/${_scl_scriptlet_name}"
        source "$_scl_scriptlet_path"
        if [ $? -ne 0 ]; then
            echo "Can't source $_scl_scriptlet_name, skipping."
        else
            export X_SCLS="${_scls[$_i]} $X_SCLS"
        fi;
        _i=$(($_i+1))
    done
    _scls=()
    _scl_prefixes=()
    _scl_scriptlet_name=""
    _recursion="false"
fi
olibre
la source
3

Le problème est que scl enable devtoolset-1.1 bashcrée un nouveau shell bash. Donc, lorsque vous le mettez dans votre .bashrc, il crée un nouveau shell ... qui charge votre .bashrc, qui s'exécute scl enable devtoolset-1.1 bash, qui crée un nouveau shell, qui charge votre .bashrc ... Forkbomb!

Vous voulez probablement quelque chose comme ça dans votre .bashrc:

if [ "$(gcc -dumpversion)" != "4.7.2" ]; then 
  scl enable devtoolset-1.1 bash
fi

ou

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • le premier continuera à se débrouiller si devtoolset-1.1 ne contient pas gcc 4.7.2, et échouera également si votre environnement natif a gcc 4.7.2.
  • cela crée un nouveau shell, comme ci-dessus. Ainsi, lorsque vous créez votre fenêtre de terminal ou votre session ssh, vous participez à deux sessions bash et vous devez le faire exitdeux fois.
rob05c
la source
Merci de prendre le temps de répondre. J'ai effectivement eu une fourchette et je ne comprenais pas pourquoi, mais cela a du sens. Il semble que l’utilisation de scl enable devtoolset-1.1 bash n’est pas la solution pratique, car je ne m’utiliserai que dans la version 4.7.2 et non dans l’ancienne version. Aurais-je juste besoin de supprimer l'ancienne version de devtools et de faire d'autres choses pour n'avoir qu'une seule version?
th3v0id
Si vous avez les privilèges root sur la machine et que vous n'avez jamais besoin de l'ancienne version de gcc (ou des autres outils de devtoolset-1.1), alors oui, vous voudrez peut-être simplement installer le dernier gcc de manière native. Vous n'êtes pas obligé de supprimer devtoolset, mais ne le faites pas scl enable.
rob05c
Je t'ai eu. Oui, j'ai des permissions root. Comment "installez-vous" les choses de manière native? Les deux sont installés mais je dois exécuter à scl enablechaque fois que j'ouvre une nouvelle session SSH. Je m'excuse pour ces questions noobish, mais je ne suis pas sûr de savoir comment définir la nouvelle version par défaut. Existe-t-il une variable d'environnement que je dois exporter dans mon profil bash?
th3v0id
On dirait que vous ne comprenez pas comment fonctionnent scl et devtoolset. Devtoolset est une collection de collections de logiciels (SCL). SCL vous permet d'utiliser plusieurs versions du même outil. Par exemple, si vous avez besoin de GCC 4.4 et de GCC 4.7 sur le même ordinateur, vous pouvez le faire avec SCL. GCC 4.7 n'est pas vraiment installé sur votre système, il est dans l'environnement SCL. Seule l'ancienne version (4.4?) Est réellement installée. Pour installer les applications de manière native, utilisez le gestionnaire de paquets de votre distribution. Sur Ubuntu, c'est apt-get, par exemple sudo apt-get install gcc. Sur CentOS, c'est miam, par exemple sudo yum install gcc.
rob05c
Je suppose que vous avez une ancienne version de CentOS qui n’a pas encore gcc4.7 dans yum. Je ferais sudo yum update && sudo yum install gccet vérifierais gcc --version. Si ce n'est pas le 4.7, vous devrez probablement utiliser devtoolset. Si vous ne voulez pas l'exécuter dans SCL, vous pouvez désinstaller le gcc natif avec sudo yum remove gcc, puis ajouter le répertoire devtoolset à votre chemin, c'est-à-dire mettre export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binvotre .bashrc. Cela vous permettra de taper gccou g++et d’obtenir le devtoolset gcc4.7.
rob05c
0

Une autre façon de localiser le script mentionné dans d'autres réponses consiste à laisser votre gestionnaire de paquets vous dire où il se trouve.

C'est ce que nous essayons d'intégrer aux outils dotnet sur nos machines à vagabond RHEL / CentOS.

source $(rpm -ql rh-dotnet20-runtime|grep -E /enable$)

Kenchilada
la source