為Go項目編寫Makefile
借助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數,可以極大簡化項目編譯過程。
make介紹
make是一個構建自動化工具,會在當前目錄下尋找Makefile或makefile文件。如果存在相應的文件,它就會依據其中定義好的規則完成構建任務。
Makefile介紹
我們可以把Makefile簡單理解為它定義了一個項目文件的編譯規則。借助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數,可以極大簡化項目編譯過程。同時使用Makefile也可以在項目中確定具體的編譯規則和流程,很多開源項目中都會定義Makefile文件。
本文不會詳細介紹Makefile的各種規則,只會給出Go項目中常用的Makefile示例。關於Makefile的詳細內容推薦閱讀Makefile教程。
規則概述
Makefile由多條規則組成,每條規則主要由兩個部分組成,分別是依賴的關系和執行的命令。
其結構如下所示:
[target] ... : [prerequisites] ...
<tab>[command]
...
...
其中:
- targets:規則的目標
- prerequisites:可選的要生成 targets 需要的文件或者是目標。
- command:make 需要執行的命令(任意的 shell 命令)。可以有多條命令,每一條命令占一行。
舉個例子:
build: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o xx
示例
.PHONY: all build run gotool clean help
BINARY="bluebell"
all: gotool build
build:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${BINARY}
run:
@go run ./
gotool:
go fmt ./
go vet ./
clean:
@if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi
help:
@echo "make - 格式化 Go 代碼, 並編譯生成二進制文件"
@echo "make build - 編譯 Go 代碼, 生成二進制文件"
@echo "make run - 直接運行 Go 代碼"
@echo "make clean - 移除二進制文件和 vim swap files"
@echo "make gotool - 運行 Go 工具 'fmt' and 'vet'"
其中:
BINARY="bluebell"是定義變量。.PHONY用來定義偽目標。不創建目標文件,而是去執行這個目標下面的命令。
