Makefile语法基础
Makefile语法
1. 规则格式
Makefile的规则格式如下示
目标... : 依赖文件集合...命令1命令2......
- 命令列表中的每条命令必须以TAB键开始
- Makefile中使用“#”符号进行注释
静态模式规则格式如下示
<targets...> : <target-pattern> : <prereq-patterns...>命令1命令2......
2. 变量
Makefile中的变量都是字符串,一般在定义变量的时候使用“=”、“ := ”、“?=”、“+=”这四种赋值符号进行变量赋值
- 赋值符 “=” 的含义:使用变量最后一次定义的有效值
- 赋值符 “ := ” 的含义:使用变量最前面定义好的有效值
- 赋值符 “?=” 的含义:若前面没有被赋值,就使用当前值;否则使用前面赋的值
- 赋值符 “+=” 的含义:变量追加,在已经定义好的变量后面添加一些字符串
变量替换:$(var : a = b) 表示把变量var中所有以a结尾的字符串替换成以b结尾
3. 模式规则
模式规则中使用“%”符号表示长度任意的非空字符串,例如 %.c 表示所有以 .c 结尾的文件,a.%.c 表示以a.开头,以 .c 结尾的文件
4. 自动化变量
自动化变量会把模式中所定义的一系列的文件自动挨个取出,直至所有的符合模式的文件都取完
- $@ 匹配模式中定义的目标集合
- $% 目标是函数库时表示规则中的目标成员名,否则为空
- $< 依赖文件集合中的第一个文件;若依赖文件以%定义则表示符合模式的文件集合
- $? 所有比目标新的依赖目标集合,以空格分开
- $^ 所有依赖文件的集合,使用空格分开;若有重复的依赖文件则去重
- $+ 和 $^ 类似,但是又重复的依赖文件时不去重
- $* 目标模式中“%”及其之前的部分
5. 伪目标
伪目标主要是为了避免Makefile中定义的执行命令的目标和工作目录下的实际文件出现名字冲突。例如:
.PHONY : clean
clean :rm *.o main
声明clean为伪目标后,不管当前目录下是否存在名为“clean"的文件,输入”make clean“的话规则后的rm命令都会执行
6. 函数使用
- subst 函数:用来完成字符串替换
$(subst <from>,<to>,<text>)
#将字符串text中的from内容替换为to
- patsubst函数:用来完成模式字符串替换
$(patsubst <pattern>,<replacement>,<text>)
#字符串text中的单词若符合模式pattern,就用replacement来替换掉
$(patsubst %.c, %.o, a.c b.c c.c)
#表示将“a.c b.c c.c”中所有符合“%.c”的字符串,替换为“%.o”,替换完后为“a.o b.o c.o”
- dir函数:用来获取目录
$(dir <names...>)
#从文件名序列name中提取出目录部分
$(dir </src/a.c>)
#表示提取/src/a.c的目录部分,即“/src”
- notdir函数:用来提取文件名
$(notdir <names...>)
#从文件名序列name中提取出文件名
$(notdir </src/a.c>)
#表示提取/src/a.c的文件名,即“a.c”
- foreach函数:用来完成循环
$(foreach <var>,<list>,<text>)
#把参数list中的单次逐一取出来放到参数var中,然后在执行text所包含的表达式。
#每次text都会返回一个字符串
- wildcard函数:通配符“%”只能用在规则中,在变量定义和函数使用时的“通配符”
$(wildcard PATTERN...)
#获取符合模式pattern的所有文件
$(wildcard *.c)
#获取当前目录下所有的.c文件
7. 实例
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?= bspCC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
#包含整个工程的.h头文件目录
INCDIRS := imx6ul \bsp/clk \bsp/led \bsp/delay
#包含整个工程的所有.c和.S文件目录
SRCDIRS := project \bsp/clk \bsp/led \bsp/delay
#将$(INCDIRS)中任意长度的字符串替换成-I %(-I用于指明头文件目录)
INCLUDE := &(patsubst %, -I %, $(INCDIRS))
#保存工程中所有的.S汇编文件(包含绝对路径)
SFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.S))
#保存工程中所有的.c文件(包含绝对路径)
CFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
#提取SFILES中包含的所有.S汇编文件名(不包含绝对路径)
SFILENDIR := $(notdir $(SFILES))
#提取CFILES中包含的所有.c文件名(不包含绝对路径)
CFILENDIR := $(notdir $(CFILES))
#保存.S文件编译后对应的.o文件目录
#SFILENDIR:.S = .o表示将变量SFILENDIR中所有的.S结尾的字符串都替换成.o结尾
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S = .o))
#保存.c文件编译后对应的.o文件目录
#CFILENDIR:.c = .o表示将变量CFILENDIR中所有的.c结尾的字符串都替换成.o结尾
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c = .o))
#SOBJS和COBJS的集合
OBJS := $(SOBJS) $(COBJS)
#指定的搜索目录
VPATH := $(SRCDIRS).PHONY: clean$(TARGET).bin : $(OBJS)$(LD) -Timx6ul.lds -o $(TARGET).elf $^$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
#静态模式规则,%.o表示取目标集合中以.o结尾的为目标
$(SOBJS) : obj/%.o : %.S$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<clean:rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
Makefile语法基础相关推荐
- Makefile语法基础介绍
在Linux下,make是一个命令工具,是一个解释Makefile中指令的命令工具.make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么样去编译和链接程序. make如何工作: ...
- Java基础笔记(入门,语法基础,流程控制,数组)
Java语言入门 发展历程 三大技术体系 JavaSE 标准版 JavaEE 企业版 JavaME 嵌入式版 Java语言特点 简单性 健壮性 面向对象 分布式 多线程 动态性 可移植性(跨平台) J ...
- 给Java初学者福利——Java语法基础
Java代码基本格式 Java中所有程序代码都必须存在于一个类中,用class关键字定义类,在class之前可以有一些修饰符.格式如下: 修饰符 class 类名 { 程序代码 } 注: 1.Java ...
- python语法基础知识总结-python语法基础知识
一.数字类型及操作 1.整数类型 可正可负,无取值范围限制pow(x,y):计算x^y 2.浮点数类型 存在不确定尾数round(x,d):对x四舍五入,d为小数截取位数e/E:a*10^b 3.复数 ...
- VRML语法基础跟简介
VRML语法基础和简介 VRML简介和基础语法 -------------------------------------------- 一.VRML是什么 VRML是虚拟现实造型语言 (Virtua ...
- Web开发(一)·期末不挂之第四章·CSS语法基础(CSS选择器选择器优先级各类样式表的使用方法)
CSS语法基础 一.单纯html控制样式的缺点 二. CSS✪✪✪ CSS概述 CSS基础语法 组成 选择器 标签选择器 类选择器 id选择器 通配选择器 后代选择器 插入样式表的三种方式 行内样式 ...
- C语言:gcc编译过程及make命令、makefile语法规则
gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- java的基础语法是什么_java语法基础
java语法基础 引导语:作为一门计算机语言,Java也是有语法的,以下是百分网小编分享给大家的java语法基础,欢迎阅读! java语法基础: 1,关键字:其实就是某种语言赋予了特殊含义的单词. 保 ...
最新文章
- 铅笔线的阻抗有多大?
- duilib进阶教程 -- 实现List排序
- 保护模式及其编程——实模式与保护模式的切换
- 基于xp系统搭建android开发环境
- Diffie-Hellman密钥交换协议
- 网易视频云分享:如何搭建视频转码集群
- 转载:如何在 SQL Server 中使用配置选项调整内存使用量
- 真效率神器,UI稿智能转换成前端代码,准确率极高
- LeetCode之Reverse Integer
- Java——集合的遍历之迭代遍历
- Sublime Text 3 快捷键总结(详细版本)
- java 最优算法_java 问题 求个最优算法
- latex插入图片之后出现大段空白,并且紧随其后的文字如同被覆盖一般不见了
- 【重难点】【Java基础 03】hashCode() 和 equals()、代理模式
- 使用fiddler获取手机上的数据
- wxPython + PyOpenGL 打造三维数据分析的利器!| CSDN 博文精选
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_2_冗余的Runnable代码...
- NMODBUS4.0源码下载地址
- PS教程:磨砂颗粒质感字体海报设计
- OpenCV实战之人脸美颜美型(六)——磨皮