当前位置:网站首页>登堂入室之soc开发makefile
登堂入室之soc开发makefile
2022-07-30 21:14:00 【guangod】
makefile文件编写要点
虽然在vscode中实现了写了一个简单的make文件,详见 vscode多文件编译问题,但已经忘记的差不多了,参考了文档,感觉挺复杂的,只是尤其是后一篇深入,没有真正的去验证。
到了点灯的阶段,看了下自己所掌握的资料,这块还真绕不过去,再复习下吧。
makefile规则格式
make的执行过程
1、make 命令会在当前目录下查找以 Makefile(makefile 其实也可以)命名的文件。
2、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存在,或者目标所依赖的文件比目标文件新(也就是最后修改时间比目标文件晚)的话就会执行后面的命令来更新目标。
makefile变量
makefile的变量都是字符串,类似于宏。
变量的引用方法
变量名= #变量名赋值;
?=如果变量前面没有重新赋值就是最后一次的赋值 ,如果前面已经赋赋值 就填前一次的赋值;
+=给原来的变量名加一些字符串。
$(变量名) # 变量的引用
模式规则
所要解决的问题是使用一条规则将所有的.c文件编译为对应的.o文件。
%.o:%c #%类似于通配符
command
自动化变量
要解决的问题是,如何实现上面所说的模式规则下,通过一条命令实现对每次的模式规则解析时,都会产生不同的目标和依赖文件。
实现
所谓自动化变量就是这种变量会把模式中所定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该出现在规则的命令中,常用的自动化变量如表:
| 自动化变量 | 描述 |
|---|---|
| [email protected] | 规则中的目标集合,在模式规则中,如果有多个目标的话,“[email protected]”表示匹配模式中定义的目标集合。 |
| $% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。 |
| $< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%” )定义的,那么“$<”就是符合模式的一系列的文件集合。 |
| $? | 所有比目标新的依赖目标集合,以空格分开。 |
| $^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。 |
| $+ | 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。 |
| $* | 这个变量表示目标模式中"%"及其之前的部分,如果目标是 test/a.test.c,目标模式为 a.%.c,那么“$*”就是 test/a.test。 |
伪目标
由于“目标”在make里都是以文件的形式存在,如果不想输出文件,只是一个执行到时执行一下命令,伪目标就起作用了。
声名形式如下:如clean
.PHONY:clean #phony:假的;声名后,无论当前目录下是否存在clean文件,都会执行cleam后的命令。
条件判断
与c用法差不多,关键字分别为:ifeq和ifneq(判断是否相等)、ifdef和ifndef(判断表达式是否为真)。
函数支持
格式为:${函数名 参数列表} #参数之间用","隔开。
常用函数
subst
格式为:${subst <from>,<to>,<text>}作用:替换字符串text中的字符
patsubst
格式为:${patsubst <pattern>,<replacement>,<text>}作用:格式化字符串,用pattern的格式,替换replacemnet的格式。
dir
格式为:${dir<names…>}作用:从文件名路径中提取出目录部分。
notdir
格式为:${notdir<names…>}作用:去除目录,也就是提取文件名。
foreach
格式为:${foreach <var>, <list>,<text>}
作用:
#把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,#<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。names := a b c dfiles := $(foreach n,$(names),$(n).o)all:@echo $(files)#上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是“a.o b.o c.o d.o”。#注意,foreach中的<var>参数是一个临时的局部变量,foreach函数执行完后,参数<var>的变量将不在作用,其作用域只在 foreach 函数当中。
wildcard
变量及函数使用时的通配符。
格式为:$(wildcard PATTERN…) 如:$(wildcard *.c) #用来获取当前目录下所有的.c 文件.
边栏推荐
- MySQL ODBC驱动简介
- Automatically generate test modules using JUnit4 and JUnitGenerator V2.0 in IDEA
- Image Restoration by Estimating Frequency Distribution of Local Patches
- [Machine Learning] The Beauty of Mathematics Behind Gradient Descent
- [Limited Time Bonus] 21-Day Learning Challenge - MySQL from entry to mastery
- 在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块
- 弹性盒子模型
- 【网络安全专栏目录】--企鹅专栏导航
- 一个网络两种用途!南开&哈工程提出TINet,通过细化纹理和边缘,在显著性目标检测和伪装目标检测上实现双SOTA!...
- Activiti 工作流引擎 详解
猜你喜欢

IDEA2018.3.5取消双击Shift快捷键

【限时福利】21天学习挑战赛 - MySQL从入门到精通

Quick Master QML Chapter 6 Animation

nVisual网络可视化管理平台功能和价值点

MySQL60 homework
![[The Beauty of Software Engineering - Column Notes] 31 | Is software testing responsible for product quality?](/img/6a/640763e3bd6c28f3e7fa762798b0ae.png)
[The Beauty of Software Engineering - Column Notes] 31 | Is software testing responsible for product quality?

Activiti 工作流引擎 详解

DPW-SDNet: Dual Pixel-Wavelet Domain Deep CNNsfor Soft Decoding of JPEG-Compressed Images

MySQL60题作业

MySQL 多表关联一对多查询实现取最新一条数据
随机推荐
chrome extension: how to make the dialog be on the right side of the current window?
Teach you how to build a permanently running personal server
一个网络两种用途!南开&哈工程提出TINet,通过细化纹理和边缘,在显著性目标检测和伪装目标检测上实现双SOTA!...
QUALITY-GATED CONVOLUTIONAL LSTM FOR ENHANCING COMPRESSED VIDEO
mysql 递归函数with recursive的用法
MySQL 多表关联一对多查询实现取最新一条数据
大家都在用的plm项目管理软件有哪些
socket: Kernel initialization and detailed process of creating streams (files)
手把手教你搭建一台永久运行的个人服务器
【深度学习】目标检测|SSD原理与实现
【软件工程之美 - 专栏笔记】31 | 软件测试要为产品质量负责吗?
(7/29) Basic board minimum spanning tree prim+kruskal
深度学习模型训练前的必做工作:总览模型信息
新书上市 |《谁在掷骰子?》在“不确定性时代”中确定前行
Typescript 严格模式有多严格?
DPW-SDNet: Dual Pixel-Wavelet Domain Deep CNNsfor Soft Decoding of JPEG-Compressed Images
JSESSIONID description in cookie
Google Earth Engine ——
Google Earth Engine ——ee.List.sequence函数的使用
LeetCode · 23. Merge K ascending linked lists · recursion · iteration