make 命令

作用是读入一个名为 Makefile 的文件,然后执行这个文件中指定的指令。

Makefile

Makefile 告诉 make 怎样执行一系列的指令去依靠源文件生成一个目标文件。Makefile 中声明了一个依赖关系的列表,这个列表应当包含所有文件(无论是源文件或者目标)作为输入 。

Makefile 文件一般命名为 Makefile 或 makefile ,如果 m 小写有时候可能会出现错误。

$@ 表示当前目标文件的名字

$^ 表示用空格隔开的所有依赖文件

$< 表示第一个依赖文件

驱动的 Makefile 与一般应用程序的 Makefile 有所不同,驱动的 Makefile 要指定内核源代码的位置。

KDIR := /home/matt/linux-3.2.0-psp04.06.00.11
$(MAKE) -C $(KDIR) M=$(PWD) modules

$(MAKE) 为自带的变量 -C $(KDIR) 指明跳转到内核源码目录下读取那里的 Makefile M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的 Makefile

方便起见一般都会先定义编译器链接器:

CC = gcc 
LD = gcc

正则表达式表示目录下所有 .c 文件,相当于:SRCS = main.c a.c b.c

SRCS = $(wildcard *.c)

OBJS 表示 SRCS 中把列表中的 .c 全部替换为 .o,相当于:OBJS = main.o a.o b.o

OBJS = $(patsubst %c, %o, $(SRCS))

可执行文件的名字:

TARGET = Hello

.PHONE 伪目标,具体含义百度一下一大堆介绍

.PHONY:all clean

要生成的目标文件:

all: $(TARGET)

第一行依赖关系:冒号后面为依赖的文件,相当于 Hello: main.o a.o b.o

第二行规则:$@ 表示目标文件,$^ 表示所有依赖文件,$< 表示第一个依赖文件

$(TARGET): $(OBJS)
    $(LD) -o $@ $^

上一句目标文件依赖一大堆 .o 文件,这句表示所有 .o 都由相应名字的 .c 文件自动生成

%o:%c
    $(CC) -c $^

make clean 删除所有 .o 和目标文件:

clean:
    rm -f $(OBJS) $(TARGET)

注意:命令前必须以 tab 键开头,不能是空格