除了bmake与GNU make等效的BSD事实外,我无法清楚地了解它比GNU make的优势。谁能帮我?我只能找到一个有用的resource。感谢您提供更多帮助或指示。
最佳答案
BSD品牌和GNU品牌都是原始AT&T品牌的免费替代品。主要区别在于高级功能的语法不同。这是将shell命令的输出放入BSD make的变量中的方法:
# BSD make
TODAY != date +%Y-%m-%d
并在GNU中进行:
# GNU make
TODAY = $(shell date +%Y-%m-%d)
只要有人在Makefile中写入
$(shell ...)
,它就会要求GNU make。由于语法不同,某些软件包需要GNU make进行构建,而某些软件包则需要BSD make。BSD make以 PMake 开头,它是并行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之前的发行版)定义了多个目标,例如清理,依赖,安装等。 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本身以外,很少使用bsd。*。mk来构建任何东西。来自BSD开发人员的许多可移植软件包,例如OpenSSH(来自OpenBSD)或mksh(来自MirBSD),不需要BSD make,也不使用bsd。*。mk文件。
文件bsd.port.mk位于FreeBSD Ports的中心,该系统为FreeBSD构建软件包。 (NetBSD pkgsrc将此文件称为bsd.pkg.mk。)此系统在其他脚本语言中具有竞争对手。自制软件使用Ruby。 MacPorts使用Tcl。
过去,GNU make比BSD make更可移植。由于BSD品牌是BSD的一部分,因此很少在其他系统上找到BSD品牌。现在为其他系统提供了portable bmake。这是NetBSD make的便携式版本。便携式bmake的最常见用法是在非NetBSD系统上运行pkgsrc。我在OS X上运行pkgsrc,bmake由pkgsrc引导。