The value of the make variable VPATH specifies a list of directories that make should search. Most often, the directories are expected to contain prerequisite files that are not in the current directory; however, make uses VPATH as a search list for both prerequisites and targets of rules.
--《GNU make》, Version 3.81 4.4.1 《VPATH: Search Path for All Prerequisites》
"VPATH" 变量指定了一个供make 搜索的目录列表。通常理解,这些目录服务于依赖文件,它包含了不在当前目录而又被目标文件所依赖的文件。然而,make 将这个目录列表同时应用于依赖文件和目标文件。
--《GUN make 手册》4.4.1 《VPATH:依赖文件的搜索路径》
需求描述:
一个项目中有两个类Main和Pub,生成的可执行文件为winner。其文件分布结构如下:
我们希望,无论pub移动到哪里,在makefile中做尽量少的修改。
最简单的makfile文件内容如下:
CC = g++
COMPILE.C = $(CC) -c
MAKEEXE = $(CC) $(LDFLAGS)
OBJ = main.o ../pub/b.o
EXE = winner
all: $(EXE)
$(EXE): ${OBJ}
$(MAKEEXE) $(OBJ) -o $(EXE)
main.o: main.cpp
$(COMPILE.C) main.cpp -o main.o
../pub/b.o: ../pub/b.cpp
$(COMPILE.C) ../pub/b.cpp -o ../pub/b.o
clean:
rm -f *.o $(EXE) core
上面的makefile使用了三次路径。修改起来很麻烦。我们可以通过使用“虚拟路径”(VPATH)和"自动变量"对其进行优化。
经过优化的 makefile 文件如下:
COMPILE.C = $(CC) -c
VPATH = ../pub
MAKEEXE = $(CC) $(LDFLAGS)
OBJ = main.o ../pub/b.o
EXE = winner
all: $(EXE)
$(EXE): ${OBJ}
$(MAKEEXE) $< -o $@
main.o: main.cpp
$(COMPILE.C) $< -o $@
b.o: b.cpp
$(COMPILE.C) $< -o $@
clean:
rm -f *.o $(EXE) core
解释:
VPATH用于依赖检查。
上面的"$^","$@"称做“自动变量”。(automatic variables)“自动变量”用于shell 命令参数。