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语法基础相关推荐

  1. Makefile语法基础介绍

    在Linux下,make是一个命令工具,是一个解释Makefile中指令的命令工具.make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么样去编译和链接程序. make如何工作: ...

  2. Java基础笔记(入门,语法基础,流程控制,数组)

    Java语言入门 发展历程 三大技术体系 JavaSE 标准版 JavaEE 企业版 JavaME 嵌入式版 Java语言特点 简单性 健壮性 面向对象 分布式 多线程 动态性 可移植性(跨平台) J ...

  3. 给Java初学者福利——Java语法基础

    Java代码基本格式 Java中所有程序代码都必须存在于一个类中,用class关键字定义类,在class之前可以有一些修饰符.格式如下: 修饰符 class 类名 { 程序代码 } 注: 1.Java ...

  4. python语法基础知识总结-python语法基础知识

    一.数字类型及操作 1.整数类型 可正可负,无取值范围限制pow(x,y):计算x^y 2.浮点数类型 存在不确定尾数round(x,d):对x四舍五入,d为小数截取位数e/E:a*10^b 3.复数 ...

  5. VRML语法基础跟简介

    VRML语法基础和简介 VRML简介和基础语法 -------------------------------------------- 一.VRML是什么 VRML是虚拟现实造型语言 (Virtua ...

  6. Web开发(一)·期末不挂之第四章·CSS语法基础(CSS选择器选择器优先级各类样式表的使用方法)

    CSS语法基础 一.单纯html控制样式的缺点 二. CSS✪✪✪ CSS概述 CSS基础语法 组成 选择器 标签选择器 类选择器 id选择器 通配选择器 后代选择器 插入样式表的三种方式 行内样式 ...

  7. C语言:gcc编译过程及make命令、makefile语法规则

    gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...

  8. [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. java的基础语法是什么_java语法基础

    java语法基础 引导语:作为一门计算机语言,Java也是有语法的,以下是百分网小编分享给大家的java语法基础,欢迎阅读! java语法基础: 1,关键字:其实就是某种语言赋予了特殊含义的单词. 保 ...

最新文章

  1. 铅笔线的阻抗有多大?
  2. duilib进阶教程 -- 实现List排序
  3. 保护模式及其编程——实模式与保护模式的切换
  4. 基于xp系统搭建android开发环境
  5. Diffie-Hellman密钥交换协议
  6. 网易视频云分享:如何搭建视频转码集群
  7. 转载:如何在 SQL Server 中使用配置选项调整内存使用量
  8. 真效率神器,UI稿智能转换成前端代码,准确率极高
  9. LeetCode之Reverse Integer
  10. Java——集合的遍历之迭代遍历
  11. Sublime Text 3 快捷键总结(详细版本)
  12. java 最优算法_java 问题 求个最优算法
  13. latex插入图片之后出现大段空白,并且紧随其后的文字如同被覆盖一般不见了
  14. 【重难点】【Java基础 03】hashCode() 和 equals()、代理模式
  15. 使用fiddler获取手机上的数据
  16. wxPython + PyOpenGL 打造三维数据分析的利器!| CSDN 博文精选
  17. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_2_冗余的Runnable代码...
  18. NMODBUS4.0源码下载地址
  19. PS教程:磨砂颗粒质感字体海报设计
  20. OpenCV实战之人脸美颜美型(六)——磨皮

热门文章

  1. 方法重写的两同两小一大原则
  2. html锚点定位向下偏移,html锚点定位不准确问题
  3. 输出两个数之间的水仙花数C++
  4. 模拟电子电路基础——放大器理解与梳理
  5. 自建Kubernetes集群如何使用阿里云CSI存储组件
  6. 手机相机里面的m_手机里面照相机的像素怎么调
  7. 第二章:软件测试的方法
  8. 解决方案产品化?如何执行
  9. “渴了么”软件详细说明书
  10. PHP创建Epub文件