Як остаточно включити scl CentOS 6.4?


33

Я встановив нову версію devtoolset (1.1) і цікавився, як я б ішов про постійне встановлення цих параметрів за замовчуванням. Прямо зараз, коли я впадаю на свій сервер під управлінням CentOS, я повинен запустити цю командуscl enable devtoolset-1.1 bash

Я спробував додати його до ~ / .bashrc і просто вставити його в останній рядок, без успіху.

Відповіді:


62

У вашому ~/.bashrcабо ~/.bash_profileпросто джерелі сценарій "включити", наданий devtoolset. Наприклад, для Devtoolset 2 командою є:

source /opt/rh/devtoolset-2/enable

або

source scl_source enable devtoolset-2

Набагато ефективніше: без форкбомби, без хитрої оболонки


Це було застосовано на центри 6.8. Лише незначна зміна на "source / opt / rh / devtoolset-3 / enable"
JonnyRo

1
пошук цього файлу все ще працює з devtoolset-7
datdinhquoc

1
@datdinhquoc так, потрібно джерело/opt/rh/devtoolset-7/enable
Destroyica

13

Альтернативою source /opt/rh/devtoolset-4/enableє

source scl_source enable devtoolset-4

Наведений вище сценарій оболонки scl_sourceє більш елегантним, ніж використання жорстко закодованого контуру (може бути різним на іншій машині). Однак scl_sourceробить менше, тому що /opt/rh/devtoolset-4/enableвикористовує scl_sourceта інші речі.

Для використання scl_sourceвам, можливо, доведеться оновити пакетscl-utils

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

Швидка копія-вставка

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

Вихідний код для допитливих людей

Приклад scl_sourceвихідного коду:
https://gist.github.com/bkabrda/6435016

scl_sourceВстановлено на моєму 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

Проблема полягає в тому, що scl enable devtoolset-1.1 bashстворюється нова оболонка bash. Отже, коли ви поміщаєте його у свій .bashrc, він створює нову оболонку ... яка завантажує ваш .bashrc, який працюєscl enable devtoolset-1.1 bash , який створює нову оболонку, яка завантажує ваш .bashrc ... Forkbomb!

Ви, мабуть, хочете щось подібне у своєму .bashrc:

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

або

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • перший продовжить форкбомбу, якщо devtoolset-1.1 не містить gcc 4.7.2, а також не працюватиме, якщо ваше рідне середовище має gcc 4.7.2.
  • це створює нову оболонку, як вище. Отже, коли ви створите своє вікно терміналу або ssh сеанс, ви будете проводити два bash сеанси, і вам доведеться exitдвічі.

Дякуємо, що знайшли час для відповіді. Я дійсно отримав вилкову бомбу і не зрозумів чому, але це має ідеальний сенс. Схоже, використання scl enable devtoolset-1.1 bash - це не практичний шлях, тому я збираюся використовувати лише версію 4.7.2, а не старішу версію. Чи потрібно мені просто видалити старішу версію devtools і зробити деякі інші речі, щоб мати лише одну версію?
th3v0id

Якщо у вас є кореневі привілеї на машині і ніколи не потрібна старіша версія gcc (або інших інструментів у devtoolset-1.1), то так, ви можете просто встановити останню останню gcc. Не потрібно видаляти devtoolset, просто не робіть scl enableцього.
rob05c

Готча. Так, у мене є кореневі дозволи. Як ви "встановлюєте" речі на самому собі? Обидва встановлені, але мені потрібно запускати scl enableкожного разу, коли я відкриваю нову сесію ssh. Я прошу вибачення за ці нубішські питання, але я не впевнений, як іти про встановлення нової версії за замовчуванням. Чи є змінна середовище, яку мені потрібно експортувати у своєму баш-профілі?
th3v0id

Здається, ви не розумієте, як працюють scl і devtoolset. Devtoolset - це колекція для колекцій програмного забезпечення (SCL). SCL дозволяє використовувати декілька версій одного інструменту. Наприклад, якщо вам потрібні GCC 4.4 та GCC 4.7 на одній машині, ви можете це зробити за допомогою SCL. GCC 4.7 насправді не встановлений у вашій системі, він знаходиться в середовищі SCL. Насправді встановлена ​​лише старіша версія (4.4?). Щоб встановити додатки на власній основі, використовуйте диспетчер пакунків вашого дистрибутива. Для Ubuntu це apt-get, наприклад sudo apt-get install gcc. У CentOS це yum, наприклад sudo yum install gcc.
rob05c

Я підозрюю, що у вас є стара версія CentOS, яка ще не має gcc4.7 у yum. Я б робив sudo yum update && sudo yum install gccі перевіряв gcc --version. Якщо це не 4,7, то, ймовірно, доведеться використовувати devtoolset. Якщо ви не хочете запускати його в SCL, ви можете видалити власний gcc із, sudo yum remove gccа потім додати до свого каталогу каталог devtoolset, тобто помістити export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binу свій .bashrc. Це дозволить набрати gccабо g++отримати devtoolset gcc4.7.
rob05c

0

Альтернативний спосіб знайти сценарій, згаданий в інших відповідях, - це дозволити менеджеру пакунків сказати вам, де він живе.

Це те, що ми намагаємося використовувати інструменти dotnet на наших бродячих машинах RHEL / CentOS.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.