Esta não é uma resposta, mas os comentários não são adequados para mostrar as diferenças. E essa é a informação vital que você precisa.
makefile1:
VPATH=./.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch $@
dir/%.o: %.cpp | x
touch $@
makefile2:
VPATH=.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch $@
dir/%.o: %.cpp | x
touch $@
Atenção o caractere de prefixo das receitas é uma guia. Lembre-se de que, se copiar e colar o conteúdo,
A pasta ./dir
está vazia e os dois arquivos ./a.cpp
e ./b.cpp
existem dentro da pasta com o (s) arquivo (s) de criação.
Invocar make -f makefile1
apresenta um erro da seguinte forma:
make: *** No rule to make target 'dir/b.o', needed by 'dir/lib.a'. Stop.
Invocá-lo em makefile2
fornece o resultado esperado e não relata erros.
Ao imprimir o banco de dados durante a execução do make, as diferenças são as seguintes entre makefile1.log
e 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:
Estes foram recuperados com o seguinte comando:
$ /usr/bin/diff <(grep -vE '(^#|makefile1|^\s*$)' makefile1.log) <(grep -vE '(^#|makefile2|^\s*$)' makefile2.log)
As diferenças
A diferença real parece ser que makefile2 tem um destino falso para b.cpp
e que contém o seguinte:
touch dir/b.o
touch dir/lib.a
também a regra para dir/b.o
difere consideravelmente entre os dois.