提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Makefile学习记录
一、常用函数
1.ifeq
- 传参的话,可在输入make指令时,同时赋值变量来进行传参
- 比较字符串,待比较的字符串不能用双引号括住
- 执行语句不能有函数之类(echo),只能赋值
- 注意:只看VAR打印即可
比较整形测试记录
1
2 SRC := $(wildcard *.c)
3
4 OBJS := $(patsubst %.c, %.o, ${SRC})
5
6 VAR=0
7
8 ifeq (${mytest},10)
9 VAR=40
10 else
11 VAR=0
12 endif
13
14 .PHONY: ${OBJS} test
15
16 all: main.o func.o
17 echo ${VAR}
18 echo ${mytest}
19 gcc main.o func.o -o test
20
21 test:
22 @echo ${OBJS}
23 @for i in ${OBJS};do \
24 echo $${i}; \
25 done
26 func.o :
27 gcc func.c -c
28 main.o :
29 gcc main.c -c
比较字符串测试记录
1
2 SRC := $(wildcard *.c)
3
4 OBJS := $(patsubst %.c, %.o, ${SRC})
5
6 VAR=0
7
8 ifeq (${mytest},all)
9 VAR=40
10 else
11 VAR=0
12 endif
13
14 .PHONY: ${OBJS} test
15
16 all: main.o func.o
17 echo ${VAR}
18 echo ${mytest}
19 gcc main.o func.o -o test
20
21 test:
22 @echo ${OBJS}
23 @for i in ${OBJS};do \
24 echo $${i}; \
25 done
26 func.o :
27 gcc func.c -c
28 main.o :
29 gcc main.c -c
~
~
~
2.for
for实现如下
3.wildcard
- wildcard *.c
- 通配符用*,用%没用
wildcard测试记录
4.patsubst
- patsubst 源格式,目的格式,源文件
- 通配符用%
例:获得当前src,并转换为目标OBJS变量
二、语法记录
make选项含义
选项 | 含义 |
---|---|
-g | 可执行程序包含调试信息,目的是为了给GDB工具调试程序使用 |
-o | 指定输出文件名,不指定默认为a.out |
-c | 只编译不链接,产生.o文件,不产生执行文件 |
-C | 将当前的工作目录切换到指定目录中 |
-f | 指定文件作为makefile运行 |
-D | 执行gcc过程中给程序添加宏定义 |
-Wall | 编译后显示所有警告 |
-L | 指定链接的第三方库所在的目录 |
-nostdlib | 不链接系统标准启动文件和标准库文件,只把指定的文件传递给链接器 |
在脚本中使用命令
- 在脚本中使用常见命令,如ls,pwd等
- 用 ‘`’符号包裹住命令字符(这个是数字键1左边的符号)
执行命令测试记录
匹配多重目标
- 在uboot中,可见配置命令 make xxx_config,用来进行uboot配置,在makefile目标使用%_config来进行匹配
%_config 测试样例
变量嵌套引用跟() {}使用对比
- 变量可以嵌套引用,如 ( ( ((VAR1))
(),{}比较,变量嵌套引用测试样例
include包含其他文件
- 可使用include关键字包含其他文件,如.config Kconfig 等
- 也使用一个makefile包含另外一个标准编译makefile来进行指导编译
include测试样例,var1 var2实际打印如下
同一个目标可以分散写,有多个依赖
- 执行规则只有一个,但是依赖可以有多个且可以分开写
例:test1的依赖test2和test3,分开做两行写也可以
二次展开
make读取makefile会进行一次展开,随后把展开后的数据传给shell,如下图使用 $$i时,展开得到的是 $i,故打印的是 $i,而使用 $i时,展开得到的是空,故打印的是空。