Golang下的Makefile学习

前言

最近公司项目里是要对go做linux环境下的交叉编译,虽然自己部署的时候只需要./configure,make, make install之类的命令就能完成操作,但是还是想弄明白makefile的语法,因此抽空学习下makefile机制,目标是能读懂并且写出项目的makefile规则

 

Makefile基本结构

  • 变量定义,通常为了输入和修改更方便

        例如

GOROOT ?= /usr/local/go
  • 伪目标,.PHONY关键字,认为目标并非是文件的形式,会跳过它的隐含规则搜索,直接执行命令,这就相当于定义了一条命令,因此每次执行都会重新执行一遍。一般修饰clean,确保每次运行都会clean一遍。

        例如

.PHONY: clean
  • 规则

         格式

target: dependencies
    system command


        target是目标名,dependencies是依赖文件,system command是系统指令,一般是对应语言的编译指令或链接指令,而且命令前要有tab占位符(这个有遇到一个比较坑的问题是idea里直接tab发现不行,字符数不对,需要用文本编辑器里tab才ok)。默认情况下,target是生成文件的形式,每次执行make会根据依赖文件是否比target文件更新来决定是否要重新执行指令;而如果是all或者phony修饰的情况就可能完全是命令的形式。
        例如

all: Microsoft
.PHONY: all

Microsoft:
	mkdir -p disk/Microsoft
	go build -o dist/Microsoft/Microsoft03 Microsoft/Microsoft03/Microsoft03.go

这里先利用all指定了最终目标,然后phony指定了all伪目标,然后定义了Microsoft规则,这里也是非文件类型目标,它没有依赖,默认运行make会执行make all。如果依赖里加上对应go文件,即使没有修改文件代码,每次执行都会重新build,而去掉all定义后,就不会这样,原因未知。

基本的语法就这三类,简单使用足矣。

特殊情况的处理

  •  交叉编译
  • 同时编译多个main文件

示例如下,

GOROOT ?= /usr/local/go
.PHONY:clean
all: linux

linux:
	mkdir -p dist/linux
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOROOT)/bin/go build -ldflags="-s -w" -mod=vendor -o dist/linux/Microsoft Microsoft/Microsoft03/Microsoft03.go
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOROOT)/bin/go build -ldflags="-s -w" -mod=vendor -o dist/linux/Alibaba Alibaba/BornPig/babyPig.go

arm:
	mkdir -p dist/arm
	CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 $(GOROOT)/bin/go build -ldflags="-s -w" -mod=vendor -o dist/arm/Microsoft Microsoft/Microsoft03/Microsoft03.go
	CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 $(GOROOT)/bin/go build -ldflags="-s -w" -mod=vendor -o dist/arm/Alibaba Alibaba/BornPig/babyPig.go

clean:
	rm -rf dist

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值