makefile之VPATH和vpath的使⽤
  来⾃阅读陈皓的
  VPATH变量
    在⼀些⼤的⼯程中,有⼤量的源⽂件,我们通常的做法是把这许多的源⽂件分类,并存放在不同的⽬录中。所以,当 make 需要去寻⽂件的依赖关系时,你可以在⽂件前加上路径,但最好的⽅法是把⼀个路径告诉 make,让 make 在⾃动去。Makefile ⽂件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make 只会在当前的⽬录中去寻依赖⽂件和⽬标⽂件。如果定义了这个变量,那么,make就会在当当前⽬录不到的情况下,到所指定的⽬录中去寻⽂件了。
    VPATH = dir1 : dir2
上⾯的的定义指定两个⽬录,“dir1”和“dir2”,make 会按照这个顺序进⾏搜索。⽬录由“冒号”分隔。(当然,当前⽬录永远是最⾼优先搜索的地⽅)
  怎么使⽤呢?
  假设有以下⼯程,⽬录数为:
./
├── bardir
│├── bar.c
│└── bar.h
├── command.h
├── foodir
│├── foo.c
│└── foo.h
├── main.c
├── Makefile
└── README.md
  main.c中调⽤了bar.c foo.c中的函数,最直⽩的makefile
OBJS = main.o foodir/foo.o bardir/bar.o
CINCLUDES = -I./foodir -I./bardir
CFLAGS = -Wall
TARGET = test
$(TARGET):$(OBJS)
$(CC) $(CFLAGS) $^ -o $@ $(CINCLUDES)
.PHONY:clean
clean:
rm  $(OBJS) $(TARGET)
  查看⽬录树makefile phony
.
/
├── bardir
│├── bar.c
│├── bar.h
│└── bar.o
├── command.h
├── foodir
│├── foo.c
│├── foo.h
│└── foo.o
├── main.c
├── main.o
├── Makefile
├── README.md
└── test
  如果模块⽬录⽐较深,那么OBJS后⾯会跟⼀⼤堆,这时VPATH变量起到作⽤了,改进后的makefile
VPATH = ./foodir:./bardir
OBJS = foo.o bar.o main.o
CINCLUDES = -I./foodir -I./bardir
CFLAGS = -Wall $(CINCLUDES)
TARGET = test
$(TARGET):$(OBJS)
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
@-rm -f $(TARGET) $(OBJS)
  再查看⽬录树:
./
├── bardir
│├── bar.c
│└── bar.h
├── bar.o
├── command.h
├── foodir
│├── foo.c
│└── foo.h
├── foo.o
├── main.c
├── main.o
├── Makefile
├── README.md
└── test
对⽐上⼀次可以看到⼦⽬录下⽣成的.o⽂件现在⽣成在Makefile这⼀级⽬录了。需要注意的是:通过VPATH告知⽂件搜寻路径是告知的make,这利于它隐式推导时的⽂件搜索,⽽不是告知的gcc,所以还是得通过-I指定gcc预编译时头⽂件搜索路径。
vpath关键字
。。。