通用makefile


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)
	

 

PHONY := __build
__build:


obj-y :=
#子目录
subdir-y :=
#包含当前目录下的makefile 这个makefile知道编译哪些文件和子目录所以要包含进来
include Makefile

# obj-y := a.o b.o c/ d/
# $(filter %/, $(obj-y))   : c/ d/
# __subdir-y  : c d
# subdir-y    : c d

此处是为了取出子目录

#$(filter <pattern...>,<text>)
#名称:过滤函数——filter。
#功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。
#$(filter %/, $(obj-y)):从变量 $(obj-y) 取出符合 %/ 的单词    %代表通配符

#$(patsubst <pattern>,<replacement>,<text>)
#名称:模式字符串替换函数——patsubst。
#功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。

#经过上一步之后$(filter %/, $(obj-y)) 就变成了 a/ b/ c/
#patsubst函数查找<text>中的单词也就是a/ b/ c/ 是否符合 <pattern> 也就是%/ 如果符合就用 <replacement>替换 也就是%替换
#也就是a/ b/ c/ 编程了a b c 去掉了/
#得到了纯粹的目录名

__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y	+= $(__subdir-y)

# c/built-in.o d/built-in.o  
#这句话的含义是把$(subdir-y)的a b c 取出来 放到 f中去 ,然后$(f)/built-in.o根据$(f)计算出一个值,
#计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回$(subdir_objs)的值就是 a/built-in.o c/built-in.o d/built-in.o  
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)

# a.o b.o
#子目录取出来了,把obj也取出来
#现在 obj-y := a.o b.o c/ d/ 把符合%/的取出来,扔掉不要了,就剩下a.o b.o
cur_objs := $(filter-out %/, $(obj-y))


#他的依赖文件
#举个例子:
#names := a b c d
#files := $(foreach n,$(names),$(n).o)
#上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个值,
#这些值以空格分隔,最后作为 foreach 函数的返回,所以,
#$(files)的值是“a.o b.o c.o d.o”。

dep_files := $(foreach f,$(cur_objs),.$(f).d)#a.o.d b.o.d
#$(wildcard PATTERN)
#函数功能: 获取匹配 PATTERN 的所有对象
dep_files := $(wildcard $(dep_files))
#如果依赖文件不是空的,就包含进来
ifneq ($(dep_files),)
  include $(dep_files)
endif


PHONY += $(subdir-y)
#依赖子目录__build 依赖当前目录下的 $(subdir-y) built-in.o
__build : $(subdir-y) built-in.o

#进入子目录进行编译  -C指定目录 使用-f指定的makefile文件 这里就是递归的进入各个子目录生产build-in.o 再生成根目录的build-in.o
$(subdir-y):
#对每个子目录调用这个函数进行编译
#进入某个子目录但是我使用的是顶层目录的Makefile.build $@代表子目录
	make -C $@ -f $(TOPDIR)/Makefile.build
#当前目录下built-in.o怎么生成呢 它依赖于$(cur_objs)= a.o b.o  $(subdir_objs)=a/built-in.o c/built-in.o d/built-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特殊目标 它的依赖是假象目标 假象目标是这样一些目标 make 无条件的执行他的命令	
.PHONY : $(PHONY)

练习编译程序更改如下:


CROSS_COMPILE = arm-hisiv400-linux-
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)g++
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 -std=c++11

CFLAGS := -Wall -O2 -g -std=c++11
CFLAGS += -I $(shell pwd)/common/inc/ -I $(shell pwd)/common/inc/ffmpeg/ -I./common/inc/hisi/
#LDFLAGS告诉链接器从哪里寻找库文件,LIBS告诉链接器要链接哪些库文件
LDFLAGS := -lm 
ExtLib = -L ./lib -L ./lib/curl/ -L ./lib/uv/ -luv -lcurl -lrt -lpthread\
		-L ./lib/zlib/ -L ./lib/ssl/ -L ./lib/crypto/ -L./lib/ffmpeg/\
		-lz -lssl -lcrypto -lonvif -lavformat -lavcodec -lavutil -lswresample\
		-lpantograph


export CFLAGS LDFLAGS ExtLib

TOPDIR := $(shell pwd)
export TOPDIR

TARGET := show_file_cjx


obj-y += user/
obj-y += common/src/



all : 
	make -C ./ -f $(TOPDIR)/Makefile.build
	$(CC) $(LDFLAGS) -o $(TARGET) $(ExtLib) 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)
	

 

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 : $(cur_objs) $(subdir_objs)
	$(LD) -r -o $@ $^

dep_file = .$@.d

%.o : %.c
	$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
%.o : %.cpp
	$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
	
.PHONY : $(PHONY)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值