一个例子:
edit: main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o: main.c defs.h
cc -c main.c
kbd.o: kbd.c defs.h command.h
cc -c kbd.c
command.o: command.c defs.h command.h
cc -c command.c
display.o: display.c defs.h buffer.h
cc -c display.c
insert.o: insert.c defs.h buffer.h
cc -c insert.c
search.o: search.c defs.h buffer.h
cc -c search.c
files.o: files.c defs.h buffer.h command.h
cc -c files.c
utils.o utils.c defs.h
cc -c utils.c
clean:
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
make是如何工作的
在默认情况下,也就是只输入make命令,那么
1. make会在当前目录下找名字叫Makefile或makefile的文件。
2. 如果找到,它会把文件第一个目标作为最终的目标文件。
3. 如果edit不存在,或是edit所依赖的后面的.o文件修改时间比edit这个文件新,那么会执行后面定义的命令来生成edit这个文件。
4. 如果edit所依赖的.o文件也存在,那么会在当前文件中找.o文件的依赖性,再根据那个规则生成.o文件。
makefile中使用变量
我们申明一个变量,在一开始就定义:OBJS = main.o kbd.o command.o display.o insert.o search.o file.o utils.o,于是我们可以很方便地以$(OBJS)的方式使用这个变量了。
make自动推导
只要make看到一个.o文件,它就会自动把.c文件加载依赖关系中。例子:
OBJS = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit: $(OBJS)
cc -o edit $(OBJS)
main.o: defs.h
kbd.o: defs.h command.h
.....
.PHONY: clean
clean:
rm edit $(OBJS)
这种方法,也就是make的隐晦规则。
通配符
例子
clean:
rm -f *.o
文件搜寻
make会在当前目录中找不到的情况下,到VPATH指定的目录中去找寻文件。VPATH = src: ../headers。目录由冒号分割。
伪目标
伪目标不能和文件名重名,为了避免这种情况,我们使用一个特殊的标记.PHONY来显示地指明一个目标是伪目标。我们也可以为伪目标指定所依赖的文件。一个实例是,如果你的makefile需要一口气生成若干个可执行文件:
.PHONY: all
all: prog1 prog2 prog3
prog1: prog1.o
cc -o prog1 prog1.o
.....
.PHONY cleanall cleanobj cleandiff
cleanall: cleanobj cleandiff
rm program
cleanobj:
rm *.o
cleandiff:
rm *.diff
静态模式
例子:
OBJS = foo.o bar.o
all: $(OBJS)
$(OBJS): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
该规则展开后等价于:
foo.o: foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o: bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o