makefile的相关介绍:
Makefile 是用于自动化构建过程的文件,通过它可以定义各种编译规则、文件依赖和操作指令。Makefile 主要由构建工具 make 使用,通常用于编译程序,但也可以被用来处理任何其他任务,比如测试、打包、文档生成等。
一个典型的 Makefile 的结构包括目标(target)、依赖(dependencies)和命令(command),它们一般长这样:
target: dependencies
command
以下是 Makefile 的主要功能:
自动化构建:通过
Makefile可以自动化地进行代码编译,避免手动输入复杂的编译命令。管理依赖:
Makefile可以检查源文件是否发生更改,并仅重新编译那些受影响的文件,提高构建效率。执行自定义任务:
Makefile可以用于构建、清理、测试、部署等任务,通过make clean、make test等命令执行。跨平台支持:虽然具体的
Makefile可能需要针对不同平台做调整,但它提供了一个基础的跨平台构建方案,特别适用于 UNIX 系统。
使用参考手册: https://makefiletutorial.com/ //非官方
定义一个makefile: Makefile 文件通常直接命名为 Makefile(首字母大写,没有文件扩展名),这是约定俗成的命名方式。这样命名后,只需在项目根目录下执行 make 命令即可自动找到并执行 Makefile 文件中的默认任务(即第一个定义的目标)。 如果 Makefile 文件的名称不同于默认的 Makefile,可以使用 -f 选项指定文件名:make -f Makefile.dev
使用案例: 下面是一个典型的 Go 项目 Makefile,包括构建、运行、测试和清理等命令:
定义变量
APP_NAME = myapp VERSION = 1.0.0 BUILD_DIR = build
默认目标
.PHONY: all all: build
编译项目
.PHONY: build build: go build -o $(BUILD_DIR)/$(APP_NAME) main.go
运行项目
.PHONY: run run: go run main.go
执行测试
.PHONY: test test: go test ./...
清理构建文件
.PHONY: clean clean: rm -rf $(BUILD_DIR)
代码检查和格式化
.PHONY: lint lint: go vet ./... golint ./...
在此例中,make 会根据 Makefile 自动化地编译程序,make clean 则可以清理生成的文件。 在这个 Makefile 中,你可以使用以下命令: make build:编译项目,生成二进制文件。 make run:直接运行项目。 make test:执行测试。 make clean:清理构建文件。 make lint:执行代码检查和格式化。
当然在项目根目录中打开终端,运行以下命令来执行 Makefile 中的默认目标: make //不加任何额外命令, 如果想执行特定目标,例如 build 或 test,可以在 make 命令后指定目标名称, 如上所展示的内容.
关于默认目标的定义: 在 Makefile 中,默认目标通常是第一个定义的目标。这个目标会在直接运行 make 时自动执行,所以通常将最常用或核心的任务作为第一个目标,例如 all、build 或 default。
常见的默认目标
all:最常见的默认目标,通常用于执行一系列任务(如构建、测试、代码检查等)。.PHONY: all all: build test lintbuild:直接将构建任务作为默认目标,如果构建是项目的核心操作。.PHONY: build build: go build -o myapp main.godefault:有些开发者会使用default作为默认目标的名称,效果与all类似,但这不是一种通用惯例。.PHONY: default default: build
如何选择默认目标
- 小型项目:一般选择
build或run作为默认目标。 - 中大型项目:使用
all作为默认目标,并在其中包含多个任务,例如构建、测试、代码检查等。
例如:
.PHONY: all
all: build test lint
.PHONY: build
build:
go build -o myapp main.go
.PHONY: test
test:
go test ./...
.PHONY: lint
lint:
go vet ./...
golint ./...
直接执行 make 时,默认会先运行 all 目标,然后依次执行 build、test 和 lint。
.PHONY 用于声明伪目标(phony targets),即标识某些目标不是实际文件,而是任务名称。这样可以避免 make 把目标名称当作文件来处理,提高任务执行的可靠性和性能。
