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 文件中执行的命令前面加了@字符,则不显示命令本身而只显示它的结果