差异

差异

为什么这不起作用?如果我删除 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.cppmake 文件存在于该文件夹内。

调用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两者之间的规则也有很大不同。

相关内容