Skip to main content

01 Makefile的基本使用

1 什么是Makefile?有什么用?

Makefile是软件工程化的编排构建工具。在软件工程中需要:编译、构建和发布等等流程。 但这些操作要么是步骤过多,要么是参数过多。从而影响开发效率。 而Makefile可以把所有相关的参数和流程写进Makefile,并指定一个启动的指定指令(名称), 然后就可以通过make <directive>直接启动这个指令下 的所有操作,如,打包、发布、测试等等流程。比如以下是Golang的软件工程中的Makefile:

XECUTABLE=executable_notion_server
WINDOWS=$(EXECUTABLE)_$(VERSION)_windows_amd64.exe
LINUX=$(EXECUTABLE)_$(VERSION)_linux_amd64
DARWIN=$(EXECUTABLE)_$(VERSION)_darwin_amd64
VERSION=$(shell git tag | awk 'END{print}')

# Directory of compiled output archive
OUT_DIRECTOR=dist

build: clean windows linux darwin ## Build binaries
@echo version: $(VERSION)

windows: $(WINDOWS) ## Build for Windows

linux: $(LINUX) ## Build for Linux

darwin: $(DARWIN) ## Build for Darwin (macOS)

clean:
rm -f $(OUT_DIRECTOR)/$(EXECUTABLE)*

$(WINDOWS):
env GOOS=windows GOARCH=amd64 go build -v -o $(OUT_DIRECTOR)/$(WINDOWS) -ldflags="-s -w -X main.version=$(VERSION)" ./main.go

$(LINUX):
env GOOS=linux GOARCH=amd64 go build -v -o $(OUT_DIRECTOR)/$(LINUX) -ldflags="-s -w -X main.version=$(VERSION)" ./main.go

$(DARWIN):
env GOOS=darwin GOARCH=amd64 go build -v -o $(OUT_DIRECTOR)/$(DARWIN) -ldflags="-s -w -X main.version=$(VERSION)" ./main.go

以上是Makefile是用于打包出各个平台的可执行文件。 而Makefile的首要指令是build, 所以当执行make会默认执行第一条指令(build), 而build指令又会执行其它的指令:

  • clean: 清除指令,用于删除已经编译好的文件,为下面要编译的文件清理出空间。
  • linux: 编译出linux平台的可执行文件.
  • windows: 编译出windows平台的可执行文件.
  • darwin: 编译出类unix平台的可执行文件.

所以配置好Makefile后,执行make, 它就是默认执行build(默认第一条)指令,然后build指令就会执行相关联的其它指令,而在执行这个工作流期间(编译期间),自己完全可以去倒杯荼喝,回来就出结果了,而不是苦哈哈在那里打命令行。

总结就是,在软件工程中,把一个重复的性的工作交给Makefile去做,确实能提高开发的效率,这就是用它的理由。

Sample Source code