Makefile通用编写规则

#简单实用的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函数的格式:
$(函数名 参数,参数,......)
这里用到了两个函数,我们分别来说一下:
1、dep_files := $(foreach f,$(objs),.$(f).d)
依次取出objs中的成员,放在f中,然后加上.d后缀,组成一个字符串(各个成员以空格分开),返回给dep_files !
2、dep_files := $(wildcard $(dep_files))
展开当前目录下名字为符合dep_files的文件名,并组成字符串返回给dep_files
 
此外还有一点要说的是:
gcc -Wp,-MD,.$@.d -c -o $@ $<
1、-Wp,-MD:表示生成依赖文件,后跟依赖文件的名字
2、$@:表示规则的目标
      $^:所有的依赖
      $<:第一个依赖
      $?:代表依赖文件列表中被改变过的所有文件
 
# 第一次执行,没有依赖文件,这个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)
 
关键点说明:

转载于:https://my.oschina.net/u/4000302/blog/3026541

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值