Рассмотрим две связанные задачи, касающиеся построения GCC (самой цепочки инструментов компилятора, включая целевые библиотеки):
Сборка кросс-компилятора из любой системы, на которой вы работаете ($build
= $host
), до фиксированной $target
.
Кросс-компиляция собственного компилятора для запуска на $host
= $target
(независимо от того, на каком $build
вы работаете).
Случай 2, в частности, относится к воспроизводимым сборкам. В идеале выходные двоичные файлы в этом случае должны быть детерминированными, полностью независимыми от того, на какой системе вы их строите ($build
). Тем не менее, поскольку GCC решает, следует ли выполнять кросс-компиляцию, сравнивая значения $build
и $host
, вы получите неожиданно иной процесс сборки и результаты, если $build
окажется равным $host
.
Аналогично, случай 1 ведет себя по-разному при разных условиях: ложное равенство $host
и $target
(и, следовательно, всех трех - $build
также). В некотором смысле это менее проблематично, поскольку не нарушено свойство воспроизводимости (по крайней мере, я об этом не знаю), но оно оказывает незначительное влияние на работу sysroot, которое я до сих пор не до конца понимаю.
Итак, мой вопрос: есть ли способ при сборке GCC заставить его создать кросс-компилятор (случай 1) или кросс-компиляцию (случай 2) вместо того, чтобы иметь поведение зависеть от того, отличаются ли $host
и $target
друг от друга или от $build
? Передача --with-sysroot
частично достигает этого, но некоторые действия при сборке все еще отличаются. Один очевидный глупый подход, о котором я подумал, - это взять вывод config.guess
и вручную добавить к нему ненужную информацию, просто чтобы гарантировать несоответствие, но я не уверен, что это надежно, чтобы не сломаться.