bmake的优点

pra*_*bhu 10 makefile build gnu-make bsdmake

除了bmake相当于GNU make的BSD之外,我无法清楚地理解它比GNU make更具优势.谁能帮我?我只能找到一个有点帮助的资源.更多的帮助或指示表示赞赏.

谢谢,帕布

Geo*_*ler 11

BSD make和GNU make都是原始AT&T品牌的免费替代品.主要区别在于高级功能的语法不同.以下是如何将shell命令的输出放在BSD make中的变量中:

# BSD make
TODAY != date +%Y-%m-%d
Run Code Online (Sandbox Code Playgroud)

在GNU make:

# GNU make
TODAY = $(shell date +%Y-%m-%d)
Run Code Online (Sandbox Code Playgroud)

只要有人$(shell ...)在Makefile中写入,就会有GNU make.由于语法不同,有些软件包需要GNU make用于构建,有些软件包需要BSD make.

BSD make以PMake开始,是并行制作的缩写.它的作者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 as 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>
Run Code Online (Sandbox Code Playgroud)

这里bsd.prog.mk自动设置OBJSsed0.o sed1.o,定义一个sed目标来链接来自这些对象的sed,定义其他目标,如clean,depend,install,以及make install安装sed及其手册页sed.1的原因.还有用于构建库的bsd.lib.mk.

使用bsd.*.mk时,每个Makefile只能构建一个程序或库.要构建另一个,必须在另一个目录中有第二个Makefile.因此,OpenBSD中的src/usr.sbin/smtpd /有六个子目录,其中每个子目录只包含一个Makefile,因为smtpd构建了六个程序.

除了BSD本身之外,使用bsd.*.mk来构建任何东西也很少见.来自BSD开发人员的许多可移植软件包,如OpenSSH(来自OpenBSD)或mksh(来自MirBSD),不需要BSD make,也不使用bsd.*.mk文件.

文件bsd.port.mk位于FreeBSD Ports的中心,FreeBSD Ports是为FreeBSD构建软件包的系统.(NetBSD pkgsrc调用此文件bsd.pkg.mk.)此系统在其他脚本语言中具有竞争对手.Homebrew使用Ruby.MacPorts使用Tcl.

在过去,GNU make比BSD make更便携.由于BSD make是BSD的一部分,因此很少在其他系统上找到BSD make.现在有其他系统的便携式bmake.这是NetBSD make的便携版本.便携式bmake最常见的用途是在非NetBSD系统上运行pkgsrc.我在OS X上运行pkgsrc,其中bmake由pkgsrc引导.

  • @IsmaelLuceno 是的。然而,“$(shell xxx)”语法仍然有一个优点,即您可以选择要创建的变量类型,例如您可以使用“:=”、“+=”等来代替“=”。 (3认同)
  • gmake 4.x 添加了对 `!=` 语法的支持。 (2认同)
  • @JohanBoulé `$(shell ...)` 语法可能会引入排序问题,因为它是在扩展时处理的(`!=` 立即扩展,如 `:=`),并且您始终可以使用中间值`!=`结果的变量... (2认同)

Mic*_*ald 6

我正在编写基于BSD Make的便携式构建系统BSD Owl.我在2000年开始使用GNU Make编写Makefiles并快速切换到BSD Make.让我概述一下指导我选择的原因.

文件和现有文献

这是关键点,真的.虽然GNU项目为自由软件世界提供了非常重要的软件,但文档并没有清晰地区分用户手册和参考手册,这是GNU文档的一致特征.因此,GNU Make文档是一个巨大的(超过200页)文档,用玩具示例交错仔细描述系统的每个方面.当我使用它时,我从未发现这些示例有用,因为它们远远没有实际用例,并且总是需要几分钟来查找或重新定位我必须查找的信息.可用于GNU Make的文献语料库非常庞大,但很难找到有趣的例子来指导自己编写像BSD Owl这样的综合便携式构建系统.也许是因为项目依赖于automake而不是直接编写Makefile.也许是因为我没有足够的搜索.

FreeBSD方面的状况要好得多.确实,

  • Adam de Boor有一个规范教程或用户手册.
  • 手册可以很好地充当一个参考手册,并远低于30页.
  • FreeBSD构建系统和FreeBSD ports系统是手写makefile的语料库.

当然,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监视I/O使用filemon(4)以确定实际的先决条件列表.


APr*_*mer 1

我没有使用它,但我的理解是BSD make是一个make程序+一个标准模板库(即或多或少相当于GNU make + automake,也许还有autoconf)。