一般Makefile使用方法:
$ ls
foo1.c foo.c main.c Makefile
$ cat main.c
extern void foo ();
extern void foo1 ();
int main ()
{
foo ();
foo1 ();
return 0;
}
$ cat foo.c
#include <stdio.h>
void foo ()
{
printf ("This is foo ()!\n");
}
$ cat Makefile
.PHONY: clean
CC = gcc
RM = rm
EXE = simple
#wildcard:搜索当前所有的.c文件
SRCS = $(wildcard *.c)
#patsubst:把.c文件替换为.o文件
OBJS = $(patsubst %.c,%.o,$(SRCS))
# $@⽤于表示⼀个规则中的⽬标,这里表示$(EXE)
# $^表示的是规则中的所有先择条件,,这里表示$(OBJS)
$(EXE): $(OBJS)
$(CC) -o $@ $^
%.o: %.c
$(CC) -o $@ -c $^
clean:
$(RM) $(EXE) $(OBJS)
优化:将.o文件和可执行文件放到对应目录中
$ cat Makefile
.PHONY: all clean
CC = gcc
RM = rm
EXE = simple
MKDIR = mkdir
DIR_OBJS = objs
DIR_EXES = exes
DIRS = $(DIR_OBJS) $(DIR_EXES)
#wildcard:搜索当前所有的.c文件
SRCS = $(wildcard *.c)
#patsubst:把.c文件替换为.o文件
OBJS = $(patsubst %.c,%.o,$(SRCS))
OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
all: $(DIRS) $(EXE)
$(DIRS):
$(MKDIR) $@
$(EXE): $(OBJS)
$(CC) -o $@ $^
$(DIR_OBJS)/%.o: %.c
$(CC) -o $@ -c $^
clean:
$(RM) $(EXE) $(OBJS)
:= 表示只对其进⾏⼀次扫描和替换,就是每个变量只有第一个有效
?= 表示当变量以前没有定义时赋值,如果已经定义了那么就不再改变其值
+=表示添加等号后面的值
再优化,把全部代码(包括makefile)放到src目录下:
SUBDIR = ./src
MAKE = make
subsystem:
cd $(SUBDIR) && $(MAKE)
linux内核编译模块例子:
# Makefile 2.6
obj-m := hello.o
KDIR := /works/linux/linux-3.5
rootfs_dir :=/works/rootfs/home
all:
make -C $(KDIR) M=$(PWD) modules
rm -fr .tmp_versions *.o *.mod.o *.mod.c *.bak *.symvers *.markers *.unsigned *.order *~ .*.*.cmd .*.*.*.cmd
cp *.ko ${rootfs_dir}
clean:
@make -C $(KDIR) M=$(PWD) modules clean
@rm -f *.ko *.o *.mod.o *.mod.c *.bak *.symvers *.markers *.unsigned *.order *~