除了bmake是GNU make的BSD之外,我无法清楚地理解它比GNU make更具优势。谁能帮我?我只能找到一个有用的resource。更多的帮助或指示表示赞赏。
谢谢,Prabhu
答案 0 :(得分:11)
BSD make和GNU make都是原始AT& T make的免费替代品。主要区别在于高级功能的语法不同。以下是如何将shell命令的输出放在BSD make中的变量中:
# BSD make
TODAY != date +%Y-%m-%d
在GNU make:
# GNU make
TODAY = $(shell date +%Y-%m-%d)
只要有人在Makefile中写$(shell ...)
,就会有GNU make。由于语法不同,有些软件包需要GNU make用于构建,有些软件包需要BSD make。
BSD make的开头是 PMake , parallel make 的缩写。其作者Adam de Boor在 PMake -- A Tutorial 中描述了PMake。它的优点是并行运行作业的新能力,如make -j 3
。此并行模式通过在单个shell中为每个目标运行所有命令而不是每行一个shell来破坏兼容性。 GNU make有一个并行模式,也就是-j
,每行保留一个shell。 NetBSD make(1)现在有make -B -j 3
进行并行模式,每行一个shell。 OpenBSD make(1)现在总是进行并行模式,每行一个shell。
4.3BSD-Reno包括PMake为make
和bsd。*。mk包含文件。这些包含文件是BSD make的最佳功能。 src/bin/sed/Makefile in 4.3BSD-Tahoe(4.3BSD-Reno之前的版本)定义了几个目标,如clean,depend,install等。 src/usr.bin/sed/Makefile in 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,depend,install ,并导致make install
同时安装sed及其手册页sed.1。还有 bsd.lib.mk 用于构建库。
使用bsd。*。mk时,每个Makefile只能构建一个程序或库。要构建另一个,必须在另一个目录中有第二个Makefile。所以src/usr.sbin/smtpd/ in OpenBSD有六个子目录,每个子目录只包含一个Makefile,因为smtpd构建了六个程序。
使用bsd。*。mk构建除BSD本身之外的任何东西也很少见。来自BSD开发人员的许多可移植软件包,如OpenSSH(来自OpenBSD)或mksh(来自MirBSD),不需要BSD make,也不使用bsd。*。mk文件。
文件 bsd.port.mk 位于FreeBSD Ports的中心,该系统为FreeBSD构建软件包。 (NetBSD pkgsrc调用此文件 bsd.pkg.mk 。)此系统在其他脚本语言中具有竞争对手。 Homebrew使用Ruby。 MacPorts使用Tcl。
过去,GNU make比BSD make更便携。由于BSD make是BSD的一部分,因此很少在其他系统上找到BSD make。现在其他系统有portable bmake。这是NetBSD make的便携版本。便携式bmake最常见的用途是在非NetBSD系统上运行pkgsrc。我在OS X上运行pkgsrc,其中bmake由pkgsrc引导。
答案 1 :(得分:5)
我正在编写BSD Owl,一个基于BSD Make的可移植构建系统。我在2000年开始使用GNU Make编写Makefiles并快速切换到BSD Make。让我概述一下指导我选择的原因。
这是关键点,真的。虽然GNU项目为自由软件世界提供了非常重要的软件,但文档并没有清楚地区分user manual and reference manual,这是GNU文档的一致特征。因此,GNU Make文档是一个huge(超过200页)的文档,用玩具示例交错仔细描述系统的每个方面。当我使用它时,我从未发现这些示例有用,因为它们远远没有实际用例,并且总是需要几分钟来查找或重新定位我必须查找的信息。可用于GNU Make的文献语料库非常庞大,但很难找到有趣的例子来引导自己编写像BSD Owl这样的综合可移植构建系统。也许是因为项目依赖于automake而不是直接编写Makefile。也许是因为我没有足够的搜索。
FreeBSD方面的状态好多了。事实上,
当然,BSD Make的手册页并不像GNU Make手册那样详细,但它更密集,更易于使用。 FreeBSD构建系统同时是(a)BSD Make可以协调大型复杂项目构建的概念证明,以及(b)Makefile编写领域的高级技术展示。
一个非常有趣的事情是GNU Make的编程功能似乎比BSD Make提供的功能强大得多。然而,我发现它们难以使用,主要是因为扩展顺序,以及缺乏有用的例子。 BSD Make的构造和功能要少得多,但它们非常可靠且易于使用:我需要编写的大部分代码都是条件和for循环来定义目标列表,BSD Make非常容易且可靠地完成这项工作。
BSD Make有一个GNU Make没有的高级功能 - 据我所知 - 它被称为元模式。编写Makefile的最困难的部分是在包中正确指定先决条件列表。像mkdep(1)
这样的软件试图通过分析源来自动化该过程。 BSD Make采用了不同的方法:我们编写一个可能有错误(不完整)依赖关系的Makefile,但精确到足以成功构建包。在此过程中,BSD Make使用filemon(4)
监视I / O以确定实际的先决条件列表。
答案 2 :(得分:2)
每当将GNU实用程序与BSD实用程序进行比较时,请记住,大多数进行比较的人会将许可视为一项功能或错误本身 - 并且有一半的开发人员进行比较有利于许可和一半的优惠类似GPL的病毒许可证。这并不是说没有真正的差异(有时会有,但往往是洗手)。
bmake并不像GNU make那样臃肿,两者都与大多数手写的makefile兼容(如果使用autotools生成makefile,autotools能够生成与其中一个或两者兼容的makefile)。
据我所知,bmake唯一明显的好处是使用它会让那些病态上害怕GPL的人感到高兴。但是,bmake的作者声称这是尝试修补pmake(正常的BSD make)来接受autotools输出的结果。考虑到我试图让它理解autotools生成的makefile的麻烦,我怀疑这是多么成功。其他人提出其他要求,其中一些没有意义。
最后,如果你坚持使用makefile的标准元素,并且不要偏离POSIX太远,那么使用它并不重要。
答案 3 :(得分:2)
BSD make可以根据条件或循环内部生成目标。这有时非常方便。
答案 4 :(得分:1)
我没有使用它,但我的理解是BSD make是一个make程序+一个标准的模板库(即或多或少相当于GNU make + automake和autoconf)。