пятница, 2 декабря 2011 г.

Как нам обмануть libtool.

В проектах, собираемых для множества платформ, иногда бывает необходимо использовать статическую версию библиотек времени выполнения. С нашими проектами все хорошо. Мы их делаем, заботимся о корректных файлах сборки и. т. д. Но как быть со сторонними проектами, у которых система сборки autoconf/libtool? Это хорошо, когда авторы проекта предусматривают такую возможность, допустим при помощи опции для configure. Ну еще, как вариант, можно иногда поправить все эти config.in, m4 - но коварный libtool все равно съедает опцию -static-libgcc.
И все это требует времени, т.к. autoconf не быстр, а казалось бы надо - всего то ничего - добавить опцию на командную строку gcc.
Итак, какие же для этого существуют возможности?
  1. Переопределить CC="gcc -static-libgcc". Самое простое. Иногда этого достаточно. Мне попадались экземпляры, которые анализировали данное переопределение убирая второй аргумент. Иногда, пробел между аргументами в каких то  тестах давал сбой.
  2. Переопределить CC=gcc-wrap.sh. В gcc-wrap.sh поместить следующее:
    /usr/bin/bash
    exec gcc -shared-libgcc $*
    
    Этого в большинстве случаев достаточно. Медленно правда - лишний вызов интерпретатора. Если на командную строку попадают кавычки, то такая конструкция их съест. Кавычки используются например для передачи литералов в командную строку.
  3. Самый лучший и быстрый по скорости вариант: переопределить CC=gcc-wrap на простейшую программу - оболочку gcc-wrap.c:
    #include <stdio.h> 
    #include <unistd.h> 
    #define GCCEXE "/usr/bin/gcc"
    int main(int argc, char *argv[]) {
    char **my_arg = malloc(sizeof(char *) * (argc + 2));
    int i;
    my_arg[0] = "gcc"; my_arg[1] = "-static-libgcc"; for(i=1; i< (argc + 2); i++)      my_arg[i+1] = argv[i];      execvp(GCCEXE, my_arg );      perror(GCCEXE);    return 1; }
Все. Теперь библиотеки собираются как нам надо.
Кстати, таким образом можно также убирать из командной строки ненужные нам аргументы.


Комментариев нет:

Отправить комментарий