首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动创建.OBJDIR子目录

自动创建.OBJDIR子目录
EN

Stack Overflow用户
提问于 2016-12-21 23:14:24
回答 1查看 1.1K关注 0票数 2

操作系统: FreeBSD 11.0-发布

我有以下目录结构:

代码语言:javascript
复制
/xxx/obj/
/xxx/src/deep.cpp
/xxx/flat.cpp
/xxx/makefile

makefile的内容如下:

代码语言:javascript
复制
flat.out: flat.o

deep.out: src/deep.o

我建公寓没有问题:

代码语言:javascript
复制
/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

但当我试图建立深度的时候,它失败了:

代码语言:javascript
复制
/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,它就成功了:

代码语言:javascript
复制
/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来自动创建相关目录?

EN

回答 1

Stack Overflow用户

发布于 2016-12-27 15:39:20

支持自动创建源代码外的OBJDIR,但并不是您所期望的那样。源外OBJDIR的创建可以用bmake(1)指令实现,但bmake(1)程序本身不支持。尽管如此,

  • 如果使用FreeBSD附带的bmake(1)指令来构建项目,则obj目标支持并实现OBJDIR的创建,以便命令make obj将创建OBJDIR。有关更多文档和实现细节,请参见文件bsd.obj.mk。FreeBSD源代码包含了许多使用这些指令构建的程序示例。
  • 如果使用作为(可移植的) https://github.com/michipili/bsdowl提供的bmake(1)指令,则目标obj支持并实现OBJDIR的创建,以便命令make obj或使用更通用目标的命令make preparatives创建OBJDIR。示例目录包含了几个基于C的示例,展示了如何准备Makefile来使用https://github.com/michipili/bsdowl构建项目。
  • 如果您使用自定义的bmake(1)指令,那么您必须自己实现一个目标来处理这个创建。bsd.obj.mk文件无疑是开始这方面工作的一个很好的来源。

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

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

https://stackoverflow.com/questions/41273497

复制
相关文章

相似问题

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