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
去做,确实能提高开发的效率,这就是用它的理由。