LINUX.ORG.RU

FC4 + gcc 3.4


0

0

Собств все оК только есть одна уж очень капризная програмуллина ей требуется для компиляции gcc 3.4 Можно ли поставить gcc 3.4 не ломая пол системы ? ( те есть ли собранные пакеты ) ?

anonymous

Ответ на: комментарий от Demetrio

Да видимо нет просто нужно скомпилить очередную версию linuxdcpp ... На gcc4 и gcc32 не получается - кто нить может ее скомпилить ?

anonymous
()

В общем так:

1. сносишь gcc4

2. ставишь gcc от 3-й федоры (это как раз 3.4.3)

3. в usr/bin переименовываешь gcov, gcc, g++, i386-redhat-linux-gcc,
i386-redhat-linux-g++ в gcov34, gcc34, g++34, i386-redhat-linux-gcc44,
i386-redhat-linux-g++34

4. Обратно ставишь (не апдейт, а именно установка опцией -i) gcc от
федоры четвертой. Аналогично переименовываешь gcov, gcc, g++,
i386-redhat-linux-gcc, i386-redhat-linux-g++ в gcov40, gcc40, g++40,
i386-redhat-linux-gcc40, i386-redhat-linux-g++40

5. Симлинками делаешь gcc -> gcc34, g++ -> g++34, gcov -> gcov34
и так далее.

После этого gcc твой "вдруг" становится 3.4.3. А когда потом
понадобится 4.0.0 - перекинешь симлинка, и всех проблем. Я вообще
поступил еще проще - написал вот такую программку:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef VARIABLE_NAME
#define VARIABLE_NAME   "GCCVERSION"
#endif

#ifndef DEFAULT_VERSION
#define DEFAULT_VERSION "40"
#endif

int main(int argc, char ** argv) {
    char buf[128];
    char exe[1024];
    char ** args;
    char * newexe;
    int i;

    memset(exe,0,1024);

    sprintf(buf, "/proc/%d/exe", getpid());
    readlink(buf,exe,1023);

    args = (char**) malloc( sizeof(char*) * (argc+1) );
    for (i=1;i<argc;i++) {
        args[i] = argv[i];
    }
    args[argc] = NULL;

    if (getenv(VARIABLE_NAME)) {
        newexe = (char*) malloc( strlen(exe) + strlen(getenv(VARIABLE_NAME)) + 1);
        strcpy(newexe,exe);
        strcat(newexe,getenv(VARIABLE_NAME));
    } else {
        newexe = (char*) malloc( strlen(exe) + strlen(DEFAULT_VERSION) + 1 );
        strcpy(newexe,exe);
        strcat(newexe,DEFAULT_VERSION);
    }

    args[0] = exe;
    
    return execv(newexe, args);
}

Собрал ее, а бинарники скопировал в /usr/bin/gcc, /usr/bin/gcov,
/usr/bin/g++, /usr/bin/i386-redhat-linux-gcc, /usr/bin/i386-redhat-linux-g++

В результате, если я говорю export GCCVERSION=40 и запущу gcc, то
запустится gcc 4.0, если указал export GCCVERSION=34 - то запустится
gcc 3.4 и так далее :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Боже, no-dashi, ты издеваешься?

От тебя я такого не ожидал!!!

Где принцып юниксовой простоты? Это же скриптом решается!

anonymous
()
Ответ на: комментарий от anonymous

> Где принцып юниксовой простоты? Это же скриптом решается!

Скриптом это решается для только для тривиального случая :-) Например, предлагается из скрипта заставить запускаемый /usr/bin/gcc40 думать, что он /usr/bin/gcc. Или передать все параметры, когда один из них содержит пробел (число параметров неизвестно). Кроме того, такая программка работает априори на порядок быстрее скрипта - что опять же немаловажно, когда собираешь нечто из тысячи и более файлов.

P.S.: я полгода сидел на скрипте вида $0$GCCVERSION $@ - и на сишный враппер перешел не от хорошей жизни

no-dashi ★★★★★
()

поставь нужный компилер в любой каталог, раз уж очень надо..
тем более на один-два раза..

что-ж блин за привычка пошла у молодёжи, самим не попробовав,
ломить за советами..обленились что-ли.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.