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)
只要有人写$(shell ...)
在 Makefile 中,它需要 GNU make。由于语法不同,有些包需要 GNU make 来构建,有些则需要 BSD make。
BSD make 的诞生始于PMake, 短缺平行制造。它的作者 Adam de Boor 在中描述了 PMake制作——教程。它的优点是并行运行作业的新能力,如make -j 3
。这种并行模式通过在单个 shell 中运行每个目标的所有命令(而不是在每行一个 shell 中)来破坏兼容性。 GNU make 还有并行模式-j
,每行保留一个 shell。NetBSD 制作(1)现在有make -B -j 3
每行一个 shell 进行并行模式。OpenBSD 制作(1)现在总是采用并行模式,每行一个 shell。
4.3BSD-Reno 包含 PMake 作为make
和 bsd.*.mk 包含文件。这些包含文件是 BSD make 的最佳功能。4.3BSD-Tahoe 中的 src/bin/sed/Makefile(4.3BSD-Reno 之前的版本)定义了几个目标,例如 clean、depend、install 等。4.3BSD-Reno 中的 src/usr.bin/sed/Makefile只有四行非空行:
# @(#)Makefile 4.6 (Berkeley) 5/11/90
PROG= sed
SRCS= sed0.c sed1.c
.include <bsd.prog.mk>
Here bsd 程序自动设置OBJS
to sed0.o sed1.o
,定义一个 sed 目标来链接 sed 与这些对象,定义其他目标,如 clean、depend、install 和 Causesmake install
安装 sed 及其手册页 sed.1。还有bsd.lib.mk用于建立图书馆。
当使用bsd.*.mk时,每个Makefile只能构建一个程序或库。要构建另一个 Makefile,另一个目录中必须有第二个 Makefile。所以OpenBSD 中的 src/usr.sbin/smtpd/有六个子目录,其中每个子目录只包含一个Makefile,因为smtpd构建了六个程序。
除了 BSD 本身之外,很少使用 bsd.*.mk 来构建任何东西。 BSD 开发人员提供的许多可移植软件包,例如 OpenSSH(来自 OpenBSD)或 mksh(来自 MirBSD),不需要 BSD make,也不使用 bsd.*.mk 文件。
文件bsd 端口.mk是在的中心FreeBSD 端口,为 FreeBSD 构建软件包的系统。 (NetBSD 软件包调用这个文件bsd 软件包.) 该系统在其他脚本语言中具有竞争对手。 Homebrew 使用 Ruby。 MacPort 使用 Tcl。
过去,GNU make 比 BSD make 更可移植。由于 BSD make 是 BSD 的一部分,因此很少在其他系统上找到 BSD make。现在有便携式bmake对于其他系统。这是 NetBSD make 的便携版本。便携式 bmake 最常见的用途是在非 NetBSD 系统上运行 pkgsrc。我在 OS X 上运行 pkgsrc,并由 pkgsrc 引导 bmake。