2

操作系统:FreeBSD 11.0-RELEASE

我有以下目录结构:

/xxx/obj/
/xxx/src/deep.cpp
/xxx/flat.cpp
/xxx/makefile

makefile的内容如下:

flat.out: flat.o

deep.out: src/deep.o

我建公寓没问题:

/xxx $ make flat.out
c++ -O2 -pipe -c /xxx/flat.cpp -o flat.o
cc -O2 -pipe  flat.o  -o flat.out
/xxx $ ls obj
flat.o          flat.out

但是,当我尝试深入构建时,它失败了:

/xxx $ make deep.out
c++ -O2 -pipe -c /xxx/src/deep.cpp -o src/deep.o
error: unable to open output file 'src/deep.o': 'No such file or directory'
1 error generated.
*** Error code 1

Stop.
make: stopped in /xxx

如果我然后/xxx/obj/src手动创建它会成功:

/xxx $ mkdir obj/src
/xxx $ make deep.out
c++ -O2 -pipe -c /xxx/src/deep.cpp -o src/deep.o
cc -O2 -pipe  src/deep.o  -o deep.out
/xxx $ ls obj
deep.out        flat.o          flat.out        src
/xxx $ ls obj/src
deep.o

根据这个来源, bmake(又名 bsdmake?)支持自动创建源外 OBJDIR,但我不知道具体如何。

在一般情况下,如何配置 bmake 以自动创建相关目录?

4

1 回答 1

1

支持自动创建源外 OBJDIR,但不是您所期望的那样。源外 OBJDIR 的创建可以使用bmake(1)指令实现,但bmake(1)程序本身不支持。也就是说,

  • 如果您使用FreeBSD 附带的bmake(1)指令来构建您的项目,那么目标支持和实现 OBJDIR 的创建obj,因此该命令make obj将创建 OBJDIR。有关更多文档和实施详细信息,请参阅该文件bsd.obj.mk。FreeBSD 源包含大量使用这些指令构建的程序示例。

  • 如果您使用作为(便携式)bsdowl 包提供的bmake(1)指令,则目标支持和实现 OBJDIR 的创建,以便命令或使用更通用目标的命令将创建 OBJDIR。示例目录包含几个基于 C的示例,展示了如何准备 Makefile 以使用bsdowl 包构建项目。objmake objmake preparatives

  • 如果您使用自定义bmake(1)指令,那么您必须自己实现一个目标来处理此创建。该文件bsd.obj.mk绝对是开始使用此文件的好来源。

需要注意的重要一点是,bmake(1)在处理任何目标之前确定其实际工作目录,这意味着执行请求自行创建 OBJDIR 的目标几乎总是正确的做法。因此,bmake obj all您示例中的命令将失败,并显示您在上面报告的相同错误消息。正确的调用应该是bmake obj && bmake all,因为第二个bmake(1)进程现在有机会更改为上一次运行创建的 OBJDIR。

于 2016-12-27T15:39:20.230 回答