通用的makefile分析

makefile的学习可以参考GNU-make中文手册.pdf,没有的话通过这个链接地址可下载:http://download.csdn.net/detail/yanshaodan/9749808

该makefile模仿内核的makefile来编写的。


makefile:

                                                                               #定义各个编译用到的工具
CROSS_COMPILE =                                         #交叉编译器 arm-none-linux-gnueabi- 
AS = $(CROSS_COMPILE)as               #汇编器
LD = $(CROSS_COMPILE)ld                #连接器
CC = $(CROSS_COMPILE)gc c            #编译器
CPP = $(CC) -E                                           #预处理
AR = $(CROSS_COMPILE)ar               #归档文件
NM = $(CROSS_COMPILE)nm              #列出object文件中的符号

STRIP = $(CROSS_COMPILE)strip          #丢弃目标文件中的符号
OBJCOPY = $(CROSS_COMPILE)objcopy      #转换目标文件格式
OBJDUMP = $(CROSS_COMPILE)objdump      #反汇编

export AS LD CC CPP AR NM                #将变量导出供下一个makefile使用
export STRIP OBJCOPY OBJDUMP             

CFLAGS := -Wall -Werror -O2 -g           #CFLAGS 指定编译参数
CFLAGS += -I $(shell pwd)/include
LDFLAGS := -L/yanlib/jrtplib/lib -L/yanlib/x26420110920/lib/
LIBS := -lx264 -ljrtp -ljthread
export CFLAGS LDFLAGS LIBS
TOPDIR := $(shell pwd)
export TOPDIR
TARGET := firsttest
obj-y += main.o          #obj-y  main.o 编译链接进项目
obj-y += compress/
obj-y += print/
obj-y += transmission/
.PHONY : all clean distclean
all :                                        
make -C ./ -f $(TOPDIR)/Makefile.build      #
$(CC) $(LDFLAGS) -o $(TARGET) built-in.o    #

  # make的递归执行,make的“-C”选项,是首先进入子目录而后再执行make。
  #当需要将一个普通命名的文件作为makefile文件时,需要使用make的“-f”、“--file”或者“--makefile”选项来指定。
clean:
rm -f $(shell find -name "*.o")  #删除命令,默认是 rm -f
rm -f $(TARGET)
distclean:
rm -f $(shell find -name "*.o")
rm -f $(shell find -name "*.d")
rm -f $(TARGET)
#执行make时,目标“all”被作为终极目标。
#伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它 是否要执行。
#我们只有通过显示地指明这个“目标”才能让其生效。
#为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,
#不管是否有这个文件,这个目标就是“伪目标”。 


这个比较难一些

makefile.build:

PHONY := __build                #定义一个PHONY变量
__build:                        #开头说明__build伪目标,使其成为Makefile.build的第一个目标
obj-y :=
subdir-y :=
include Makefile
#前面我们包含了Makefile,在Makefile中我们定义了obj-y += xxx(main.o compress/  ...... )
# 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)                              #文件子目录compress/ print/ 等等。
#函数名称:过滤函数—filter。
#sources := foo.c bar.c baz.s ugh.h
# $(filter %.c %.s,$(sources))
#数返回值为“foo.c bar.c baz.s”
#函数名称:模式替换函数—patsubst。
#例如:$(patsubst %.c,%.o,x.c.c bar.c)
#把字串“x.c.c bar.c”中以.c结尾的单词替换成以.o结尾的字符。函数的返回结果是“x.c.o bar.o”

# c/built-in.o d/built-in.o                              #built-in.o 打包
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)  #对于subdir-y里面的每一个值(目录),增加一个相应的目录/built-in.o的变量值
# foreach 函数
#$(foreach VAR,LIST,TEXT)
#执行时把“LIST”中使用空格分割的单词依次取出赋值给变量“VAR”,然后执行“TEXT”表达式
# a.o b.o
cur_objs := $(filter-out %/, $(obj-y))                  # 得到obj-y中的.o文件
dep_files := $(foreach f,$(cur_objs),.$(f).d)           # .$(f).d 第一个.表示隐藏的 后面的.表示后缀
dep_files := $(wildcard $(dep_files))
#函数wildcard
#在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
ifneq ($(dep_files),)
  include $(dep_files)
endif
PHONY += $(subdir-y)
__build : $(subdir-y) built-in.o                       # 第一个规则
$(subdir-y):
make -C $@ -f $(TOPDIR)/Makefile.build               # 依次进入该子目录变量里面存储的值,使用的Makefile.build进行编译
built-in.o : $(cur_objs) $(subdir_objs)                # 第一个规则的第二个依赖规则
$(LD) -r -o $@ $^                                    # 该规则的命令:将该目录下的.o和$(subdir_obj)打包成built-in.o文件
dep_file = .$@.d
%.o : %.c
$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<      # 用于将目录下所有的.c文件编译成.o文件 ,
                                                                                                  # -wp,-MD 会生成相应的依赖文件,
                                                                                                  #其中自动化变量“$<”代表规则的依赖,“$@”代表规则的目标
.PHONY : $(PHONY)                                                                    # 将PHONY声明为伪目标
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值