LINUX.ORG.RU

Про «cross configure»: build-host и target-host

 , , , ,


1

1

Вот кросс-компилируем мы программу. Скажем, coreutils.

У нас есть build-host, у нас есть target-host. Соответственно, у нас есть gcc, скомпилированный с --host=build-host --target=target-host.

Распаковали мы исходники coreutils, на build-host. На нем же запускаем: ./configure --build=build-host --host=target-host. То есть запускаем в «cross compile-режиме».

Он пишет, например: найдена библиотека libcap. Ну да, AC_CHECK_LIB отрабатывает! Но происходит-то это на build-host!

В итоге, на своей LFS-сборке, запускаемой в QEMU, при старте ls не находится библиотека libcap.so.6. Правильно, она была на build-host, но проверять-то ее (shared-библиотеку!) надо было на target-host?

Я понимаю, что надо флагом --without-libcap эту библиотеку отключить. Но меня сама концепция смущает: почему ./configure, в режиме «cross compile», запускает AC_CHECK_LIB не на target-host?

Казалось бы, должен быть ключ --target-root=, но… --with-sysroot=, вроде, только у GCC…

Я правильно рассуждаю? Спасибо!


https://github.com/intelfx/bin/blob/master/landfill/stupidcross.sh

TL;DR:

  • CFLAGS+="--sysroot=/path/to/sysroot"
  • configure должен либо подхватывать $SYSROOT, либо вышеприведённый флаг, и в обоих случаях работать искаропки; если не подтягивает, то --with-PKG=/path/to/sysroot/usr/lib
  • pkg-config не делает ни того, ни другого, надо подкладывать костыли в виде переменных $PKG_CONFIG_SYSROOT_DIR, $PKG_CONFIG_LIBDIR, $PKG_CONFIG_PATH

P. S. Keep calm and cross compile, добро пожаловать в этот увлекательный мир :)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

Спасибо! Буду разбираться.

«Боковой» вопрос. На каком этапе появляются .pc-файлы в ${SYSROOT}/usr/lib/pkgconfig? И это файлы от build-host или они генерируются с использованием target-host/${SYSROOT}-окружения?

И я, кстати, не понимаю, почему LFS cross-compilит всё, и как-то там нет этих нюансов, должны же!

kuraga
() автор топика
Последнее исправление: kuraga (всего исправлений: 2)
Ответ на: комментарий от kuraga

На каком этапе появляются .pc-файлы в ${SYSROOT}/usr/lib/pkgconfig?

Честно, я уже не помню. Вообще в зависимости от билдсистемы (а в автолулзах я разбираюсь крайне ограниченно), но я бы предположил что на этапе make install.

И это файлы от build-host или они генерируются с использованием target-host/${SYSROOT}-окружения?

А что значит «от build-host»? Они генерируются при сборке, с использованием тех параметров, которые ты передал в configure и которые оно смогло собрать о системе. То есть если configure на всех этапах использует кросс-тулчейн и смотрит в sysroot (как и должно быть) — значит, и .pc-файлы должны отражать это положение вещей.

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

Ах, .pc-файлы - это выход [сборки программы], а не вход. Тогда и неважно. Я-то думал, что мне их нужно нарыть для правильной [кросс-]компиляции.

$PKG_CONFIG_LIBDIR, $PKG_CONFIG_PATH - в обе переменные впихиваем $SYSROOT?

А можно еще один вопрос, пожалуйста. Извините за недостаточную чёткость - но пока я плохо всё понимаю. Вот собираю я LFS (Linux From Scratch) на Gentoo. Если я (даже) хочу сделать всё совсем «по-честному», нужно ли мне кросс-компилировать GCC, Binutils? (И, кстати, полный ли это список - GCC, Binutils?)

GCC’s target - система, под которую GCC собирает программу. Мой GCC собирает под x86_64, Gentoo. Казалось бы, LFS - не Gentoo, но. Ведь набор инструкций тот же самый - x86_64. «Операционные системы»/«окружения» отличаются, но подставляя --sysroot в Gentoo’s GCCpkg-config, etc.), мы не исправляем это?

Спасибо!

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

$PKG_CONFIG_LIBDIR, $PKG_CONFIG_PATH - в обе переменные впихиваем $SYSROOT?

Не совсем. В первой должен быть путь к файлам pkg-config внутри sysroot, а вторая должна быть пустой (но при этом установленной, уже не скажу зачем). И это вдобавок к PKG_CONFIG_SYSROOT_DIR, которая должна указывать на сам sysroot.

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

А можно еще один вопрос, пожалуйста. Извините за недостаточную чёткость - но пока я плохо всё понимаю. Вот собираю я LFS (Linux From Scratch) на Gentoo. Если я (даже) хочу сделать всё совсем «по-честному», нужно ли мне кросс-компилировать GCC, Binutils? (И, кстати, полный ли это список - GCC, Binutils?)

GCC’s target - система, под которую GCC собирает программу. Мой GCC собирает под x86_64, Gentoo. Казалось бы, LFS - не Gentoo, но. Ведь набор инструкций тот же самый - x86_64. «Операционные системы»/«окружения» отличаются, но подставляя –sysroot в Gentoo’s GCC (и pkg-config, etc.), мы не исправляем это?

У тебя два абзаца противоречат друг другу. Ты спрашиваешь про то, нужно ли тебе кросс-компилировать нативный тулчейн (build=build-host, host=target-host, target=target-host) или перекомпилировать кросс-тулчейн (build=build-host, host=build-host, target=target-host) чтобы им в свою очередь собирать остаток LFS?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ответ: про «перекомпилировать кросс-тулчейн».

Вопрос был про то, можно ли стандартным-Gentoo компилятором собирать LFS (ядро+coreutils+dash), отталкиваясь от того, что build-host примерно равно target-host (см. выше).

kuraga
() автор топика
Последнее исправление: kuraga (всего исправлений: 1)