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自动设置OBJS为sed0.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引导.
我正在编写基于BSD Make的便携式构建系统BSD Owl.我在2000年开始使用GNU Make编写Makefiles并快速切换到BSD Make.让我概述一下指导我选择的原因.
这是关键点,真的.虽然GNU项目为自由软件世界提供了非常重要的软件,但文档并没有清晰地区分用户手册和参考手册,这是GNU文档的一致特征.因此,GNU Make文档是一个巨大的(超过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监视I/O使用filemon(4)以确定实际的先决条件列表.
| 归档时间: |
|
| 查看次数: |
4095 次 |
| 最近记录: |