跟我一起写Makefile(1)

来源:互联网 发布:淘宝店招导航全屏代码 编辑:程序博客网 时间:2024/06/05 04:49

    一个例子:

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