Hi3531 SDK 里面sample_hifb.c Makefile的 分析


Makefile :
# Hisilicon Hi3516 sample Makefile
 
include ../Makefile.param
#ifeq ($(SAMPLE_PARAM_FILE), )
# SAMPLE_PARAM_FILE:=../Makefile.param
# include $(SAMPLE_PARAM_FILE)
#endif
 
# target source
SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)
MPI_LIBS := $(REL_LIB)/libmpi.a
MPI_LIBS += $(REL_LIB)/libhdmi.a
TARGET := $(OBJ:%.o=%)
.PHONY : clean all
 
all: $(TARGET)
 
$(TARGET):%:%.o $(COMM_OBJ)
$(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA)
 
clean:
@rm -f $(TARGET)
@rm -f $(OBJ)
@rm -f $(COMM_OBJ)
 
cleanstream:
@rm -f *.h264
@rm -f *.jpg
@rm -f *.mjp
@rm -f *.mp4

 

 

分析:

1. include
include ../Makefile.param

 


在Makefile也和C语言一样有include的用法,include后面跟一个Makefile文件名,其功能和C语言中的include类似,就 是把被包含的Makefile文件的内容全部原本的复制到包含文件中来,这个用法多用于在一个项目中有多个Makefile,分别在不同的目录下,这样我 们可以写一个公共Makefile,这个Makefile中包含一些公共变量的定义,其他目录下的Makefile可以把这个公共Makefile文件包 含进去。
 
2.SRC  := $(wildcard *.c)
SRC := $(wildcard *.c)
变量的定义
#方式一:定义多行变量  
define variable 
value 
value 
endef 
#方式二:  
variable = value 
#方式三:  
variable := value 
#方式四:  
variable += value 
#方式五:  
variable ?= value  
这些定义方式中,按照展开方式不同分两类,方式一、方式二、方式五,都是使用时展开,就是无论前面如何定义,变量真正的含义都是到使用的时候才展开,而方式三是直接展开,就是变量定义的时候就展开为真正的值,而方式四是追加变量,他的展开方式要看原有的变量是如何定义的。有这种区别就导致一种结果,第一类方式定义的变量可以递归引用当前还未定义的变量,而第二类则不允许这样。
 
变量的引用
变量的引用可以采用两种方式
1 $(variable)
2 ${variable}
wildcard
一般我们可以使用下面这一句来获取工作目录下的所有的.c文件列表:
$(wildcard *.c)

在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数
wildcard
它的用法是:
$(wildcard PATTERN...) 

在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。
 
3.OBJ  := $(SRC:%.c=%.o)
OBJ := $(SRC:%.c=%.o)
这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。它的标准格式是:
$(var:a=b) 或 ${var:a=b}

它的含义是把变量var中的每一个值结尾用b替换掉a
 
%---Makefile的模式规则
%”的意思是匹配零或若干字符,例如,
%.h
表示所有以“.h”结尾的文件.
它是在GUNmake的语法层次上的,例如 
vpath %.h ../headers
 该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件.
*是Shell所支持的通配符,是在shell的语法层次上,*.c,一般用在shell命令里面,如:
clean:
rm -f *.o
 
4..PHONY : clean all
.PHONY : clean all
关键字
.PHONY
告诉make该目标是“假的”(磁盘上其实没有clean),这时make为生成这个目标就会将其规则执行一次。.PHONY修饰的目标就是只有规则没有依赖。
 
 
5.all: $(TARGET)
表示所有的目标(一个或者多个目标)
 
6. $@ $^
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
 
7.@rm -f $(TARGET)
@rm -f $(TARGET)
其中 @ 表示:
如果 makefile 文件中执行的命令前面加了@字符,则不显示命令本身而只显示它的结果
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/ForMGP/p/5018537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值