makefile


概述

学习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

参考

[1]Makefile 文件的格式

[2]Makefile与export

[3]GNU make


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录