GNU Autotools , также известный как GNU Build System , представляет собой набор инструментов программирования , предназначенных для помощи в создании пакетов исходного кода , переносимых на многие Unix-подобные системы.
Сделать программу переносимой может быть сложно: компилятор C отличается от системы к системе; в некоторых системах отсутствуют определенные библиотечные функции; файлы заголовков могут иметь разные имена; общие библиотеки могут быть скомпилированы и установлены разными способами. Один из способов справиться с различиями платформ — написать условный код с блоками кода, выбранными с помощью директив препроцессора ( #ifdef
); но из-за большого разнообразия сред сборки этот подход быстро становится неуправляемым. Autotools предназначен для более удобного решения этой проблемы.
Autotools является частью набора инструментов GNU и широко используется во многих бесплатных программах и пакетах с открытым исходным кодом . Входящие в его состав инструменты представляют собой свободное программное обеспечение , лицензированное по лицензии GNU General Public License со специальными лицензионными исключениями [1] [2] , разрешающими его использование с проприетарным программным обеспечением .
Система сборки GNU позволяет создавать множество программ, используя двухэтапный процесс: configure , а затем make . [3]
Autotools состоит из служебных программ GNU Autoconf , Automake и Libtool . [4] Другие связанные инструменты, часто используемые вместе с ним, включают программу GNU make , GNU gettext , pkg-config и коллекцию компиляторов GNU , также называемую GCC.
Autoconf генерирует configure
сценарий на основе содержимого файла configure.ac
, характеризующего конкретный фрагмент исходного кода. Сценарий configure
при запуске сканирует среду сборки и генерирует подчиненный config.status
сценарий, который, в свою очередь, преобразует другие входные файлы и чаще всего Makefile.in
в выходные файлы ( Makefile
), подходящие для этой среды сборки. Наконец, make
программа используется Makefile
для генерации исполняемых программ из исходного кода.
Сложность Autotools отражает разнообразие обстоятельств, при которых может быть создан корпус исходного кода.
make
, который перекомпилирует только ту часть тела исходного кода, на которую повлияло изменение..in
файл изменился, то достаточно запустить заново config.status
и make
.configure
(при этом запускается config.status
) и make
. (По этой причине исходный код с использованием Autotools обычно распространяется без генерируемых файлов configure
.)configure.ac
и .in
файлы необходимо изменить, а также выполнить все последующие шаги.Для обработки файлов autoconf использует реализацию GNU макросистемы m4 .
Autoconf поставляется с несколькими вспомогательными программами, такими как autoheader
, которая используется для управления файлами заголовков C ; , который может создать исходный входной файл для Autoconf; и , которые могут перечислять идентификаторы препроцессора C, используемые в программе.autoscan
ifnames
Automake помогает создавать переносимые Makefile
файлы, которые, в свою очередь, обрабатываются утилитой make . Он принимает входные данные как Makefile.am
и преобразует их в Makefile.in
, который используется сценарием настройки для создания Makefile
выходного файла. Он также выполняет автоматическое отслеживание зависимостей; каждый раз, когда компилируется исходный файл, записывается список зависимостей (например, заголовочные файлы C). В дальнейшем, при каждом запуске make и изменении зависимости зависимые файлы будут пересозданы.
Libtool помогает управлять созданием статических и динамических библиотек в различных Unix-подобных операционных системах. Libtool достигает этого, абстрагируя процесс создания библиотеки, скрывая различия между различными системами (например, системами Linux и Solaris ).
Autotools помогает разработчикам программного обеспечения писать кроссплатформенное программное обеспечение и делать его доступным для гораздо более широкого сообщества пользователей, в том числе в виде исходного кода для тех пользователей, которые хотят создать программное обеспечение самостоятельно. В большинстве случаев пользователи просто запускают поставляемый configure
скрипт (который не имеет никаких зависимостей, кроме наличия Bourne-совместимой оболочки ), а затем make
программу. [5] Им не обязательно устанавливать на компьютер сами Autotools.
Его можно использовать как для сборки собственных программ на машине сборки, так и для кросс-компиляции в другие архитектуры. [6]
Кросс-компиляция программного обеспечения для запуска на хосте Windows из Linux или другой Unix-подобной системы сборки также возможна с использованием MinGW, однако собственная компиляция часто желательна в операционных системах (таких как системы семейства Microsoft Windows ), которые не могут запускать Bourne. сценарии оболочки самостоятельно. Это делает создание такого программного обеспечения в операционной системе Windows немного сложнее, чем в Unix-подобной системе, которая предоставляет оболочку Bourne в качестве стандартного компонента. Однако можно установить систему Cygwin или MSYS поверх Windows, чтобы обеспечить уровень совместимости с Unix , позволяя запускать сценарии настройки . Cygwin также предоставляет GNU Compiler Collection , GNU make и другое программное обеспечение, которое обеспечивает почти полную Unix-подобную систему в Windows; MSYS также предоставляет GNU make и другие инструменты, предназначенные для работы с версией GCC MinGW .
Хотя ожидается, что разработчик предоставит конечному пользователю сценарий настройки , иногда пользователь может захотеть заново создать сценарий настройки. Такая работа может потребоваться, если пользователь желает изменить сам исходный код. Таким пользователям потребуется установить Autotools и использовать такие компоненты, как autoreconf .
Сгенерированный autoconf configure
может быть медленным, поскольку он выполняет такие программы, как компилятор C, много раз, чтобы проверить наличие различных библиотек, файлов заголовков и языковых функций. Это особенно касается Cygwin , который из-за отсутствия собственного системного вызова fork может выполнять сценарии настройки значительно медленнее, чем Linux . [7]
В своей колонке для ACM Queue разработчик FreeBSD Пол -Хеннинг Камп раскритиковал систему сборки GNU: [8]
Идея состоит в том, что скрипт configure выполняет примерно 200 автоматических тестов, чтобы пользователю не приходилось настраивать libtool вручную. Это ужасно плохая идея, которую уже много критиковали еще в 1980-х годах, когда она появилась, поскольку она позволяет исходному коду притворяться переносимым за видимостью сценария настройки, вместо того, чтобы на самом деле иметь качество переносимости с самого начала. Это пародия на то, что идея конфигурирования сохранилась.
Камп обрисовывает историю системы сборки в проблемах переносимости, присущих множеству вариантов Unix 1980-х годов , и сетует на необходимость существования таких систем сборки:
31 085 строк конфигурации для libtool по-прежнему проверяют, существуют ли <sys/stat.h> и <stdlib.h> , хотя Unixen, в котором их не было, не имел ни достаточного количества памяти для выполнения libtool, ни дисков, достаточно больших для его 16 МБ. исходный код.
Хотя критики Autotools часто выступают за альтернативы, которые обеспечивают большую простоту для пользователей, некоторые утверждают, что это не обязательно хорошо. Джон Калкот, автор [9] книги Autotools, 2nd Edition: A Practitioner’s Guide to GNU Autoconf, Automake и Libtool , высказал мнение: [10]
Autotools на самом деле более прозрачен, чем любые другие инструменты сборки. Все эти другие инструменты (cmake, maven и т. д.), которые претендуют на то, чтобы быть намного проще, поскольку изолируют пользователя от основных деталей процесса сборки, основной недостаток этих инструментов заключается в том, что сама эта изоляция не позволяет пользователям создавать изменения, необходимые им для достижения уникальных целей сборки, специфичных для конкретного проекта.
Любой, кто может сказать только хорошее об этом аспекте cmake, maven, gradle или чего-то еще, просто не работал над проектом, который требует от него отойти достаточно далеко от настроек по умолчанию. Я использовал их все и провел часы в отчаянии, пытаясь определить, как обойти недостатки некоторых универсальных (кроме того, что мне нужно) функций инструмента. Это просто не проблема Autotools. Как кто-то упоминал ранее в этой теме, вы можете поместить сценарий оболочки в файл configure.ac и создать сценарий в файл Makefile.am. Это само определение прозрачности. Ни один другой существующий инструмент не обеспечивает такого уровня гибкости.