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中有一步指令错误没执行,想要继续执行后面指令,就需要在想要把不间断的指令前面加上-

相关推荐
Initialize-le3 小时前
Nginx 504 超时、499 一堆?网关排查法
运维·nginx
砚凝霜5 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根5 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
数字新视界5 小时前
机房动环监控提升运维效率
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
U-Mail邮件系统6 小时前
自建邮箱服务器有哪些软件?三款主流邮件服务器软件推荐
运维·服务器
倒头就睡的小比特7 小时前
Linux基础指令3
linux·服务器
Smoothcloud润云7 小时前
PyTorch推理服务模型热切换与失败回滚实战:降低版本更新中断
服务器·人工智能·pytorch·python·深度学习·gpu
天远数科8 小时前
零信任架构实战:基于天远贷前风险报告构建自动化消金信贷风控与多头共债排查网关
运维·人工智能·架构·自动化
梦帮科技8 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法