Альтернативы переключателю --sysroot gcc?

Переключатель --sysroot полезен, если вы не хотите, чтобы заголовки/библиотеки стандартных путей влияли на вашу сборку.

--sysroot=dir: используйте dir в качестве логического корневого каталога для заголовков и библиотеки. Например, если компилятор обычно ищет заголовки в /usr/include и библиотеки в /usr/lib, вместо этого будет искать dir/usr/include и dir/usr/lib. [ref]

Можно ли сделать то же самое с использованием переменных среды, файла спецификаций gcc или любых других методов, которые не требуют переключения командной строки?

Ответ 1

Если вы можете использовать переменные среды, вы можете добавить -sysroot в CFLAGS.

Ответ 2

Вы можете создать обертку script вокруг gcc, которая выполняет фактический gcc с необходимыми флагами. Это работает с Makefiles и сложными сборками, которые беспорядочны с переменными среды. Вам нужно только убедиться, что ваш gcc script ранее в PATH, чем фактический gcc файл. Сам script - это всего две строки,

#!/bin/sh
exec /usr/bin/gcc --sysroot=/your/sysroot "[email protected]"

и если $HOME/bin на ранней стадии вашего PATH, вы можете поместить script в $HOME/bin, и это не повлияет на других пользователей.

Если у вас есть configure script, который явно ищет gcc в /usr/bin/, вам может потребоваться переименовать /usr/bin/gcc в /usr/bin/gcc.bin и назовите script /usr/bin/gcc. Это затронет всех пользователей. Если вам это нужно, но также хотите, чтобы это повлияло только на определенных пользователей или пользователей, используйте

#!/bin/sh
[ "$(id -un)" -eq "theuser" ] && exec /usr/bin/gcc.bin --sysroot=/your/sysroot "[email protected]"
exec /usr/bin/gcc.bin "[email protected]"

Вы можете делать варианты, например. конкретных учетных записей пользователей или членства в группах для установки определенного sysroot, используя ту же схему.