持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
🎐 放在前面说的话
大家好,我是沥沥樱 👧🏻
本科在读,此为日常捣鼓.
如有不对,请多指教,也欢迎大家来跟我讨论鸭 👏👏👏
还有还有还有很重要的,麻烦大可爱们动动小手,给沥沥樱点颗心心♥,沥沥樱需要鼓励嗷呜~
我们常常会在开源项目中发现Makefile,那这是做什么的呢?具有一定复杂度的项目工程,基本是先编译A,依赖B,再编译C...最后才执行构建。如果每次都需要重新编排,比如公司每来一个新同事,就需要问你项目D需要怎么构建编译,重构需要注意什么等,这不是效率很低下么?这时候就需要用到Makefile来规定,解决了。那么我们就来学一下makefile的简单使用吧
Let’s get it!
Makefile
Make是什么
Makefile 是和 make 命令一起配合使用的。它是开源的构建工具,很多大型项目的编译都是通过 Makefile 来组织的。
Make 是一个构建自动化工具,会在当前目录下寻找 Makefile 或 makefile 文件。如果存在,会依据 Makefile 的构建规则去完成构建
Makefile里面是什么
当我们经常涉及Golang大型项目,它往往费时保持构建和测试命令
go build xx
,go test xx
反反复复,Makefile则提供了一种非常有效的方法来自动为我们的应用程序编写任务。
实际上 Makefile 内都是我们自己根据 make 语法规则,自己编写的特定的 Shell 命令等
Makefile规则
Makefile 由多条规则组成
-
每条规则都以一个 target(目标)开头,后跟一个 : 冒号,冒号后是这一个目标的 prerequisites(前置条件)
-
紧接着新的一行,必须以一个 tab 作为开头,后面跟随 command(命令),也就是你希望这一个 target 所执行的构建命令
[target] ... : [prerequisites] ...
<tab>[command]
...
...
Makefile规则解释:
-
target:可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的伪目标(phony) 章节中会有叙述。
-
prerequisites:前置条件,这一项是可选参数。通常是多个文件名、伪目标。它的作用是 target 是否需要重新构建的标准,如果前置条件不存在或有过更新(文件的最后一次修改时间)则认为 target 需要重新构建,生成该target所依赖的文件和/或target
-
command:该target要执行的命令(任意的shell命令),构建这一个 target 的具体命令集
简单实例
目录树仅有main.go,代码如下
func main(){
fmt.Print("hello world!")
}
makefile文件源码:
BINARY_NAME=hello
build:
go build -o $(BINARY_NAME) -v
./$(BINARY_NAME)
makefile文件源码解释:
- 第一行,声明了一个变量
BINARY_NAME
,它的值是hello
,方便后面使用 - 第二行,声明一个
target
,可以认为对外存在 - 第三行,
target
被调用时执行的脚本,这行就是build这个项目,编译后的二进制文件放在当前工程目录下,名字是变量BINARY_NAME
的值 - 第四行,直接执行当前目录下的二进制文件
- 缩进不要使用空格,要使用tab,否则会报错
Makefile:3: *** missing separator. Stop.
构建
打开终端,执行make build
🎉 放在后面说的话
这是一篇快速学习Makefile的文章...