操作系统: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
根据this source bmake(又名bsdmake?)支持自动创建源外OBJDIR,但我无法弄清楚究竟是怎么回事。
在一般情况下,如何配置bmake自动创建相关目录?
答案 0 :(得分:0)
支持自动创建源外OBJDIR,但不是您希望它的意义。使用 bmake(1)指令可以实现源外OBJDIR 的创建,但 bmake(1)程序本身不支持。那就是说,
如果您使用FreeBSD附带的 bmake(1)指令来构建项目,那么[I J] = meshgrid(1:M,1:N);
idx1 = sub2ind([M N], I ,J);
R = c.* W(idx1) ./ a(I);
T = accumarray([K(idx1(:)) ,J(:)], R(:),[M N]);
目标支持并实现OBJDIR的创建,以便命令------------------ Divakar
Elapsed time is 0.282008 seconds.
------------------ rahnema1
Elapsed time is 1.08827 seconds.
------------------ gnovice
Elapsed time is 0.418701 seconds.
------------------ loop
doesn't complete in 15 seconds.
将创建OBJDIR。有关更多文档和实现详细信息,请参阅文件bsd.obj.mk
。 FreeBSD源包含许多使用这些指令构建的程序示例。
如果您使用 bmake(1)指令作为(可移植的)bsdowl package提供,则目标obj
支持并实施OBJDIR的创建这样命令make obj
或使用更一般目标的命令obj
将创建OBJDIR。 example directory包含几个基于C的示例,展示了如何使用bsdowl package准备Makefile以构建项目。
如果您使用自定义 bmake(1)指令,那么您必须自己实现一个目标来处理此创建。文件bsd.obj.mk
绝对是开始使用此文件的好来源。
需要注意的一点是, bmake(1)在处理任何目标之前确定其实际工作目录,这意味着执行请求目标的目标几乎总是正确的。自己创建OBJDIR。因此,您的示例中的命令make obj
将失败,并显示您在上面报告的相同错误消息。正确的调用将改为make preparatives
,因为第二个bmake obj all
进程现在有机会更改为上一次运行创建的OBJDIR。