Como habilitar permanentemente o scl CentOS 6.4?

33

Eu instalei uma versão mais recente do devtoolset (1.1) e fiquei imaginando como iria defini-los permanentemente como padrão. Agora, quando eu ssh no meu servidor executando o CentOS, eu tenho que executar este comandoscl enable devtoolset-1.1 bash

Tentei adicioná-lo ao ~ / .bashrc e simplesmente colá-lo na última linha, sem êxito.

th3v0id
fonte

Respostas:

62

Na sua fonte ~/.bashrcou no ~/.bash_profileSimply, o script "enable" fornecido com o devtoolset. Por exemplo, com o Devtoolset 2, o comando é:

source /opt/rh/devtoolset-2/enable

ou

source scl_source enable devtoolset-2

Muito mais eficiente: sem forkbomb, sem casca complicada

Destroyica
fonte
Isso foi aplicável no centos 6.8. Apenas uma pequena alteração em "source / opt / rh / devtoolset-3 / enable"
JonnyRo
1
terceirização deste arquivo ainda está trabalhando com devtoolset-7
datdinhquoc
1
@datdinhquoc sim, você precisa fonte/opt/rh/devtoolset-7/enable
Destroyica
13

Uma alternativa de source /opt/rh/devtoolset-4/enableé

source scl_source enable devtoolset-4

O script shell acima scl_sourceé mais elegante do que usar um caminho codificado (pode ser diferente em outra máquina). No entanto, scl_sourcefaz menos porque /opt/rh/devtoolset-4/enableusos scl_sourcee outras coisas.

Para usar, scl_sourcetalvez seja necessário atualizar o pacotescl-utils

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

Copiar e colar rapidamente

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

Código fonte para pessoas curiosas

Um exemplo de scl_sourcecódigo fonte:
https://gist.github.com/bkabrda/6435016

O scl_sourceinstalado no meu 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
fonte
3

O problema é que scl enable devtoolset-1.1 bashcria um novo shell bash. Então, quando você o coloca no seu .bashrc, ele cria um novo shell ... que carrega o seu .bashrc, que é executado scl enable devtoolset-1.1 bash, cria um novo shell, que carrega o seu .bashrc ... Forkbomb!

Você provavelmente quer algo assim no seu .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
  • o primeiro continuará a forkbomb se o devtoolset-1.1 não contiver o gcc 4.7.2 e também falhará se o ambiente nativo tiver o gcc 4.7.2.
  • isso cria um novo shell, como acima. Portanto, quando você criar sua janela de terminal ou sessão ssh, estará em duas sessões bash e precisará fazê-lo exitduas vezes.
rob05c
fonte
Obrigado por reservar um tempo para responder. Na verdade, eu peguei uma bomba e não entendi o porquê, mas isso faz todo o sentido. Parece que o uso do scl enable devtoolset-1.1 bash não é o caminho prático a seguir, já que eu vou usar o 4.7.2 e não a versão mais antiga. Eu precisaria apenas remover a versão mais antiga do devtools e fazer algumas outras coisas para ter apenas uma versão?
th3v0id
Se você possui privilégios de root na máquina e nunca precisa da versão mais antiga do gcc (ou de outras ferramentas do devtoolset-1.1), então sim, convém instalar o último gcc nativamente. Você não precisa remover o devtoolset, apenas não precisa scl enable.
rob05c
Peguei vocês. Sim, eu tenho permissões de root. Como você "instala" as coisas nativamente? Ambos estão instalados, mas eu tenho que executar scl enabletoda vez que abro uma nova sessão ssh. Peço desculpas por essas perguntas noobish, mas não sei como definir a versão mais recente como padrão. Existe uma variável de ambiente que eu preciso exportar no meu perfil do bash?
Th3v0id
Parece que você não entende como o scl e o devtoolset funcionam. Devtoolset é uma coleção de coleções de software (SCL). O SCL permite usar várias versões da mesma ferramenta. Por exemplo, se você precisar do GCC 4.4 e do GCC 4.7 na mesma máquina, poderá fazê-lo com o SCL. O GCC 4.7 não está realmente instalado no seu sistema, está no ambiente do SCL. Somente a versão mais antiga (4.4?) Está realmente instalada. Para instalar aplicativos nativamente, use o gerenciador de pacotes da sua distribuição. No Ubuntu, isso é o apt-get, por exemplo sudo apt-get install gcc. No CentOS, isso é yum, por exemplo sudo yum install gcc.
rob05c
Eu suspeito que você tenha uma versão antiga do CentOS que ainda não tem o gcc4.7 no yum. Eu faria sudo yum update && sudo yum install gcce verifique gcc --version. Se não for 4.7, você provavelmente precisará usar o devtoolset. Se você não deseja executá-lo no SCL, pode desinstalar o gcc nativo sudo yum remove gcce adicionar o diretório devtoolset ao seu caminho, ou seja, colocar export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binno seu .bashrc. Isso permitirá que você digite gccou g++obtenha o devtoolset gcc4.7.
rob05c
0

Uma maneira alternativa de localizar o script mencionado em outras respostas é deixar seu gerente de pacotes lhe dizer onde ele mora.

É isso que corremos para extrair as ferramentas dotnet em nossas máquinas vagantes RHEL / CentOS.

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

kenchilada
fonte