首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bmake的优点

bmake的优点
EN

Stack Overflow用户
提问于 2010-01-25 17:17:59
回答 5查看 5.3K关注 0票数 13

除了bmake是GNU make的BSD等价物之外,我无法清楚地理解它相对于GNU make的优势。有谁可以帮我?我只能找到一个对我有帮助的resource。感谢更多的帮助或指点。

EN

回答 5

Stack Overflow用户

发布于 2014-08-06 12:28:24

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

代码语言:javascript
复制
# BSD make
TODAY != date +%Y-%m-%d

代码语言:javascript
复制
# 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。它的优点是新的并行运行作业的能力,就像在make -j 3中一样。这种并行模式破坏了兼容性,在单个shell中为每个目标运行所有命令,而不是在每行一个shell中运行所有命令。GNU make有一个并行模式,也是-j,它每行只保留一个shell。NetBSD make(1)现在有了make -B -j 3来实现并行模式,每行一个外壳。OpenBSD make(1)现在总是采用并行模式,每行只有一个外壳。

4.3BSD-Reno包含PMake作为make和bsd.*.mk包含文件。这些包含文件是BSD make的最佳特性。src/bin/sed/Makefile in 4.3BSD-Tahoe (4.3BSD-Reno之前的版本)定义了几个目标,如清理、依赖、安装等。

代码语言:javascript
复制
#   @(#)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构建软件包。

在过去,GNU make比BSD make更便携。因为BSD make是BSD的一部分,所以很少在其他系统上找到BSD make。便携bmake最常见的用途是在非NetBSD系统上运行pkgsrc。我在OS X上运行pkgsrc,其中bmake由pkgsrc引导。

票数 13
EN

Stack Overflow用户

发布于 2014-10-22 16:54:20

我正在写BSD Owl,一个基于BSD Make的可移植构建系统。我在2000年开始使用GNU Make编写Makefile,并很快切换到BSD Make。让我概述一下指导我选择的原因。

文档和可用的文献

这是重点,真的。虽然GNU项目为自由软件世界提供了非常棒和重要的软件,但文档并没有清晰地区分user manual and reference manual,这是GNU文档的一致特征。因此,GNU Make文档是一个huge文档(超过200页),其中交织着系统的每个方面的详细描述和玩具示例。当我使用它时,我从来没有发现这些示例有用,因为它们与实际用例相去甚远,并且总是需要几分钟来定位或重新定位我必须查找的信息。GNU Make可用的文献语料库非常庞大,但是很难找到有趣的例子来指导自己编写像BSD Owl这样的全面的可移植构建系统。也许是因为项目依赖于automake,而不是直接编写Makefile。也许是因为我找得不够努力。

FreeBSD方面的情况要好得多。的确,

Adam de Boor.

  • The manual page提供了一份规范的教程或用户手册,可用作参考手册,篇幅不超过30页。

  • FreeBSD build system和FreeBSD ports system是一个手写生成文件的语料库。

当然,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,它可能有but (不完整)的依赖关系,但足够精确,可以成功地构建包。在此过程中,BSD Make使用filemon(4)监视I/O,以确定实际的先决条件列表。

票数 10
EN

Stack Overflow用户

发布于 2014-01-20 21:23:53

BSD make可以基于条件或在循环内生成目标。这有时非常方便。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2131219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档