Cross-компиляция пакета GLib

Cross-compiling the GLib Package — Как скомпилировать пакет GLib для разных платформ.

Сборка библиотеки для разных архитектур

Cross-компиляция это процесс компиляции программ или библиотек на разных архитектурах или операционных системах на которых они будут выполняться. GLib немного сложна для cross-компиляции чем большинство пакетов потому что большая часть GLib о скрытых различиях между разными системами.

Данные замечания разъясняют специфику cross-компиляции GLib; основную информацию о cross-компиляции, смотрите в autoconf info pages.

GLib попытается обнаружить как можно больше информации о целевой системе с помощью компиляции и линковки программ ничего фактически не выполняя; однако, некоторая информация необходимая GLib не доступна таким способом. Эту информацию нужно обеспечить для скрипта configure через "cache file" или с помощью настроек переменных в вашем окружении.

Как пример использования кэш файла (cache file), при cross-компиляции для "MingW32" Win32 окружения на Linux системе, создаём файл 'win32.cache' со следующим содержимым:

glib_cv_long_long_format=I64 glib_cv_stack_grows=no

Затем выполняем следующие команды:

PATH=/path/to/mingw32-compiler/bin:$PATH chmod a-w win32.cache # prevent configure from changing it ./configure --cache-file=win32.cache --host=mingw32

Полный список переменных кэш файла следующий. Большинство из этого не нужно устанавливать в большинстве случаев.

Переменные кэш файла

glib_cv_long_long_format=[ll/q/I64].  Формат используемой printf() и scanf() для 64 bit целых. "ll" это стандарт C99, что означает использование библиотеки 'trio' которую GLib соберёт если ваша printf() недостаточно функциональна. Не нужно устанавливать если вы собираетесь компилировать с использованием trio.

glib_cv_stack_grows=[yes/no].  Увеличение стека вверх или вниз. Для большинства необходимо "no", некоторые архитектуры, такие как PA-RISC нуждаются в "yes".

glib_cv_working_bcopy=[yes/no].  Может ли ваш bcopy() обрабатывать перекрывающиеся копии. Нужно установить только если вы не имеете memmove(). (Очень вряд ли)

glib_cv_sane_realloc=[yes/np].  Соответствует ли ваш realloc() ANSI C и может ли обрабатывать NULL как первый аргумент. По умолчанию "yes" и вероятно не потребуется переустанавливать.

glib_cv_have_strlcpy=[yes/no].  Имеете ли вы strlcpy() соответствующую OpenBSD. По умолчанию "no", что является безопасным, поэтому GLib использует встроенную версию в этом случае.

glib_cv_va_val_copy=[yes/no].  Может ли va_list копироваться как указатель. Если установлено в "no", то используется memcopy(). Имеет смысл только если у вас нет va_copy() или __va_copy(). (Поэтому не имеет значения для GCC.) По умолчанию "yes" что намного чаще необходимо чем "no".

glib_cv_rtldglobal_broken=[yes/no].  Обнаруживается ли ошибка в OSF/1 v5.0. По умолчанию "no".

glib_cv_uscore=[yes/no].  Нужно ли подчёркивание перед символами при поиске их через dlsym(). Необходимо для установки только если система использует dlopen()/dlsym().

ac_cv_func_posix_getpwuid_r=[yes/no].  Имеете ли вы функцию getpwuid_r (в вашей C библиотеке, а не библиотеке потока) которая соответствует спецификации POSIX. (Берёт 'struct passwd **' как последний параметр)

ac_cv_func_nonposix_getpwuid_r=[yes/no].  Имеете ли вы какой нибудь вариант getpwuid_r() который не соответствует спецификации POSIX, но мог бы использоваться GLib (or might segfault.) Нужно установить только если ac_cv_func_posix_getpwuid_r не установлен. Безопасней устанавливать в "no".

glib_cv_use_pid_surrogate=[yes/no].  Используется ли setpriority() в PID нити как метод для настройки приоритетов нитей (threads). Устанавливается только при использовании POSIX threads.

ac_cv_func_printf_unix98=[yes/no].  Поддерживает ли ваше семейство printf() стиль Unix98 %N$ параметров позиционирования. По умолчанию "no".

ac_cv_func_vsnprintf_c99=[yes/no].  Имеете ли вы vsnprintf() с семантикой C99 (C99 семантика означает возвращение количество байт которые должны быть записаны имея буфер достаточного размера). По умолчанию "no".