GNU Autotools - GNU Autotools

Логотип GNU

GNU Autotools , также известная как система сборки GNU , представляет собой набор инструментов программирования разработан , чтобы помочь в создании исходного кода пакеты портативный для многих Unix-подобных систем.

Сделать программное обеспечение переносимым может быть сложно: компилятор C отличается от системы к системе; некоторые библиотечные функции отсутствуют в некоторых системах; заголовочные файлы могут иметь разные имена. Один из способов справиться с этим - написать условный код, в котором блоки кода выбираются с помощью директив препроцессора ( #ifdef ); но из-за большого разнообразия сред сборки этот подход быстро становится неуправляемым. Autotools разработан для более управляемого решения этой проблемы.

Autotools является частью набора инструментов GNU и широко используется во многих бесплатных программах и пакетах с открытым исходным кодом . Его компонентные инструменты представляют собой бесплатное программное обеспечение , лицензированное по Стандартной общественной лицензии GNU со специальными лицензионными исключениями, разрешающими его использование с несвободным программным обеспечением .

Система сборки GNU позволяет создавать множество программ, используя двухэтапный процесс: конфигурирование и затем make .

Составные части

Блок-схема autoconf и automake

Autotools состоит из служебных программ GNU Autoconf , Automake и Libtool . Другие связанные инструменты, часто используемые вместе с ним, включают программу GNU make , GNU gettext , pkg-config и коллекцию компиляторов GNU , также называемую GCC.

GNU Autoconf

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 использует реализацию макросистемы m4 от GNU .

Autoconf поставляется с несколькими вспомогательными программами, такими как autoheader , который используется для управления файлами заголовков C ; , который может создать начальный входной файл для Autoconf; и , который может перечислять идентификаторы препроцессора C, используемые в программе. autoscanifnames

GNU Automake

Automake помогает создавать переносимые Makefile файлы, которые, в свою очередь, обрабатываются утилитой make . Он принимает входные данные как Makefile.am и превращает их в Makefile.in , что используется скриптом настройки для генерации Makefile выходных файлов . Он также выполняет автоматическое отслеживание зависимостей; каждый раз, когда исходный файл компилируется, записывается список зависимостей (например, файлы заголовков C). Позже, каждый раз, когда запускается make и кажется, что зависимость изменилась, зависимые файлы будут перестроены.

GNU Libtool

Libtool помогает управлять созданием статических и динамических библиотек в различных Unix-подобных операционных системах. Libtool выполняет это, абстрагируя процесс создания библиотеки, скрывая различия между различными системами (например, системы Linux и Solaris ).

Применение

Autotools помогает разработчикам программного обеспечения писать кроссплатформенное программное обеспечение и делать его доступным для гораздо более широкого сообщества пользователей, в том числе в виде исходного кода для тех пользователей, которые хотят создавать программное обеспечение самостоятельно. В большинстве случаев пользователи просто запускают предоставленный configure сценарий (у которого нет никаких зависимостей, кроме наличия Bourne-совместимой оболочки ), а затем make программу. Им не нужно устанавливать на компьютер сами Autotools.

Его можно использовать как для сборки собственных программ на машине сборки, так и для кросс-компиляции с другими архитектурами.

Кросс-компиляция программного обеспечения для запуска на хосте Windows из Linux или другой Unix-подобной системы сборки также возможна с использованием MinGW, однако нативная компиляция часто желательна в операционных системах (таких как семейство систем Microsoft Windows ), которые не могут запускать Bourne. сценарии оболочки сами по себе. Это делает создание такого программного обеспечения в операционной системе Windows немного сложнее, чем в Unix-подобной системе, которая предоставляет оболочку Bourne в качестве стандартного компонента. Можно установить систему Cygwin или MSYS поверх Windows, чтобы обеспечить Unix-подобный уровень совместимости , позволяющий запускать скрипты configure . Cygwin также предоставляет GNU Compiler Collection , GNU make и другое программное обеспечение, которое обеспечивает почти полную Unix-подобную систему в Windows; MSYS также предоставляет GNU make и другие инструменты, предназначенные для работы с версией GCC для MinGW .

Хотя ожидается, что разработчик предоставит конечному пользователю сценарий настройки , иногда пользователь может захотеть заново сгенерировать сам сценарий настройки. Такая работа может быть необходима, если пользователь желает внести поправки в сам исходный код. Таким пользователям потребуется установить Autotools и использовать такие компоненты, как autoreconf .

Сгенерированный autoconf configure может быть медленным, потому что он выполняет такие программы, как компилятор C, много раз, чтобы проверить наличие различных библиотек, файлов заголовков и языковых функций. Это особенно влияет на Cygwin , который из-за отсутствия собственного системного вызова fork может выполнять скрипты настройки значительно медленнее, чем Linux .

Критика

В своей колонке для ACM Queue , FreeBSD разработчик Poul-Henning Kamp раскритиковал GNU Build System:

Идея состоит в том, что сценарий configure выполняет примерно 200 автоматических тестов, чтобы пользователю не приходилось настраивать libtool вручную. Это ужасно плохая идея, которую уже много критиковали еще в 1980-х, когда она появилась, поскольку она позволяет исходному коду притворяться переносимым за оболочкой скрипта configure, вместо того, чтобы фактически иметь качество переносимости с самого начала. Это пародия, что идея configure выжила.

Камп описывает историю системы сборки в проблемах переносимости, присущих множеству вариантов Unix 1980-х годов , и оплакивает необходимость существования таких систем сборки:

31 085 строк конфигурации для libtool по-прежнему проверяют, существуют ли <sys / stat.h> и <stdlib.h> , даже несмотря на то, что Unixen, в котором они отсутствовали, не имел ни достаточной памяти для выполнения libtool, ни дисков, достаточно больших для его 16 МБ исходный код.

Ответы на критику

Хотя критики Autotools часто выступают за альтернативы, которые обеспечивают большую простоту для их пользователей, некоторые утверждают, что это не обязательно хорошо. Джон Калкот, автор Autotools, 2nd Edition: A Practitioner's Guide to GNU Autoconf, Automake и Libtool , высказал мнение:

Автоинструменты на самом деле более прозрачны, чем любые другие инструменты сборки. Все эти другие инструменты (cmake, maven и т. Д.) - которые претендуют на то, чтобы быть намного проще, потому что изолируют пользователя от основных деталей процесса сборки - основной недостаток этого инструмента заключается в том, что именно эта изоляция не позволяет пользователям создавать изменения, которые им необходимы для достижения их уникальных целей сборки для конкретного проекта.

Любой, кому нечего сказать, кроме хороших слов об этом аспекте cmake, maven, gradle или чего-то еще, просто не работал над проектом, который требует от них достаточно далеко отойти от значений по умолчанию. Я использовал их все и часами расстраивался, пытаясь определить, как обойти недостатки некоторых универсальных (кроме того, что мне нужно) функций инструмента. Это просто не проблема Autotools. Как упоминалось ранее в этом потоке, вы можете поместить сценарий оболочки в файл configure.ac и превратить сценарий в файл Makefile.am. Это само определение прозрачности. Ни один другой существующий инструмент не допускает такого уровня гибкости.

Смотрите также

Рекомендации

Внешние ссылки