# 入门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 默认会打印每条命令,再执行。这个行为被定义为回声. 可以在对应命令前加上 @,可指定该命令不被打印到标准输出上