#简单实用的Makefile模板:
objs := a.o b.o
test:$(objs)
gcc -o test $^
# .a.o.d .b.o.d
dep_files := $(foreach f,$(objs),.$(f).d)
dep_files := $(wildcard $(dep_files))
ifneq ($(dep_files),)
include $(dep_files)
endif
%.o : %.c
gcc -Wp,-MD,.$@.d -c -o $@ $<
clean:
rm *.o test
#/*关键解释*/
这里面用到了一些Makefile函数,首先咱们来讲一下Makefile函数的格式:
$(函数名 参数,参数,......)
这里用到了两个函数,咱们分别来讲一下:
一、dep_files := $(foreach f,$(objs),.$(f).d)
依次取出objs中的成员,放在f中,而后加上.d后缀,组成一个字符串(各个成员以空格分开),返回给dep_files !
二、dep_files := $(wildcard $(dep_files))
展开当前目录下名字为符合dep_files的文件名,并组成字符串返回给dep_files
此外还有一点要说的是:
gcc -Wp,-MD,.$@.d -c -o $@ $<
一、-Wp,-MD:表示生成依赖文件,后跟依赖文件的名字
二、$@:表示规则的目标
$^:全部的依赖
$<:第一个依赖
$?:表明依赖文件列表中被改变过的全部文件
# 第一次执行,没有依赖文件,这个ifneq不执行,
# 当修改.h文件以后,判断执行这个include $(dep_files)
ifneq ($(dep_files),)
include $(dep_files)
endif
参考内核的Makefile编写包括Makefile和Makefile.build
#Makefile file
CROSS_COMPILE = arm-linux-
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP
CFLAGS := -Wall -O2 -g
CFLAGS += -I $(shell pwd)/include
LDFLAGS := -lm -lfreetype
export CFLAGS LDFLAGS
TOPDIR := $(shell pwd)
export TOPDIR
TARGET := show_file
obj-y += main.o
obj-y += display/
obj-y += draw/
obj-y += encoding/
obj-y += fonts/
all :
make -C ./ -f $(TOPDIR)/Makefile.build
$(CC) $(LDFLAGS) -o $(TARGET) built-in.o
clean:
rm -f $(shell find -name "*.o")
rm -f $(TARGET)
distclean:
rm -f $(shell find -name "*.o")
rm -f $(shell find -name "*.d")
rm -f $(TARGET)
#Makefile.build file
PHONY := __build
__build:
obj-y :=
subdir-y :=
include Makefile
#找出子目录
# obj-y := a.o b.o c/ d/
# $(filter %/, $(obj-y)) : c/ d/
# __subdir-y : c d
# subdir-y : c d
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y += $(__subdir-y)
# c/built-in.o d/built-in.o
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)
#找出目标文件
# a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_files))
ifneq ($(dep_files),)
include $(dep_files)
endif
PHONY += $(subdir-y)
__build : $(subdir-y) built-in.o
$(subdir-y):
make -C $@ -f $(TOPDIR)/Makefile.build
#built-in.o 依赖当前目录下的build-in.o
built-in.o : $(cur_objs) $(subdir_objs)
$(LD) -r -o $@ $^
dep_file = .$@.d
%.o : %.c
$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
.PHONY : $(PHONY)
关键点说明:linux