Come abilitare permanentemente scl CentOS 6.4?


33

Ho installato una versione più recente di devtoolset (1.1) e mi chiedevo come avrei fatto a impostarle permanentemente come predefinite. In questo momento, quando utilizzo SSH sul mio server con CentOS, devo eseguire questo comandoscl enable devtoolset-1.1 bash

Ho provato ad aggiungerlo a ~ / .bashrc e semplicemente incollarlo sull'ultima riga, senza successo.

Risposte:


62

Nel tuo ~/.bashrco ~/.bash_profilesemplicemente sorgente lo script "abilita" fornito con devtoolset. Ad esempio, con Devtoolset 2, il comando è:

source /opt/rh/devtoolset-2/enable

o

source scl_source enable devtoolset-2

Molto più efficiente: nessun forkbomb, nessun guscio difficile


Questo era applicabile su centos 6.8. Solo una piccola modifica a "source / opt / rh / devtoolset-3 / enable"
JonnyRo,

1
l'approvvigionamento di questo file funziona ancora con devtoolset-7
datdinhquoc il

1
@datdinhquoc sì, devi procurarti/opt/rh/devtoolset-7/enable
Destroyica il

13

Un'alternativa di source /opt/rh/devtoolset-4/enableè

source scl_source enable devtoolset-4

Lo script di shell sopra scl_sourceè più elegante rispetto all'utilizzo di un percorso hard coded (potrebbe essere diverso su un altro computer). Tuttavia scl_sourcefa meno perché /opt/rh/devtoolset-4/enableusi scl_sourcee altre cose.

Per utilizzare scl_sourcepotrebbe essere necessario aggiornare il pacchettoscl-utils

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

Copia-incolla veloce

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

Codice sorgente per curiosi

Un esempio di scl_sourcecodice sorgente:
https://gist.github.com/bkabrda/6435016

La scl_sourceinstallato sul mio 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

3

Il problema è che scl enable devtoolset-1.1 bashcrea una nuova shell bash. Quindi quando lo metti nel tuo .bashrc, crea una nuova shell ... che carica il tuo .bashrc, che viene eseguito scl enable devtoolset-1.1 bash, che crea una nuova shell, che carica il tuo .bashrc ... Forkbomb!

Probabilmente vuoi qualcosa del genere nel tuo .bashrc:

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

o

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • il primo continuerà a forkbomb se devtoolset-1.1 non contiene gcc 4.7.2 e non funzionerà anche se l'ambiente nativo ha gcc 4.7.2.
  • questo crea una nuova shell, come sopra. Quindi quando crei la finestra del terminale o la sessione ssh, sarai in due sessioni bash e dovrai farlo exitdue volte.

Grazie per il tempo dedicato a rispondere. In effetti ho una bomba a forcella e non ho capito perché, ma ha perfettamente senso. Sembra che l'uso di scl enable devtoolset-1.1 bash non sia il modo pratico di procedere, dato che mi limiterò a utilizzare 4.7.2 e non la versione precedente. Devo solo rimuovere la versione precedente di devtools e fare alcune altre cose per avere solo una versione?
th3v0id

Se hai i privilegi di root sulla macchina e non hai mai bisogno della versione precedente di gcc (o degli altri strumenti in devtoolset-1.1), allora sì, potresti voler installare nativamente l'ultima versione di gcc. Non è necessario rimuovere devtoolset, non scl enablefarlo.
rob05c,

Gotcha. Sì, ho i permessi di root. Come si "installano" le cose in modo nativo? Entrambi sono installati ma devo eseguire scl enableogni volta che apro una nuova sessione SSH. Mi scuso per queste domande noobish ma non sono sicuro di come impostare la versione più recente come predefinita. Esiste una variabile d'ambiente che devo esportare nel mio profilo bash?
th3v0id

Sembra che tu non capisca come funzionano scl e devtoolset. Devtoolset è una collezione per Software Collections (SCL). SCL ti consente di utilizzare più versioni dello stesso strumento. Ad esempio, se hai bisogno di GCC 4.4 e GCC 4.7 sulla stessa macchina, puoi farlo con SCL. GCC 4.7 non è realmente installato sul tuo sistema, è nell'ambiente SCL. Solo la versione precedente (4.4?) È davvero installata. Per installare app in modo nativo, utilizzare il gestore pacchetti della distro. Su Ubuntu, questo è apt-get, ad es sudo apt-get install gcc. Su CentOS, questo è yum, ad es sudo yum install gcc.
rob05c,

Ho il sospetto che tu abbia una vecchia versione di CentOS che non ha ancora gcc4.7 in yum. Vorrei fare sudo yum update && sudo yum install gcce controllare gcc --version. Se non è 4.7, allora probabilmente devi usare devtoolset. Se non si desidera eseguirlo in SCL, è possibile disinstallare gcc nativo con sudo yum remove gcce quindi aggiungere la directory devtoolset al proprio percorso, ovvero inserire il export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binproprio .bashrc. Ciò ti consentirà di digitare gcco g++e ottenere devtoolset gcc4.7.
rob05c,

0

Un modo alternativo per individuare lo script menzionato in altre risposte è lasciare che il gestore pacchetti ti dica dove vive.

Questo è ciò che corriamo per estrarre gli strumenti dotnet sui nostri vagabondi RHEL / CentOS.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.