海思的一个 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 文件中执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。
海思的一个 Makefile 解析的更多相关文章
- 海思屏幕HAL代码解析
显示屏幕(LCD)模块提供屏幕相关功能接口,调用者为上层应用模块(含 init.状态机.ui),上下文依赖关系,如图 3-7 所示. 系统框架为 linux+Huawei LiteOS 双系统架构,媒 ...
- 用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发
快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs20 ...
- 主流芯片解决方案Ambarella的高清网络摄像机、德州仪器和控制海思
(本文由四川艾普作为数码科技有限公司 苏斌.范清华 收集) 高清网络视频监控发展到今天.正的高清时代.诸多有实力的高清摄像机厂家的产品线也逐渐完好起来,高清网络视频监控的配套产品有更加丰富和成熟.与此 ...
- 用vs2013+velt-0.1.4进行嵌入式开发 进行海思平台 UBOOT 开发
1.1 什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件 ...
- 海思uboot启动流程详细分析(二)
1. 第二个start.S 从start_armboot开始,在startup.c中有包含#include <config.h> 在config.h中: /* Automatically ...
- 建立live555海思编码推流服务
因项目需要,这一周弄了一下live555.需求:海思编码——>RTSP server,使用VLC可以访问,类似于网络摄像机的需求.看了一下,live555的架构太复杂了,半桶水的C++水平还真的 ...
- live555 交叉编译移植到海思开发板
本文章参考了.http://blog.csdn.net/lawishere/article/details/8182952,写了hi3518的配置说明.特此感谢 https://blog.csdn.n ...
- 海思3519A 移植 Qt 5.5.1
源码下载 网址:qt-everywhere-opensource-src-5.5.1.tar.gz 配置生成MakeFile 文件 解压源码包,在源码包路径下生成配置 MakeFile : ./con ...
- 海思hi35xx 开发学习(3):视频输入
视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVDS 接口和 HISPI 接口),SLVS-EC,BT.1120,BT.656,BT.601,DC 等接口接收视频数据.V ...
随机推荐
- redis高可用 - 主从复制
工作需要,调研了一下redis的复制实现.在2.8版本之前和之后,复制方式有所不同.2.8之前的复制方式对于初次复制数据没有问题,对于断连接重新复制比较耗性能,因为都是全量复制.2.8之后对断线重连做 ...
- OpenCV学习记录(一):使用haar分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读
OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).OpenCV2之后的C++接口除了Haar特征 ...
- python3--json反序列化
# Auther: Aaron Fan # 加载文件中的数据 import json with open('test.txt','r',encoding='utf-8') as f: info = j ...
- sscanf高级用法级正则表达式
sscanf高级用法级正则表达式 摘自:https://www.cnblogs.com/bluestorm/p/6864540.html sscanf与scanf类似,都是用于输入的,只是后者以屏幕 ...
- [欣赏代码片段] (JavaScript) 你使用过getComputedStyle没有
(function() { // IE8 ployfill for GetComputed Style (for Responsive Script below) if (!window.getCom ...
- Kubernetes (1.6) 中的存储类及其动态供给
原文地址:http://blog.fleeto.us/translation/dynamic-provisioning-and-storage-classes-kubernetes-0?utm_sou ...
- Eclipse的Debug调试技巧大全
转载 原文链接:https://blog.csdn.net/u011781521/article/details/55000066 收藏方便以后查看. 19:18:10 2018-12-29
- thinkjs系统服务启动
- 卡在Initializing Spring root WebApplicationContext
1,多数情况下是连接数据库时出现问题, 2,如果使用mybatis 请查看 xml映射文件是否和对应的java 的dao文件名字相同,或者<mapper namespace="com. ...
- PMBOK项目管理相关知识梳理
该次梳理,依据PMBOK(第五版),罗列项目管理十三章节重要的知识点. 一.引论1.项目的定义与举例:2.项目.项目组合.项目集与项目组织管理:3.范进本质是风资(范围.进度.成本.质量.风险.资源) ...