makefile笔记

makefile笔记
1.可以把一个或者几个文件赋值给一个字符串(像是C语言中的宏)。
例子:
objects = main.o kbd.o command.o

下次使用的时候用$(objects)表示上面这些文件。

2.只要make看见一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,例如make找到一个
whatever.o,那么whatever.c就会是whatever.o的依赖文件
例子:
main.o:main.c defs.h
可以写成:main.o:defs.h
3.伪目标文件
clean:
rm *.o temp
在工作目录下不存在“clean”这个文件时,我们输入“make clean”后,rm *.o temp就会执行。
但是如果当前目录下存在文件“clean”,目标被认为是最新的而不去执行规则定义,命令“rm”将不会被执行。为了避免这个问题,我们可以将目标“clean”明确的声明为伪目标。将一个目标声明为伪目标需要将它作为特殊目标“.PHONY”的依赖。
例如:.PHONY:clean
这样目标“clean”就是一个伪目标,无论当前目录下是否存在“clean”这个文件。我们输入“make clean”之后。“rm”命令都会被执行。而且,当一个目标被声明为伪目标后,make在执行此规则时不会试图去查找隐含规则来创建这个目标。
在书写伪目标规则时,首先需要声明目标是一个伪目标,之后才是伪目标的规则定义。
.PHONY: clean 
clean: 
rm *.o temp 
4.注释
在makefile中如果要注释就使用“#”,并且只是单行注释的,要表示“#”,那么就是要加“\”在前面。例如 “\#”
5.makefile中的命令必须是[Tab]键开始的。
6.makefile文件名
makefile的文件名可以写成“Makefile”,“makefile”,或者自己可以定义。如果要指定特定的makefile,需要使用make的“-f”和“--file”参数,如:make -f Make.linux或者make --file make.hello
7.引用其它的makefile
在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是: 
include <filename>; 
filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)。在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和<filename>;可以用一个或多个空格隔开。
例子:
bar=a.mk b.mk c.mk
include foo.make *.mk $(bar) 
等价于: 
include foo.make a.mk b.mk c.mk e.mk f.mk 
如果你想让make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”
-include <filename>;
8.make的工作方式
GNU的make工作时的执行步骤入下:(想来其它的make也是类似) 
    (1)、读入所有的Makefile。 
    (2)、读入被include的其它Makefile。 
    (3)、初始化文件中的变量。 
    (4)、推导隐晦规则,并分析所有规则。 
    (5)、为所有的目标文件创建依赖关系链。 
    (6)、根据依赖关系,决定哪些目标要重新生成。 
    (7)、执行生成命令。 
1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。
### 关于 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` 这两个警告级别开关作为补充条件参与后续处理流程之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值