私のメイクファイル:
CC=cc
INC=-I.
CFLAGS=-g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN
LDFLAGS=-ldl
OBJS=*.o
OBJDIR=.obj
BINDIR=.obj
LIBDIR=.obj
%.o: %.c
$(CC) $(INC) $(CFLAGS) -DSFHASH -o $(OBJDIR)/$@ -c $<
VPATH = .obj
#vpath %.o $(OBJDIR)
hashtest: hashfuncs.o hast.o scanners.o parseargs.o
$(CC) -rdynamic -o $(BINDIR)/$@ $^ $(LDFLAGS)
clean:
@rm -f $(OBJDIR)/$(OBJS) $(BINDIR)/hashtest
初めて使用します: make は gcc の入力ファイル パスを書き換えません:
@delphi# make clean
@delphi# make
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/hashfuncs.o -c hashfuncs.c
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/hast.o -c hast.c
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/scanners.o -c scanners.c
cc -I. -g -DDEBUG -std=gnu99 -DSFHASH -DDOMAIN -DSFHASH -o .obj/parseargs.o -c parseargs.c
cc -rdynamic -o .obj/hashtest hashfuncs.o hast.o scanners.o parseargs.o -ldl
cc: error: hashfuncs.o: No such file or directory
cc: error: hast.o: No such file or directory
cc: error: scanners.o: No such file or directory
cc: error: parseargs.o: No such file or directory
make: *** [hashtest] Error 1
2 回連続で使用すると、次のようになります。
@delphi# make
cc -rdynamic -o .obj/hashtest .obj/hashfuncs.o .obj/hast.o .obj/scanners.o .obj/parseargs.o -ldl
@delphi#
GNU Make マニュアルには次のように書かれています。
make 変数 VPATH の値は、make が検索するディレクトリのリストを指定します。ほとんどの場合、ディレクトリには、現在のディレクトリにない前提条件ファイルが含まれていると予想されます。ただし、 make は前提条件と *ルールの対象*の両方の検索リストとして VPATH を使用します。
VPATH が set-once-at-startup-typeof-variable であるかどうかは理解できますが、そうではありません。実行時に生成されたターゲットの依存関係が適切に検索されているという事実がそうです。
どうしたの?make が gcc の入力ファイル パスを 2 回目だけ正しく書き換えるのはなぜですか?