Автоинструментальные катастрофы.
Сгенерированный сценарий ./configure
проверяет функции, которых не было ни в одной системе Unix последние 20 лет или около того. Для этого он тратит огромное количество времени.
Бег ./configure
занимает целую вечность. Хотя современные серверные процессоры могут иметь даже десятки ядер, и может быть несколько таких процессоров на сервер, ./configure
является однопоточным. У нас еще достаточно лет закона Мура, чтобы количество ядер ЦП увеличивалось как функция времени. Таким образом, время, необходимое для ./configure
, будет оставаться приблизительно постоянным, тогда как время параллельной сборки уменьшается в 2 раза каждые 2 года в соответствии с законом Мура. Или, на самом деле, я бы сказал, что ./configure
может даже увеличиться из-за увеличения сложности программного обеспечения с использованием улучшенного оборудования.
Простой процесс добавления только одного файла в ваш проект требует от вас запуска automake
, autoconf
и ./configure
, что займет много времени, и тогда вы, вероятно, обнаружите, что, поскольку некоторые важные файлы изменились, все будет перекомпилирован. Поэтому добавьте только один файл, и make -j${CPUCOUNT}
перекомпилирует все.
А про make -j${CPUCOUNT}
. Сгенерированная система сборки является рекурсивной. Рекурсивное создание долгое время считалось вредным .
Затем, установив скомпилированное программное обеспечение, вы обнаружите, что оно не работает. (Хотите доказательства? Клонируйте protobuf репозиторий от Github, проверьте коммит 9f80df026933901883da1d556b38292e14836612
, установите его в систему Debian или Ubuntu, и эй presto: protoc: error while loading shared libraries: libprotoc.so.15: cannot open shared object file: No such file or directory
- поскольку он находится в /usr/local/lib
, а не /usr/lib
; обходной путь - export LD_RUN_PATH=/usr/local/lib
перед вводом make
).
Теория заключается в том, что с помощью автоинструментов вы можете создать программный пакет, который можно скомпилировать в Linux, FreeBSD, NetBSD, OpenBSD, DragonflyBSD и других операционных системах. Факт? Каждая не Linux-система для сборки пакетов из исходного кода имеет множество файлов патчей в своем репозитории для обхода ошибок автоинструментов. Просто взгляните, например, на FreeBSD /usr/ports
: он полон патчей. Таким образом, было бы так же легко создать небольшой патч для системы сборки не-autotools для каждого проекта, чем создать небольшой патч для системы сборки autotools для каждого проекта. Или, может быть, даже проще, так как стандартный make
гораздо проще в использовании, чем автоинструменты.
Дело в том, что если вы создаете свою собственную систему сборки на основе стандарта make
(и делаете ее инклюзивной, а не рекурсивной, следуя рекомендациям из бумаги "Рекурсивная сборка считается вредной"), все работает гораздо лучше , Кроме того, время сборки уменьшается на порядок, возможно, даже на два порядка, если ваш проект представляет собой очень маленький проект с языковыми файлами 10-100 C и у вас есть десятки ядер на процессор и несколько процессоров. Кроме того, гораздо проще связать пользовательские инструменты автоматической генерации кода с пользовательской системой сборки, основанной на стандартном make
, вместо того, чтобы справляться с путаницей m4
автоинструментов. Со стандартным make
вы можете, по крайней мере, ввести команду оболочки в Makefile
.
Итак, чтобы ответить на ваш вопрос: зачем использовать автоинструменты? Ответ: нет причин для этого. Autotools устарела с тех пор, как коммерческий Unix устарел. А появление многоядерных процессоров сделало автоинструменты еще более устаревшими. Почему программисты этого еще не поняли - загадка. Я с радостью использую стандарт make
в своих системах сборки, спасибо. Да, для создания файлов зависимостей для включения заголовка языка C требуется определенный объем работы, но объем работы сохраняется благодаря отсутствию необходимости бороться с автоинструментами.