Достоинства bmake - PullRequest
       39

Достоинства bmake

10 голосов
/ 25 января 2010

Помимо того факта, что bmake является BSD-эквивалентом GNU make, я не мог ясно понять его преимущества перед GNU make. Может кто-нибудь мне помочь? Мне удалось найти только один ресурс , который был немного полезен. Более помощь или указатели приветствуются.

Спасибо, Прабху

Ответы [ 5 ]

11 голосов
/ 06 августа 2014

BSD make и GNU make являются бесплатными заменами оригинальной марки AT & T. Основное различие заключается в различном синтаксисе для расширенных функций. Вот как поместить вывод команды оболочки в переменную в BSD make:

# BSD make
TODAY != date +%Y-%m-%d

А в GNU делают:

# GNU make
TODAY = $(shell date +%Y-%m-%d)

Как только кто-то пишет $(shell ...) в Makefile, он требует GNU make. Из-за разного синтаксиса некоторые пакеты требуют сборки GNU для сборки, а некоторые требуют BSD make.

BSD make начал свою жизнь как PMake , сокращение от параллельного создания . Его автор, Адам де Бур, описал PMake в PMake - A Tutorial . Его достоинством была новая способность выполнять задания параллельно, как в make -j 3. Этот параллельный режим нарушил совместимость, выполнив все команды для каждой цели в одной оболочке, а не в одной оболочке на строку. GNU make имеет параллельный режим, также -j, который поддерживает одну оболочку на строку. NetBSD make (1) теперь имеет make -B -j 3 для параллельного режима с одной оболочкой на строку. OpenBSD make (1) теперь всегда выполняет параллельный режим с одной оболочкой на строку.

4.3BSD-Reno включает PMake как make и файлы bsd. *. Mk. Эти включаемые файлы - лучшая особенность марки BSD. src / bin / sed / Makefile в 4.3BSD-Tahoe (выпуск до 4.3BSD-Reno) определяет несколько целей, таких как clean, зависимость, установка и так далее. src / usr.bin / sed / Makefile в 4.3BSD-Reno имеет только четыре непустые строки:

#   @(#)Makefile    4.6 (Berkeley) 5/11/90

PROG=   sed
SRCS=   sed0.c sed1.c

.include <bsd.prog.mk>

Здесь bsd.prog.mk автоматически устанавливает OBJS в sed0.o sed1.o, определяет цель sed для связи sed с этими объектами, определяет другие цели, такие как clean, зависимость, установка и вызывает make install установить как sed, так и его страницу руководства sed.1. Существует также bsd.lib.mk для сборки библиотек.

При использовании bsd. *. Mk каждый Makefile может собрать только одну программу или библиотеку. Чтобы создать еще один, в другом каталоге должен быть второй Makefile. Так что src / usr.sbin / smtpd / в OpenBSD имеет шесть подкаталогов, где каждый подкаталог содержит только Makefile, поскольку smtpd создает шесть программ.

Также редко можно использовать bsd. *. Mk для сборки чего-либо, кроме самого BSD. Многие переносимые пакеты от разработчиков BSD, такие как OpenSSH (из OpenBSD) или mksh (из MirBSD), не требуют создания BSD и не используют файлы bsd. *. Mk.

Файл bsd.port.mk находится в центре портов FreeBSD , системы, которая создает пакеты программного обеспечения для FreeBSD. ( NetBSD pkgsrc называет этот файл bsd.pkg.mk .) Эта система имеет конкурентов на других языках сценариев. Доморощенный использует Ruby. MacPorts использует Tcl.

Раньше GNU make была более переносимой, чем BSD. Поскольку make BSD был частью BSD, редко можно найти make BSD в других системах. Теперь есть портативный bmake для других систем. Это портативная версия NetBSD. Наиболее распространенное использование переносимого bmake - запуск pkgsrc в системах, отличных от NetBSD. Я запускаю pkgsrc в OS X, а bmake загружается pkgsrc.

5 голосов
/ 22 октября 2014

Я пишу BSD Owl , портативную систему сборки, основанную на BSD Make. Я начал писать Makefiles в 2000 году с GNU Make и быстро переключился на BSD Make. Позвольте мне изложить причины, которыми я руководствовался.

Документация и доступная литература

