Сценарий
A configure
в основном служит трем целям:
- Обнаружение доступности (или предпочтений пользователя) дополнительных библиотек или проверка наличия и правильных параметров, необходимых для использования обязательных библиотек.Программа зависит от.
- Работа с неработающими операционными системами, в которых стандартные функции библиотеки отсутствуют или ведут себя не так, как указано в стандартах.
- Работа с неверными непереносимыми предположениями в вашей программе путем обнаружениясистемные параметры, о которых вам не нужно заботиться и сообщать о них своей программе.
Цель 3 всегда была бесполезна для правильно написанного кода.Например, вам не нужно знать sizeof(int)
на уровне препроцессора.Если вы хотите определенный размер, используйте целочисленный тип фиксированного размера, такой как int32_t
(и как часть пункта 2, configure может исправлять ошибки в поврежденных системах).Аналогично, вы не должны писать программы, поведение которых зависит от того, возвращает ли malloc(0)
1015 * или «уникальный указатель, который может быть успешно передан на free
».(Да, есть много сломанного программного обеспечения, которое на самом деле заботится!)
Цель 2 исторически была очень важна для того, чтобы версии базового системного программного обеспечения GNU стали настолько повсеместными, поддерживая огромный спектр проприетарных Unices со сломаннымикомпиляторы и библиотеки, обеспечивающие лучшее качество, чем обычно могут предложить нативные инструменты.В настоящее время каждая Unix-подобная система имеет среды сборки и среды выполнения, которые полностью или почти совместимы с POSIX, и вы можете получить их с помощью -D_POSIX_C_SOURCE=(version goes here)
и, возможно, с некоторыми добавлениями к $PATH
для оболочки.Таким образом, цель 2 обычно устарела и вредна, если только вы не пытаетесь поддерживать не POSIX-системы, такие как Windows (без cygwin).
Цель 1 все еще очень актуальна и не исчезнет в ближайшее время.
Некоторые проекты, возможно, по очень веской причине, не любят автоинструменты GNU и отказываются использовать какие-либо из них, либо пропуская configure
, либо переходя на собственные.Если вам требуется configure
только для первой цели, этот подход может иметь смысл, если вы понимаете все потенциальные проблемы и знаете, как написать сценарий переносимой оболочки.Однако, если вы сделаете это, обязательно изучите и соблюдайте все configure
соглашения о том, как параметры (например, --enable-*
, --prefix
и т. Д.) И переменные (CFLAGS
, CPPFLAGS
и т. Д.).) работать, чтобы вы не создавали кошмар для пользователей.И имейте в виду, что использование autoconf может быть проще и стоит делать, но, пожалуйста, не тратьте впустую время на то, чтобы проверять такие глупые вещи, как sizeof(int)
, или работает ли компилятор Fortran.