違い

違い

なぜこれがうまくいかないのですか? VPATHを削除するか「.」に設定すると、すべてが正常です。実行する前に空のdira.cppb.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空で、フォルダ内には2つのファイル./a.cppとmakeファイルがあります。./b.cpp

呼び出しmake -f makefile1エラーは次のとおりです。

make: *** No rule to make target `dir/b.o', needed by `dir/lib.a'.  Stop.

これを呼び出すと、makefile2期待される結果が得られ、エラーは報告されません。

makefile1.logmake実行時にデータベースを出力するときとの違いは次のとおりです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ルールも2つの間で非常に異なります。

関連情報