Linux makefile

是什么:在大型工程,有许多源文件,如果一个一个gcc很不方便,只需要构建一个mikefile文件,在里面写一些规则,再输入make指令,就可以直接编译运行

构建项目的时候在哪个目录下执行构建命令 make这个目录下的 makefile 文件就会别加载,因此在一个项目中可以有多个 makefile 文件,分别位于不同的项目目录中。

1.规则

复制代码
# 每条规则的语法格式:
target1,target2...: depend1, depend2, ...
	command
	......
	......

目标(target):

通过执行规则中的命令,可以生成一个和目标同名的文件

规则中可以有多个命令, 因此可以通过这多条命令来生成多个目标, 所有目标也可以有很多个

通过执行规则中的命令,可以只执行一个动作,不生成任何文件,这样的目标被称为伪目标

依赖(depend):生成目标需要的条件

命令(command):shell 命令

2.工作原理

规则

按顺序执行,一个规则没法实现就跳到下一个规则,如果后面目标都得出来了并且是第一条规则的依赖,会执行第一条

如果想要执行 makefile 中非第一条规则对应的命令, 那么就不能直接 make, 需要将那条规则的目标也写到 make的后边, 比如只需要执行规则3中的命令, 就需要: make b.o。

文件时间戳

make 命令执行的时候会根据文件的时间戳判定是否执行makefile文件中相关规则中的命令。

目标是通过依赖生成的,因此正常情况下:目标时间戳 > 所有依赖的时间戳, 如果执行 make 命令的时候检测到规则中的目标和依赖满足这个条件, 那么规则中的命令就不会被执行。

当依赖文件被更新了, 文件时间戳也会随之被更新, 这时候 目标时间戳 < 某些依赖的时间戳, 在这种情况下目标文件会通过规则中的命令被重新生成。

如果规则中的目标对应的文件根本就不存在, 那么规则中的命令肯定会被执行。

简而言之,一般情况下,不动依赖,命令条件没更新,不执行

动依赖,命令改动,要执行,覆盖原先旧的目标

演示:在makefile中进行规则编写,再make

3.变量

在mikefile规则中,有时候目标或者依赖太多写起来超级繁琐,就使用变量

3.1 自定义变量

3.2 预定义变量

3.3 自动变量

复制代码
# 这是一个规则,普通写法
calc:add.o  div.o  main.o  mult.o  sub.o
        gcc  add.o  div.o  main.o  mult.o  sub.o -o calc
        
# 这是一个规则,里边使用了自定义变量
# 使用自动变量, 替换相关的内容
calc:add.o  div.o  main.o  mult.o  sub.o
	gcc $^ -o $@ 			# 自动变量只能在规则的命令中使用

4.模式匹配

语法重复的规则用通用模板写

5.函数

5.1wiledcard

获取指定目录下指定类型的文件名

5.2 patsubst

按照指定的模式替换指定的文件名的后缀

伪目标

当makefile中有一个指令 clean:表示清除操作,一般在shell中执行make都是会执行的。但如果在项目所在目录中新增一个clean文件,则清除指令不会执行。因为一旦新建,目标时间戳大于依赖,永远不会执行。此时需要定义一个伪指令

复制代码
# 添加规则, 删除生成文件 *.o 可执行程序
# 声明clean为伪文件
.PHONY:clean
clean:

在正常情况下,如果makefile中有一步指令有错误没有执行,那么就会跳出malefile如果makeshell中有一步指令错误没执行,想要继续执行后面指令,就需要在想要把不间断的指令前面加上-

相关推荐
2401_894915531 小时前
Geo 优化源码部署避坑指南:解决访问异常、定位失效、收录卡顿问题
java·服务器·后端·缓存·开源
whyutianict_vv1 小时前
HCIE-Storage存储3.0排错题实战:归因框架与排查命令
linux·服务器·网络
Elastic 中国社区官方博客1 小时前
用两行 JSON 替换你的 ILM 策略:数据流生命周期新增冻结层支持
大数据·运维·elasticsearch·搜索引擎·架构·全文检索
小趴菜一只1 小时前
linux权限维持
linux·运维·服务器
小张同学a.1 小时前
ELK企业级日志分析平台3——ES数据备份 & 集群监控 & ELFK+Kafka 架构部署
linux·运维·elk·elasticsearch·架构·kafka·filebeat
JenKinJia1 小时前
Pycharm中增加远程服务器解释器无法连接的问题
服务器·pycharm·github
神龙斗士2401 小时前
Socket编程:客户端与服务器通信全解析(网络编程)
运维·服务器·网络·socket
小则又沐风a1 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
中才实用2 小时前
Jenkins自动化部署
运维·自动化·jenkins