¿Cómo habilitar permanentemente scl CentOS 6.4?


33

Instalé una versión más nueva de devtoolset (1.1) y me preguntaba cómo haría para configurarlos de forma permanente como predeterminados. En este momento, cuando ingreso a mi servidor con CentOS, tengo que ejecutar este comandoscl enable devtoolset-1.1 bash

Intenté agregarlo a ~ / .bashrc y simplemente pegarlo en la última línea, sin éxito.

Respuestas:


62

En su fuente ~/.bashrco en ~/.bash_profileSimply, la secuencia de comandos "enable" que se proporciona con devtoolset. Por ejemplo, con Devtoolset 2, el comando es:

source /opt/rh/devtoolset-2/enable

o

source scl_source enable devtoolset-2

Mucho más eficiente: sin bifurcación, sin caparazón complicado


Esto era aplicable en centos 6.8. Solo un cambio menor a "source / opt / rh / devtoolset-3 / enable"
JonnyRo

1
este archivo todavía funciona con devtoolset-7
datdinhquoc

1
@datdinhquoc sí, necesitas fuente/opt/rh/devtoolset-7/enable
Destroyica

13

Una alternativa de source /opt/rh/devtoolset-4/enablees

source scl_source enable devtoolset-4

El script de shell anterior scl_sourcees más elegante que usar una ruta codificada (puede ser diferente en otra máquina). Sin embargo, scl_sourcehace menos porque /opt/rh/devtoolset-4/enableusa scl_sourcey otras cosas.

Para usarlo scl_sourcepuede que tenga que actualizar el paquetescl-utils

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

Copiar y pegar rápido

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

Código fuente para personas curiosas

Un ejemplo de scl_sourcecódigo fuente:
https://gist.github.com/bkabrda/6435016

El scl_sourceinstalado en mi 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

El problema es que scl enable devtoolset-1.1 bashcrea un nuevo shell bash. Entonces, cuando lo pones en tu .bashrc, crea un nuevo shell ... que carga tu .bashrc, que se ejecuta scl enable devtoolset-1.1 bash, que crea un nuevo shell, que carga tu .bashrc ... ¡Forkbomb!

Probablemente quieras algo como esto en tu .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
  • el primero continuará en forkbomb si devtoolset-1.1 no contiene gcc 4.7.2, y tampoco funcionará si su entorno nativo tiene gcc 4.7.2.
  • Esto crea un nuevo shell, como se indicó anteriormente. Entonces, cuando cree su ventana de terminal o sesión ssh, estará en dos sesiones bash y tendrá que hacerlo exitdos veces.

Gracias por tomarse el tiempo para responder. De hecho, obtuve una bomba tenedor y no entendí por qué, pero eso tiene mucho sentido. Parece que usar scl enable devtoolset-1.1 bash no es la forma práctica de hacerlo, ya que solo voy a usar 4.7.2 y no a la versión anterior. ¿Necesitaría eliminar la versión anterior de devtools y hacer otras cosas para tener solo una versión?
th3v0id

Si tiene privilegios de root en la máquina y nunca necesita la versión anterior de gcc (o de las otras herramientas en devtoolset-1.1), entonces sí, puede instalar el último gcc de forma nativa. No tiene que eliminar devtoolset, simplemente no lo haga scl enable.
rob05c

Gotcha Sí, tengo permisos de root. ¿Cómo se "instalan" las cosas de forma nativa? Ambos están instalados pero tengo que ejecutar scl enablecada vez que abro una nueva sesión ssh. Pido disculpas por estas preguntas novatas, pero no estoy seguro de cómo configurar la versión más nueva como predeterminada. ¿Hay una variable de entorno que necesito exportar en mi perfil de bash?
th3v0id

Parece que no entiendes cómo funcionan scl y devtoolset. Devtoolset es una colección para Software Collections (SCL). SCL le permite usar múltiples versiones de la misma herramienta. Por ejemplo, si necesita GCC 4.4 y GCC 4.7 en la misma máquina, puede hacerlo con SCL. GCC 4.7 no está realmente instalado en su sistema, está en el entorno SCL. Solo la versión anterior (4.4?) Está realmente instalada. Para instalar aplicaciones de forma nativa, use el administrador de paquetes de su distribución. En Ubuntu, esto es apt-get, por ejemplo sudo apt-get install gcc. En CentOS, esto es rico, por ejemplo sudo yum install gcc.
rob05c

Sospecho que tiene una versión anterior de CentOS que todavía no tiene gcc4.7 en yum. Lo haría sudo yum update && sudo yum install gccy comprobaría gcc --version. Si no es 4.7, entonces probablemente deba usar devtoolset. Si no desea ejecutarlo en SCL, puede desinstalar el gcc nativo con sudo yum remove gccy luego agregar el directorio devtoolset a su ruta, es decir, ponerlo export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binen su .bashrc. Eso le permitirá escribir gcco g++y obtener el devtoolset gcc4.7.
rob05c

0

Una forma alternativa de localizar el script mencionado en otras respuestas es dejar que su administrador de paquetes le diga dónde vive.

Esto es lo que ejecutamos para extraer las herramientas dotnet en nuestras máquinas vagabundas RHEL / CentOS.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.