海思某 Makefile 解析

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

解析

include

include ../Makefile.param

在Makefile也和C语言一样有include的用法,include后面跟一个Makefile文件名,其功能和C语言中的include类似,就是把被包含的Makefile文件的内容全部原本的复制到包含文件中来。
这个用法多用于在一个项目中有多个Makefile,分别在不同的目录下,这样我 们可以写一个公共Makefile,这个Makefile中包含一些公共变量的定义,其他目录下的Makefile可以把这个公共Makefile文件包含进去。

SRC := $(wildcard *.c)

SRC := $(wildcard *.c)

变量的定义

#方式一:定义多行变量  
define variable 
value 
value 
endef 

#方式二:  
variable = value 

#方式三:  
variable := value 

#方式四:  
variable += value 

#方式五:  
variable ?= value

这些定义方式中,按照展开方式不同分为:

  • 方式一、方式二、方式五,都是使用时展开,就是无论前面如何定义,变量真正的含义都是到使用的时候才展开,这样定义的变量可以递归引用当前还未定义的变量;
  • 方式三是直接展开,就是变量定义的时候就展开为真正的值,这样定义的变量不可以递归引用当前还未定义的变量;
  • 方式四是追加变量,他的展开方式要看原有的变量是如何定义的。

变量的引用

变量的引用可以采用两种方式:

$(variable)

${variable}

wildcard

一般我们可以使用下面这一句来获取工作目录下的所有的.c文件列表:

$(wildcard *.c)

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

$(wildcard PATTERN...) 

在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。

OBJ := $(SRC:%.c=%.o)

OBJ := $(SRC:%.c=%.o)

这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。它的标准格式是:

$(var:a=b) 或 ${var:a=b}

它的含义是把变量var中的每一个值结尾用b替换掉a。

%

%”的意思是匹配零或若干字符,例如:

%.h

表示所有以“.h”结尾的文件,它是在GUNmake的语法层次上的,例如

vpath %.h ../headers

该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件.
*是Shell所支持的通配符,是在shell的语法层次上,*.c,一般用在shell命令里面,如:

clean:
rm -f *.o

.PHONY : clean all

.PHONY : clean all

关键字.PHONY告诉make该目标是“假的”(磁盘上其实没有clean),这时make为生成这个目标就会将其规则执行一次。.PHONY修饰的目标就是只有规则没有依赖。

all: $(TARGET)

表示所有的目标(一个或者多个目标)

$@ $^

  • $@--目标文件
  • $^--所有的依赖文件
  • $<--第一个依赖文件

@rm -f $(TARGET)

@rm -f $(TARGET)

其中 @ 表示:如果 makefile 文件中执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。

猜你喜欢

转载自www.cnblogs.com/chay/p/10436773.html