なぜこれがうまくいかないのですか? 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
空で、フォルダ内には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.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
ルールも2つの間で非常に異なります。