Por que o gmake falha se o vpath apontar para o diretório atual

0

Por que isso não funciona? Se eu remover VPATH ou configurá-lo para '.' - tudo bem. Vazio dir , a.cpp , b.cpp existe antes de ser executado.

VPATH=./.
dir/lib.a: dir/a.o dir/b.o
        touch $@

x:
        touch x

dir/%.o: %.cpp | x
        touch $@
    
por gena2x 13.04.2015 / 19:48

1 resposta

1

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.

    
por 13.04.2015 / 20:51

Tags