编写Makefile

Thu, Mar 25, 2021 阅读时间 1 分钟

make工具介绍

项目构建往往要经过一系列的过程,尤其是C项目,可能需要先编译这个,再编译那个,再添加个链接,完了再打个Docker镜像,会有很多的文件需要创建和更改。这些动作,我们既可以通过手工的方式,一步步完成,不免显得繁琐。或者也可以写个shell脚本自动完成。但是make是专门做这件事的。

make的环境准备

对于linux或者mac系统,只要有gcc,一般都会有make,通过命令make -v可以检查你当前的环境有没有make,而在windows上想使用make还是比较复杂的,尽管网上有很多教程,但是我都没有尝试成功,推荐还是尽量在linux或者mac环境下使用make构建你的项目。

make的使用

make的使用非常简单,笔者不是make大神,使用make都是通过一条 make 命令和编写一个Makefile文件即可。

Makefile的编写

Makefile中需要指明要进行哪些操作,这些操作需要有哪些前置操作,或者需要哪些前置文件,最终又生成了什么文件。

Makefile的通用格式为:

<target> : <prerequisites>
[tab]  <commands>
  • target是这个操作要实现的目标,可以只是一个标签,也可以是一个文件名
  • prerequisites指的是这个操作的需要的前置条件,这个没有可以不写,前置条件既可以是一个文件名,也可以是一个标签
  • tab是一个制表符,注意是制表符,不是空格
  • commands就是我们需要执行的shell命令了,一个操作可以有一个或多个命令,多个命令可以用\进行换行

举个例子

NAME = test
VERSION = `date +%Y%m%d`  # 今天的日期
NCR = ncr.nie.com/yanghairui/

# docker-push是target,docker-build是这个操作的前置操作
docker-push: docker-build
   docker push $(NCR)$(NAME):$(VERSION)

docker-build: go-build
   docker build . -t $(NCR)$(NAME):$(VERSION)

go-build:
   GO111MODULE=on \
   GOOS="linux" \
   GOARCH="amd64" \
   go build -o test 

在Makefile所在的目录输入make,然后按回车,会按以下顺序执行操作:

  • 上面这个例子执行会先执行go-build标签的内容,编译一个go项目
  • 然后执行docker-build,打一个docker镜像
  • 最后将这个docker镜像push到远程仓库、
  • # 号后是注释
  • 变量在定义完用$(变量名)引用
  • 还有一些内置变量,但是并不常用,如:$(CC)指当前使用的编译器,$(MAKE)指当前使用的make工具