借助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數,可以極大簡化項目編譯過程。

make介紹

make是一個構建自動化工具,會在當前目錄下尋找Makefilemakefile文件。如果存在相應的文件,它就會依據其中定義好的規則完成構建任務。

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用來定義偽目標。不創建目標文件,而是去執行這個目標下面的命令。