Wie kann ich scl CentOS 6.4 dauerhaft aktivieren?

33

Ich habe eine neuere Version von devtoolset (1.1) installiert und mich gefragt, wie ich diese dauerhaft als Standard festlegen würde. Momentan muss ich diesen Befehl ausführen, wenn ich auf meinem Server mit CentOS ssh binscl enable devtoolset-1.1 bash

Ich habe versucht, es zu ~ / .bashrc hinzuzufügen und es einfach in die allerletzte Zeile einzufügen, ohne Erfolg.

th3v0id
quelle

Antworten:

62

In Ihrem Quellcode ~/.bashrcoder ~/.bash_profileeinfach das mit dem devtoolset gelieferte "enable" -Skript. Mit dem Devtoolset 2 lautet der Befehl beispielsweise:

source /opt/rh/devtoolset-2/enable

oder

source scl_source enable devtoolset-2

Viel effizienter: keine Gabelbombe, keine knifflige Hülle

Destroyica
quelle
Dies galt für Centos 6.8. Nur eine kleine Änderung an "source / opt / rh / devtoolset-3 / enable"
JonnyRo
1
die beschaffung dieser datei funktioniert immer noch mit devtoolset-7
datdinhquoc
1
@ Datdinhquoc ja, Sie müssen Quelle/opt/rh/devtoolset-7/enable
Destroyica
13

Eine Alternative von source /opt/rh/devtoolset-4/enableist

source scl_source enable devtoolset-4

Das obige Shell-Skript scl_sourceist eleganter als die Verwendung eines fest codierten Pfads (auf einem anderen Computer möglicherweise anders). Tut scl_sourceaber weniger da /opt/rh/devtoolset-4/enablenutzt scl_sourceund sonstiges Zeug.

Zur Verwendung müssen scl_sourceSie möglicherweise das Paket aktualisierenscl-utils

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

Schnelles Kopieren und Einfügen

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

Quellcode für neugierige Menschen

Ein Beispiel für scl_sourceQuellcode:
https://gist.github.com/bkabrda/6435016

Das scl_sourceauf meinem 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
quelle
3

Das Problem ist, dass scl enable devtoolset-1.1 basheine neue Bash-Shell erstellt wird. Wenn Sie es also in Ihre .bashrc einfügen, erstellt es eine neue Shell ... die Ihre .bashrc lädt, die ausgeführt wird scl enable devtoolset-1.1 bash, die eine neue Shell erstellt, die Ihre .bashrc lädt ... Forkbomb!

Wahrscheinlich möchten Sie so etwas in Ihrer .bashrc:

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

oder

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • Die erste Version wird weiterhin explodieren, wenn devtoolset-1.1 nicht gcc 4.7.2 enthält, und funktioniert auch nicht, wenn Ihre native Umgebung gcc 4.7.2 enthält.
  • Dadurch wird wie oben eine neue Shell erstellt. Wenn Sie also Ihr Terminalfenster oder Ihre SSH-Sitzung erstellen, befinden Sie sich in zwei Bash-Sitzungen und müssen dies exitzweimal tun.
rob05c
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben zu antworten. Ich habe in der Tat eine Gabelbombe bekommen und habe nicht verstanden, warum, aber das macht vollkommen Sinn. Es klingt so, als ob die Verwendung von scl enable devtoolset-1.1 bash nicht der praktische Weg ist, da ich nur 4.7.2 und nicht die ältere Version verwenden werde. Würde ich nur die ältere Version von devtools entfernen und einige andere Dinge tun müssen, um nur die eine Version zu haben?
th3v0id
Wenn Sie Root-Rechte auf dem Computer haben und niemals die ältere Version von gcc (oder der anderen Tools in devtoolset-1.1) benötigen, möchten Sie möglicherweise nur den neuesten gcc nativ installieren. Sie müssen devtoolset nicht entfernen, tun Sie scl enablees einfach nicht .
rob05c
Erwischt. Ja, ich habe Root-Berechtigungen. Wie "installieren" Sie die Dinge nativ? Beide sind installiert, aber ich muss scl enablejedes Mal laufen, wenn ich eine neue SSH-Sitzung eröffne. Ich entschuldige mich für diese nüchternen Fragen, bin mir aber nicht sicher, wie ich die neuere Version als Standard festlegen soll. Gibt es eine Umgebungsvariable, die ich in mein Bash-Profil exportieren muss?
th3v0id
Es klingt so, als ob Sie nicht verstehen, wie scl und devtoolset funktionieren. Devtoolset ist eine Sammlung für Software Collections (SCL). Mit SCL können Sie mehrere Versionen desselben Tools verwenden. Wenn Sie beispielsweise GCC 4.4 und GCC 4.7 auf demselben Computer benötigen, können Sie dies mit SCL tun. GCC 4.7 ist nicht wirklich auf Ihrem System installiert, sondern befindet sich in der SCL-Umgebung. Nur die ältere Version (4.4?) Ist wirklich installiert. Um Apps nativ zu installieren, verwenden Sie den Paketmanager Ihrer Distribution. Unter Ubuntu ist das apt-get, z sudo apt-get install gcc. Auf CentOS ist dies lecker, z sudo yum install gcc.
rob05c
Ich vermute, Sie haben eine alte Version von CentOS, die noch nicht gcc4.7 in yum hat. Ich würde tun sudo yum update && sudo yum install gccund überprüfen gcc --version. Wenn es nicht 4.7 ist, müssen Sie wahrscheinlich devtoolset verwenden. Wenn Sie es nicht in SCL ausführen möchten, können Sie den nativen gcc mit deinstallieren sudo yum remove gccund dann das devtoolset-Verzeichnis zu Ihrem Pfad hinzufügen, dh export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binIhre .bashrc-Datei einfügen. Damit können Sie gccoder g++eingeben und das devtoolset gcc4.7 erhalten.
rob05c
0

Eine andere Möglichkeit, das in anderen Antworten erwähnte Skript zu finden, besteht darin, sich von Ihrem Paketmanager mitteilen zu lassen, wo es sich befindet.

Dies ist es, was wir ausführen, um die Dotnet-Tools auf unseren RHEL / CentOS-Vagabund-Maschinen einzuführen.

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

Kenchilada
quelle