操作系统: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
根据这个来源 https://www.bsdcan.org/2014/schedule/attachments/267_freebsd-bmake-slides.pdfbmake(又名 bsdmake?)支持自动创建源外 OBJDIR,但我不知道具体是如何实现的。
在一般情况下,如何配置 bmake 自动创建相关目录?
支持自动创建源外 OBJDIR,但不是您所期望的那样。创建源外 OBJDIRcan实施与bmake(1)指令但不受支持bmake(1)程序本身。也就是说,
如果你使用bmake(1)FreeBSD 附带的指令来构建您的项目,然后 OBJDIR 的创建由obj
目标,以便命令make obj
将创建 OBJDIR。查看文件bsd.obj.mk https://github.com/freebsd/freebsd/blob/master/share/mk/bsd.obj.mk了解更多文档和实施细节。 FreeBSD 源代码包含许多使用这些指令来构建的程序示例。
如果你使用bmake(1)指令作为(便携式)提供bsdowl 包 https://github.com/michipili/bsdowl,那么OBJDIR的创建是由目标支持并实现的obj
这样命令make obj
或命令make preparatives
使用更通用的目标将创建 OBJDIR。这示例目录 https://github.com/michipili/bsdowl/tree/master/example/langc包含几个基于 C 的示例,展示如何准备 Makefile 以使用bsdowl 包 https://github.com/michipili/bsdowl.
如果您使用自定义bmake(1)指令,那么您将必须自己实现一个负责此创建的目标。文件bsd.obj.mk https://github.com/freebsd/freebsd/blob/master/share/mk/bsd.obj.mk绝对是一个很好的入门资源。
需要注意的重要一点是bmake(1)在处理任何目标之前确定其实际工作目录,这意味着执行请求自行创建 OBJDIR 的目标几乎总是正确的做法。正因为如此,该命令bmake obj all
从您的示例中将会失败,并出现与上面报告的相同的错误消息。正确的调用应该是bmake obj && bmake all
,从第二个开始bmake(1)
进程现在有机会更改为上次运行创建的 OBJDIR。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)