为什么这不起作用?如果我删除 VPATH 或将其设置为“.” - 一切都很好。空dir
, a.cpp
,b.cpp
运行前已存在。
VPATH=./.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch x
dir/%.o: %.cpp | x
touch $@
答案1
这不是答案,但评论不适合显示差异。这就是您需要的重要信息。
生成文件1:
VPATH=./.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch $@
dir/%.o: %.cpp | x
touch $@
生成文件2:
VPATH=.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch $@
dir/%.o: %.cpp | x
touch $@
注意力食谱的前缀字符是制表符。请注意,如果您复制并粘贴内容。
该文件夹./dir
是空的,两个文件./a.cpp
和./b.cpp
make 文件存在于该文件夹内。
调用make -f makefile1
报错如下:
make: *** No rule to make target `dir/b.o', needed by `dir/lib.a'. Stop.
调用它makefile2
会给出预期结果并且不会报告任何错误。
makefile1.log
运行 make 时打印数据库时,和之间的区别如下makefile2.log
:
--- /dev/fd/63 2015-04-13 18:31:30.370203634 +0000
+++ /dev/fd/62 2015-04-13 18:31:30.370203634 +0000
@@ -1,5 +1,7 @@
touch x
touch dir/a.o
+touch dir/b.o
+touch dir/lib.a
<D = $(patsubst %/,%,$(dir $<))
?F = $(notdir $?)
CWEAVE = cweave
@@ -99,7 +101,7 @@
SSH_CLIENT = ...
MAIL = /var/mail/user
LEX.l = $(LEX) $(LFLAGS) -t
-VPATH = ./.
+VPATH = .
+D = $(patsubst %/,%,$(dir $+))
COMPILE.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c
TMUX = /tmp/tmux-1000/default,3455,0
@@ -282,6 +284,8 @@
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
%:: SCCS/s.%
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
+dir/lib.a: dir/a.o dir/b.o
+ touch $@
.web.p:
$(TANGLE) $<
.l.r:
@@ -297,6 +301,8 @@
$(RM) y.tab.c
.o:
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
+x:
+ touch $@
.y:
.def.sym:
$(COMPILE.def) -o $@ $<
@@ -331,8 +337,6 @@
$(COMPILE.r) $(OUTPUT_OPTION) $<
.r:
$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
-dir/a.o: a.cpp | x
- touch $@
.info:
.elc:
.l.c:
@@ -344,7 +348,6 @@
$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
.r.f:
$(PREPROCESS.r) $(OUTPUT_OPTION) $<
-dir/b.o:
.S:
$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
.texinfo.info:
@@ -359,6 +362,7 @@
$(COMPILE.s) -o $@ $<
.s:
$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
+b.cpp:
.texinfo.dvi:
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.el:
@@ -372,6 +376,8 @@
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.DEFAULT:
.h:
+dir/a.o: a.cpp | x
+ touch $@
.tex.dvi:
$(TEX) $<
.cpp.o:
@@ -384,10 +390,10 @@
.texi:
.txinfo:
.tex:
+dir/b.o: b.cpp | x
+ touch $@
.txinfo.info:
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
-dir/lib.a: dir/a.o dir/b.o
- touch $@
.ch:
.S.s:
$(PREPROCESS.S) $< > $@
@@ -398,8 +404,6 @@
.F.f:
$(PREPROCESS.F) $(OUTPUT_OPTION) $<
.w:
-x:
- touch $@
.S.o:
$(COMPILE.S) -o $@ $<
.F:
这些是通过以下命令检索的:
$ /usr/bin/diff <(grep -vE '(^#|makefile1|^\s*$)' makefile1.log) <(grep -vE '(^#|makefile2|^\s*$)' makefile2.log)
差异
真正的区别似乎是 makefile2 有一个虚假目标,b.cpp
并且它包含以下内容:
touch dir/b.o
touch dir/lib.a
dir/b.o
两者之间的规则也有很大不同。