Jak na stałe włączyć scl CentOS 6.4?

33

Zainstalowałem nowszą wersję devtoolset (1.1) i zastanawiałem się, jak na stałe ustawić te domyślne. W tej chwili, kiedy ssh na moim serwerze z CentOS, muszę uruchomić to poleceniescl enable devtoolset-1.1 bash

Próbowałem dodać go do ~ / .bashrc i po prostu wkleić w ostatnim wierszu, bez powodzenia.

th3v0id
źródło

Odpowiedzi:

62

W twoim ~/.bashrclub po ~/.bash_profileprostu skrypcie „enable” dostarczonym z devtoolset. Na przykład w Devtoolset 2 polecenie to:

source /opt/rh/devtoolset-2/enable

lub

source scl_source enable devtoolset-2

Dużo bardziej wydajny: bez widełek, bez trudnej powłoki

Destroyica
źródło
Miało to zastosowanie do centów 6,8. Drobna zmiana na „source / opt / rh / devtoolset-3 / enable”
JonnyRo
1
źródło ten plik nadal działa z devtoolset-7
datdinhquoc
1
@datdinhquoc tak, musisz źródła/opt/rh/devtoolset-7/enable
Destroyica
13

Alternatywą source /opt/rh/devtoolset-4/enablejest

source scl_source enable devtoolset-4

Powyższy skrypt powłoki scl_sourcejest bardziej elegancki niż użycie ścieżki zakodowanej na stałe (może być inny na innym komputerze). Jednak scl_sourcerobi mniej, ponieważ /opt/rh/devtoolset-4/enableużywa scl_sourcei innych rzeczy.

Aby użyć scl_source, może być konieczne uaktualnienie pakietuscl-utils

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

Szybkie kopiowanie-wklejanie

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

Kod źródłowy dla ciekawskich ludzi

Przykład scl_sourcekodu źródłowego:
https://gist.github.com/bkabrda/6435016

scl_sourceZainstalowane na 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
źródło
3

Problem polega na tym, że scl enable devtoolset-1.1 bashtworzy nową powłokę bash. Więc kiedy umieścisz go w swoim .bashrc, tworzy on nową powłokę ... która ładuje .bashrc, która działa scl enable devtoolset-1.1 bash, która tworzy nową powłokę, która ładuje twój .bashrc ... Forkbomb!

Prawdopodobnie chcesz czegoś takiego w swoim .bashrc:

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

lub

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • pierwszy będzie kontynuował rozwiązywanie problemów, jeśli devtoolset-1.1 nie zawiera gcc 4.7.2, a także przestanie działać, jeśli twoje rodzime środowisko ma gcc 4.7.2.
  • tworzy to nową powłokę, jak wyżej. Kiedy tworzysz okno terminala lub sesję ssh, będziesz w dwóch sesjach bash i będziesz musiał exitdwa razy.
rob05c
źródło
Dziękuję za poświęcony czas na odpowiedź. Rzeczywiście dostałem bombę widelcową i nie rozumiem dlaczego, ale to ma sens. Wygląda na to, że użycie scl devasholset-1.1 bash nie jest praktycznym rozwiązaniem, ponieważ zamierzam używać tylko wersji 4.7.2, a nie starszej wersji. Czy musiałbym po prostu usunąć starszą wersję devtools i zrobić kilka innych rzeczy, aby mieć tylko jedną wersję?
th3v0id
Jeśli masz uprawnienia roota na komputerze i nigdy nie potrzebujesz starszej wersji gcc (lub innych narzędzi w devtoolset-1.1), to tak, możesz po prostu zainstalować najnowszą gcc natywnie. Nie musisz usuwać devtoolset, po prostu nie rób scl enabletego.
rob05c
Gotcha Tak, mam uprawnienia roota. Jak „instalować” rzeczy natywnie? Oba są zainstalowane, ale muszę je uruchamiać za scl enablekażdym razem, gdy otwieram nową sesję ssh. Przepraszam za te noobistyczne pytania, ale nie jestem pewien, jak przejść do ustawiania nowszej wersji jako domyślnej. Czy istnieje zmienna środowiskowa, którą muszę wyeksportować w moim profilu bash?
th3v0id
Wygląda na to, że nie rozumiesz, jak działa scl i devtoolset. Devtoolset to kolekcja dla kolekcji oprogramowania (SCL). SCL pozwala korzystać z wielu wersji tego samego narzędzia. Na przykład, jeśli potrzebujesz GCC 4.4 i GCC 4.7 na tym samym komputerze, możesz to zrobić za pomocą SCL. GCC 4.7 nie jest tak naprawdę zainstalowany w twoim systemie, jest w środowisku SCL. Tylko starsza wersja (4.4?) Jest naprawdę zainstalowana. Aby zainstalować aplikacje natywnie, użyj menedżera pakietów swojej dystrybucji. W Ubuntu jest to apt-get, np sudo apt-get install gcc. W CentOS jest to mniam, np sudo yum install gcc.
rob05c
Podejrzewam, że masz starą wersję CentOS, która nie ma jeszcze gcc4.7 w yum. Zrobiłbym sudo yum update && sudo yum install gcci sprawdził gcc --version. Jeśli nie jest to 4.7, prawdopodobnie musisz użyć devtoolset. Jeśli nie chcesz uruchamiać go w SCL, możesz odinstalować natywną gcc za pomocą, sudo yum remove gcca następnie dodać katalog devtoolset do swojej ścieżki, tj. Umieścić export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binw .bashrc. To pozwoli Ci wpisać gcclub g++uzyskać devtoolset gcc4.7.
rob05c,
0

Alternatywnym sposobem zlokalizowania skryptu wymienionego w innych odpowiedziach jest powiadomienie menedżera pakietów, gdzie on mieszka.

Właśnie dlatego uruchamiamy narzędzia dotnet na naszych błędnych maszynach RHEL / CentOS.

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

kenchilada
źródło