Makefile书写小结

本篇是对阮一峰-Make 命令教程的学习与记录


基本规则


target必不可少


1
2
3
4
5
6
7
<target1> :  <前置条件(可选)> 
[tab] <command1>
[tab] <command2>

<target2> : <前置条件(可选)>
[tab] <command_x>
[tab] <command_y>

1
2
3
4
clean:
rm *.txt
clone:
git clone git@github.com:cuishuang/kit.git

一个目标(target)就构成一条规则,执行make clean,则将执行该规则。

如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标,

如对于上面的makefile,make 就相当于 make clean


.PHONY的作用


如果当前目录中,正好有一个文件叫做clean,那么make clean命令将不会执行。因为Make发现clean文件已经存在,就认为没有必要重新构建,也就不会执行后面的命令

这时就需要使用.PHONY,明确声明clean是”伪目标”:

1
2
3
.PHONY: clean
clean:
rm *.txt

声明clean是”伪目标”后,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令。

.PHONY这样的内置目标名还有不少,可查看手册


前置条件(prerequisites)



具体命令


由一行或多行的Shell命令组成

每行命令之前必须有一个tab键。

如果想用其他键,可以用内置变量.RECIPEPREFIX声明。

每行命令在一个单独的shell中执行,之间没有继承关系




具体语法


1.注释


2.回声(echoing)


3.通配符


4.模式匹配


5.变量和赋值符


6.内置变量(Implicit Variables)


Makefile.defs即Makefile定义的变量,一般会在Makefile头部引入…分开写清晰一些

LD_FLAGS=-ldflags “-X main.commit=$(git_commit)”
是把这个值,注入到main的__commit__变量里

7.自动变量(Automatic Variables)


8.判断和循环


9.自己写的函数


10.内置函数


Makefile中可用的函数


strip




实战一下


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.PHONY: all build deploy syncCloud

all:build deploy syncCloud

build:
hexo g
echo "----------构建完成----------"


deploy:
hexo d
echo "----------部署完成----------"

# 发送到icloud
syncCloud:
cp -rf /Users/fliter/blog/source/* /Users/fliter/Documents
echo "----------同步完成----------"




进阶:

阮一峰-使用 Make 构建网站

如何调试MAKEFILE变量

跟我一起写 Makefile–陈皓