Я не поклонник autoconf, но в интересах принципа наименьшего удивления я пытаюсь сделать мои скрипты configure (non-autoconf) максимально внимательными к тому, что пользователи ожидают от autoconf-based построить систему. Стандарты кодирования GNU на самом деле довольно разумны в этой теме и явно указывают на возможность не использовать autoconf/automake, но предоставляют совместимый интерфейс по-другому:
https://www.gnu.org/prep/standards/standards.html#Configuration
Одна проблема, я не могу найти никакого хорошего описания, однако, как лучше всего обрабатывать CFLAGS. Мне ясно, что любые существенные флаги (например, -I$(srcdir)/inc
), которые не являются ни одной из бизнес-пользователей, не принадлежат CFLAGS ни в configure script, ни в make файле, поскольку переопределение их полностью разрушит сборку. Поэтому я либо жестко закодирован в make файле, либо (если они требуют некоторого обнаружения) поместил логику обнаружения в configure, но передал их через отдельную переменную make вместо CFLAGS, поэтому они не будут переопределены.
Тем не менее, я все еще не понимаю, как справляться с лучшими, это необязательные вещи, такие как уровни/параметры оптимизации, флаги предупреждений, отладка и т.д. Если флаги, включенные такими вещами, как --enable-debug
или --enable-warnings
, добавляются в CFLAGS
или переданы в какой-либо другой переменной make? Что делать, если они конфликтуют с флагами уже в пользовательском CFLAGS
?
Я могу видеть, где для большого количества проектов ответ может быть просто "не возиться с этим вообще и позволить пользователю выбирать их CFLAGS
", но некоторые из моих случаев использования - это проекты, в которых пользовательская база обычно интересуется настройкой готовых и отладочных конфигураций.
Изменить: Еще одна проблема, которую я забыл: когда дело доходит до обнаружения и автоматического использования определенных CFLAGS, которые не являются существенными, но предпочтительными, это должно быть сделано, только если пользователь оставил CFLAGS
пустым в окружающей среды или всегда?