Почему переменные окружения не переопределяют переменные, установленные в make-файлах по умолчанию? - PullRequest
8 голосов
/ 03 июля 2010

Я компилирую пакеты и вижу, что авторы Makefile часто пишут set CFLAGS в make-файле с такими-то опциями.Я, с другой стороны, хотел бы попробовать некоторые оптимизации компилятора и хотел бы распространять переключатели компилятора, чтобы сделать их как можно меньше проблем.Не всегда это выполнимо, хотя.Например, когда make-файл указывает CFLAGS, и я хочу, чтобы все вызовы компилятора C использовали -fomit-frame-pointer, за исключением необходимости явно писать что-то вроде CFLAGS=-fomit-frame-pointer make, каковы мои варианты, которые не являются хакерскими.Из того, что я вижу, есть вышеупомянутое, то есть то же самое, но другое make "CFLAGS=-fomit-frame-pointer", и я также могу сделать то, что считаю лучшим решением и причиной этого вопроса:

export CFLAGS=-fomit-frame-pointer
make -e

Iсчитаю это лучшим, потому что, честно говоря, даже считая потенциально опасным флагом, я не слишком много отлаживаю программное обеспечение, и когда мне нужно, я могу перекомпилировать определенный фрагмент по требованию с информацией об отладке и всем остальным.В противном случае мне нравится работать с программным обеспечением для выпуска без отладки и наворотов, особенно если пакет не был создан мной.Итак, я думаю, что я спрашиваю здесь конкретно: почему make не предпочитает автоматически переменные окружения собственным makefile?Ведь окружающая среда лучше знает, что к чему, и в случае, если make author действительно нужно что-то найти, есть синтаксис override, верно?

Ответы [ 2 ]

19 голосов
/ 03 июля 2010

Make будет переопределять переменные, если вы поместите их в командную строку make.

Попробуйте это: make CFLAGS=-fomit-frame-pointer

Одно слово предупреждения. Большинство Make-файлов не ожидают, что их переменные будут переопределены. Это означает, что если Makefile использует CFLAGS для указания -I для включаемых файлов, -O2 для оптимизации или других флагов, вы должны добавить их в переопределение CFLAGS, иначе make, вероятно, потерпит неудачу.

5 голосов
/ 03 июля 2010

То есть спорно: «После того, как все окружение знает лучше, что это то, что»

1002 * Это как сказать «мама знает лучше», чтобы все-выросший ребенок и останавливая их будут изучать закон, потому что вы хотелипосмотрим, что это за водопроводчик.Это их жизнь.Отпусти и позволь им сделать свой выбор для себя.

Ой, подожди, ты спрашивал об окружающей среде и о себе.Правильно.

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

Обновление: В моем ответе изначально пропущен аргумент - предсказуемость.Единственным требованием должно быть наличие стандартизированного набора инструментов (одна и та же версия GCC, одни и те же библиотеки), и, учитывая, что правильно написанный файл make должен всегда давать один и тот же результат, независимо от среды или других инструментов..

...