차이점

차이점

왜 이것이 작동하지 않습니까? VPATH를 제거하거나 "."으로 설정하면 모든 것이 정상입니다. 실행하기 전에 비어 있는 dir, a.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비어 있고 폴더 안에는 두 개의 파일 ./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규칙도 둘 사이에 매우 다릅니다.

관련 정보