MakeFile

什么是MakeFile?很好理解,是一种规则,什么规则呢?顾名思义:生成文件的规则

这是一条基本语法(伪代码)

1
2
目标:依赖
依赖操作成为目标的指令

三个要素:

  • 目标
    • 需要的结果
  • 依赖
    • 执行中需要的文件
  • 指令
    • 执行的操作代码

make指令执行的顺序模式是:自顶向下,典型的树状结构

可以理解为,执行最顶部的目标生成规则,根据当前目标所需的依赖向下查找依赖的生成规则。

最终目标生成规则一般都写在最上方,第一条

简单看一个简单的makefiiewe文件的简单编写伪代码

伪代码

makeFile文件的简单的编写格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  target=最终文件名

obj=子文件1 子文件2 子文件3 ....

$(target)$(obj)
具体操作命令
子文件%:源文件%
具体操作命令
....
.PHONY:clean
clean:
-rm
rm $(obj) $(target) -f
#-f 强制执行

需要注意的

自动变量

1
2
$<:规则中的第一个依赖(就是子文件1)
$@:当前规则中的目标

每次生成的会对子依赖进行检查是否有修改

函数的使用

1
2
3
4
$(wildcard ./*.c)
指定目录下的所有.c文件
$(patsubst ./%.o, ./%.c, $(wildcard ./*.c))
将的所有.o 字符 替换为.c

删除之前生成的子文件,因为不是我们的最终目标,是临时的文件,需要手动删除那不如加条目标指令进行删除。

1
2
3
clean:
rm $(obj) $(target) -f
#-f 强制执行

makefile加入该删除代码后

1
2
make clean
#只执行clean

举例验证:加入一个hello目标

1
2
hello:
echo "hello,makefile!"

在终端执行:就会只执行hello目标的内容

1
make hello

将目标声明为伪目标

1
2
 .PHONY:clean
#就不回再重复比较文件,默认执行该目标操作

而加入-rm的作用是

当出现报错无法执行是,忽略该报错执行下一条命令语句

还有更多函数和编写细节,用到了的时候再说罢。

小结

给我的感觉就是一个类脚本的语言,可以将不止是 C++ or JAVA 或者其他语言的项目,集成方便的进行编译的或者其他操作,挺有意思的.