Это главное, правда. В то время как проект GNU предоставил удивительный и важный кусок программного обеспечения для мира свободного программного обеспечения, в документации нет четкого различия между руководством пользователя и справочным руководством , что является непротиворечивой характеристикой документации GNU. В результате документация GNU Make представляет собой огромный (более 200 страниц) документ, который чередует тщательное описание каждого аспекта системы с игрушечными примерами. Когда я использовал его, я никогда не находил эти примеры полезными, потому что они далеко не соответствуют фактическим сценариям использования, и мне всегда требовалось несколько минут, чтобы найти или переместить информацию, которую мне пришлось искать. Литературный корпус, доступный для GNU Make, действительно огромен, однако очень сложно найти интересные примеры для написания всеобъемлющей портативной системы сборки, такой как BSD Owl . Возможно, это потому, что проекты полагаются на automake, а не пишут файлы Makefile напрямую. Может быть, это потому, что я не искал достаточно сильно.

Ситуация была намного лучше на стороне FreeBSD. Действительно,

  • Существует каноническое руководство или руководство пользователя Адам де Бур .
  • Страница руководства служит справочным руководством и содержит менее 30 страниц.
  • Система сборки FreeBSD и система портов FreeBSD представляют собой совокупность рукописных make-файлов.

Конечно, страница руководства по BSD Make не такая подробная, как руководство по GNU Make, но она гораздо более плотная и простая в использовании. Системы сборки FreeBSD являются в то же время (а) подтверждением концепции, что BSD Make может управлять сборкой больших сложных проектов, и (б) демонстрацией передовых методов в искусстве написания Makefile.

Функции программирования

Очень забавно то, что возможности программирования в GNU Make кажутся гораздо более мощными, чем те, что предоставляет BSD Make. Тем не менее я нашел их невероятно сложными в использовании, в основном из-за порядка расширения и из-за отсутствия полезных примеров. В BSD Make гораздо меньше конструкций и функций, но они очень надежны и просты в использовании: большая часть кода, который мне нужно написать, это условные циклы и циклы for для определения списков целей, а BSD Make делает это очень легко и надежно.

Расширенные функции

BSD Make имеет расширенную функцию, которой нет в GNU Make - насколько я знаю - она ​​называется мета-режим . Самая сложная часть написания Makefiles - правильно указать списки необходимых компонентов в пакете. Некоторое программное обеспечение, такое как mkdep(1), пытается автоматизировать процесс путем анализа источников. BSD Make использует другой подход: мы пишем Makefile с возможными ошибочными (неполными) зависимостями, но достаточно точными для успешной сборки пакета. В ходе этого процесса BSD Make отслеживает операции ввода-вывода, используя filemon(4), чтобы определить фактический список предпосылок.

2 голосов
/ 10 января 2013

Когда бы вы ни сравнивали утилиты GNU с утилитами BSD, имейте в виду, что большинство людей, проводящих сравнения, будут относиться к лицензированию как к функции или ошибке само по себе - и что-то вроде половины разработчиков, делающих сравнение, предпочитают разрешительную лицензию и половину одобряют GPL-подобная вирусная лицензия. Нельзя сказать, что нет реальных отличий (иногда они есть, но часто это мытье).

bmake не так раздут, как GNU make, и оба совместимы с большинством рукописных make-файлов (и если вы генерируете make-файлы с помощью autotools, autotools может генерировать make-файлы, совместимые с одним или обоими). ​​

Насколько я могу судить, единственное явное преимущество bmake состоит в том, что его использование понравится людям, которые патологически боятся GPL. Но автор bmake утверждает, что это результат попытки исправить патч pmake (обычная программа BSD) для принятия вывода autotools. Учитывая проблемы, с которыми я столкнулся, пытаясь понять, что такое make-файлы, сгенерированные автоинструментами, я подозреваю, насколько это успешно. Другие люди делают другие заявления, некоторые из которых не имеют смысла.

В конце концов, если вы придерживаетесь стандартных элементов make-файлов и не отклоняетесь слишком далеко от POSIX, не должно иметь большого значения то, что заставляет вас использовать.

2 голосов
/ 20 января 2014

Марка BSD может генерировать цели на основе условий или циклов. Это иногда очень удобно.

1 голос
/ 26 января 2010

Я не использую его, но, насколько я понимаю, BSD make - это программа make + стандартная библиотека шаблонов (т. Е. Более или менее эквивалентная GNU make + automake и, возможно, autoconf).

...