Makefile 笔记

Makefile 笔记

1. 语法规则

一条规则:

目标:依赖

命令

Makefile基本规则三要素:

1)目标:

  • 通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称

2)依赖:

  • 用来输入从而产生目标的文件
  • 一个目标通常拥有多个依赖,也可以没有

3) 命令:

  • make执行的动作,一个规则可以含几个命令(可以没有)
  • 有多个命令时,每个命令各占一行,用tab进行缩进

2. 命令格式

make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。

make命令格式:

make [ -f file ][ options ][ targets ]

1.[ -f file ]:

  • make默认在工作目录中寻找名为GNUmakefile、makefile、Makefile的文件作为makefile输入文件
  • -f 可以指定以上名字以外的文件作为makefile输入文件

2.[ options ]:

  • -v: 显示make工具的版本信息
  • -w: 在处理makefile之前和之后显示工作路径
  • -C dir:读取makefile之前改变工作路径至dir目录
  • -n:只打印要执行的命令但不执行
  • -s:执行但不显示执行的命令

3.[ targets ]:

  • 若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出
  • 指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)。

3. 变量

变量名规则:

  • makefile变量名可以以数字开头
  • 变量是大小写敏感的
  • 变量一般都在makefile的头部定义
  • 变量几乎可在makefile的任何地方使用

3.1 自定义变量

1)自定义

varname=value

2)引用变量

$(varname)

3.2 系统变量

除了使用用户自定义变量,makefile中也提供了一些变量(变量名大写)供用户直接使用,我们可以直接对其进行赋值。

CC = gcc #arm-linux-gcc

CPPFLAGS : C预处理的选项 如:-I

CFLAGS: C编译器的选项 -Wall -g -c

LDFLAGS : 链接器选项 -L -l

3.3 自动变量

  • $@: 表示规则中的目标
  • $^: 表示规则中的所有条件, 组成一个列表, 以空格隔开,如果这个列表中有重复的项则消除重复项。
  • $<: 表示规则中的第一个条件

tips: 自动变量只能在规则的命令中中使用

4. 模式匹配

示例:.c 生成 目标代码.o文件

%.o : %.c
	$(CC) $(CFLAGS) %< -o %@

5. 函数

makefile中的函数有很多,在这里给大家介绍两个最常用的。

  1. wildcard – 查找指定目录下的指定类型的文件

src = $(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src

  1. patsubst – 匹配替换

obj = $(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o

# 读取当前目录下所有 .c文件
SRC=$(wildcard *.c)
# .c 文件 转换为 .o文件
OBJS=$(patsubst %.c, %.o, $(SRC))

TARGET=test
$(TARGET):$(OBJS)
    gcc $(OBJS) -o $(TARGET) 
%.o:%.c
    gcc -c $< -o $@

6. Makefile中的伪目标

伪目标声明: .PHONY:clean

声明目标为伪目标之后,makefile将不会该判断目标是否存在或者该目标是否需要更新

.PHONY:clean
clean:
    rm -rf $(OBJS) $(TARGET)

7. 特殊符号

  • “-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
  • “@”不显示命令本身,只显示结果。如:“@echo clean done”

8. 总结

一条规则,三个变量,两个函数

### 关于 Makefile 使用笔记 #### 嵌套 Makefile 提升项目结构管理效率 对于大型项目而言,将不同类型的源文件分类存放在各自的子目录中是一种常见的做法。为了提高项目的可维护性和清晰度,在各个子目录内编写独立的 `Makefile` 文件并采用嵌套方式来构建整个项目是一个不错的选择[^1]。 ```makefile SUBDIRS = subdir1 subdir2 subdir3 all: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir; \ done ``` 这段代码展示了如何通过循环调用各子目录下的 `Makefile` 来实现多级联编译过程。 #### 获取当前执行中的 Makefile 路径 GNU Make 自动把每次加载的 `Makefile` 文件名按顺序追加至环境变量 `MAKEFILE_LIST` 中。因此可以利用此特性结合其他内置函数轻松获得当前正在运行的 `Makefile` 完整路径及其所在目录位置[^2]: ```makefile mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) cur_dir := $(patsubst %/Makefile,%,$(mkfile_path)) ``` 这里先使用 `abspath` 函数转换成绝对路径形式;再借助 `lastword` 取得列表最后一个元素即为目标 `Makefile` 名字;最后运用 `patsubst` 替换掉字符串结尾部分从而得到父级工作区的位置信息。 #### Override 操作符用于强制覆盖命令行传入参数 当某些特定情况下希望即使用户已经通过命令行指定了某个选项也能够确保内部设定生效,则可以在定义这些特殊配置项之前加上关键字 `override` 。这允许开发者在必要时候绕过外部输入而直接应用预设值[^3]: ```makefile override CFLAGS += -Wall -Wextra ``` 上述语句表示无论外界是否提供了自己的编译器标志集合,最终都会额外附加 `-Wall` 和 `-Wextra` 这两个警告级别开关作为补充条件参与后续处理流程之中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值