# 入门makefile
# make是什么
make是一个自动化构建工具,会在当前目录寻找Makefile或者makefile文件。如果存在,会依据文件的构建规则去完成构建。 当然了,实际商Makefile内都是依据make语法规则,自己编写的shell命令等。
它是一个简答的工具,规则也很简单。在支持的范围内,编译A,依赖B,再编译c,完全没问题。
# 规则
Makefile由多条规则构成。每个规则都以一个target开头。后跟一个:冒号。冒号后面是一个目标的prerequisites(前置条件)。紧跟着新开一行,必须以tab作为开头。后面紧跟着命令;也就是你希望target需要做的事情。
[target] ... : [prerequisites] ...
<tab>[command]
...
...
# 例子
我们以go-gin-example项目为例编写makefile。在编写之前,需分析构建的先后顺序、依赖项和需要解决的问题。
.PHONY build clean tool lint help
all: build
build:
go build -v .
tool:
go tool vet . |& grep -v vendor; true
gofmt -w .
lint:
golint ./...
clean:
rm -rf go-gin-example
go clean -i .
help:
@echo "make: compile packages an dependencies"
@echo "make tool: run specified go tool"
@echo "make lint: golint ./..."
@echo "make clean: remove object files and cached files"
.PHONY 其作用是申明build clean tool lint help为伪目标。声明为伪目标后,在执行对应的命令时,make就不会去检查是否存在build clean tool lint help其对应的文件。而是每次都去运行标签内的命令。若不声明,恰好存在对应文件,则make将会认为文件已存在,没必要构建。
# 为什么会打印执行的命令
make 默认会打印每条命令,再执行。这个行为被定义为回声. 可以在对应命令前加上 @,可指定该命令不被打印到标准输出上