概述
学习makefile文件格式
格式
target: prerequisites
commands
- target:目标,不可省
- prerequisites:前置条件,可省
- commands:命令,前面必须有一个tab键,可省。前置条件和命令必须至少有一个。
每条规则就明确两件事:构建目标的前置条件是什么,以及如何构建。下面就详细讲解,每条规则的这三个组成部分
target
target 通常是文件名,指明 Make 命令所要构建的对象,目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。除了文件名,目标还可以是某个操作的名字,这称为“伪目标”(phony target)。这个操作的名字可以自己随便取。
clean:
rm *.o
上面代码的目标是clean,它不是文件名,而是一个操作的名字,属于”伪目标 “,作用是删除对象文件。使用命令:make clean
执行它。
但是,如果当前目录中,正好有一个文件叫做clean,那么这个命令不会执行。因为Make发现clean文件已经存在,就认为没有必要重新构建了,就不会执行指定的rm命令
为了避免这种情况,可以明确声明clean是”伪目标”,写法如下
.PHONY: clean
clean:
rm *.o temp
声明clean是”伪目标”之后,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令。这里.PHONY是一个内置的操作名。更多内置操作名。
如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标
make
prerequisites
前置条件通常是一组文件名,之间用空格分隔。它指定了”目标”是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),”目标”就需要重新构建
result.txt: source.txt
cp source.txt result.txt
commands
命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建”目标”的具体指令,它的运行结果通常就是生成目标文件。
include
把其他文件引入到当前makefile里面,内容当做当前makefile的一部分
.env文件:
DEV=debug
makefile文件:
include .env
export
test_include:
echo ${DEV}
dev:
go run main.go
run:
go mod tidy & go run main.go
.PHONY: run
输出:
echo debug
debug
export设置环境变量
设置环境变量有三种方式
方式一:直接在makefile文件中
export bb=99
exp:
echo ${bb}
运行
make exp
结果
echo 99
99
方式二:在命令中
expaa:
export aa=10
echo ${aa}
运行
make expaa
结果
export aa=10
echo
方式三:单独定义一个文件,通过include引入
先include进来,然后export
.env
DEV=debug
makefile
include .env
export
test_include:
echo $$DEV
运行
make test_include
结果
echo $$DEV // 或者 echo ${DEV}
debug
@
通常,make会把其要执行的命令行在命令执行前输出到屏幕上。当我们用“@”字符在命令行前,那么,这个命令将不被make显示出来,最具代表性的例子是,我们用这个功能来向屏幕显示一些信息
加@前
testat:
echo "hello,makefile"
结果
echo "hello,makefile"
hello,makefile
加@后
testat:
@echo "hello,makefile"
结果
hello,makefile