iTimothy

Go与Makefile实现跨平台交叉编译

最近业余时间写的一个项目ydict,中途发布了几个版本,由于这是一个Go写的命令行的工具,跨平台交叉编译后可以在主流的Mac OS, Linux, Windows上运行。如何让每次发布的时候,自动根据版本号,跨平台交叉编译和自动打包出不同平台的软件包呢?这下就轮到Makefile上场了……

之前也有分享过如何用Makefile配合实现自动版本号的功能:Go,Makefile与自动程序版本号的实现,这次我们需要修改一下Makefile,实现根据传入的版本号,批量交叉编译和打包。

直接上Makefile吧: (线上版本地址:https://github.com/TimothyYe/ydict/blob/master/Makefile)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Binary name
BINARY=ydict
# Builds the project
build:
go build -o ${BINARY}
go test -v
# Installs our project: copies binaries
install:
go install
release:
# Clean
go clean
rm -rf *.gz
# Build for mac
go build
tar czvf ydict-mac64-${VERSION}.tar.gz ./ydict
# Build for linux
go clean
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
tar czvf ydict-linux64-${VERSION}.tar.gz ./ydict
# Build for win
go clean
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
tar czvf ydict-win64-${VERSION}.tar.gz ./ydict.exe
go clean
# Cleans our projects: deletes binaries
clean:
go clean
.PHONY: clean build

Makefile主要通过release命令来实现跨平台交叉编译和自动打包。go clean命令用来清理go的编译环境,根据传入不同的参数给GOOS,实现不同平台的编译,最后tar根据版本号变量拼接出编译后带版本号的压缩包。

整个过程看起来非常简单,运行起来也非常简单,调用make release命令,并给VERSION变量赋值不同的版本号即可:

1
make release VERSION=0.9

命令会编译出不同平台可运行的压缩包:

1
2
3
ydict-mac64-0.9.tar.gz
ydict-linux64-0.9.tar.gz
ydict-win64-0.9.tar.gz

然后将这些分别上传到GitHub发布即可,省时又省力,不错!

支持原创技术分享,据说打赏我的人,都找到了女朋友!